1、0单片机原理与接口技术课程设计题目名称: 简易超声波测距仪 专业班级: 测控 1101 班 学生姓名: 学 号: 指导教师: 成绩:评语:指导老师签名:日期:1目 录引言 4第一章 绪论1.1 超声波测量原理 41.2 系统概述 4第二章 设计方案与论证2.1 超声波测距模块 52.2 供电模块 52.3 显示模块 52.4 测温模块 6第三章 硬件设计3.1 系统原理方框图 .63.2 主电路图 73.3 I/O 口分配 .73.4 元器件选型 83.4.1 主控制芯片 MSP430G2553 .83.4.2 HC-SR04 超声波模块 .83.4.3 温度传感器 DS18B20 .93.4
2、.4 稳压芯片 LM1117 .93.4.5 5110 液晶显示 .10第四章 软件设计24.1 主流程图及介绍 11第五章 系统调试5.1 测距调试 .12第六章 设计心得 12参考文献 .14附录 1:源程序 .15附录 2:相关照片 .283引言:设计一个超声波测距仪,可应用于汽车倒车、 建筑施工工地以及一些工业现场的位置监控, 也可用于如液位、 井深、 管道长度的测量、 移动机器人、安全线提示, 银行及取款机的一米线提示等场合。要求测量范围在 0.204.00m, 测量精度 1cm, 测量时与被测物体无直接接触, 能够清晰稳定地显示测量结果。第 1 章 绪论1.1 超声波测量原理超声波
3、为直线传播方式,频率高,反射能力强;在空气中传播速度为 340m/s, 容易控制;受环境影响小,因此采用超生波传感器作为距离探测的“ 眼睛“。用于测距领域的超声波频率为 20kHz 400kHz 的频段,空气介质中常用为 40kHz。避障系统的超声波测距通常运用超声波的反射原理,采用渡越时间法,通过测量超声波发射到返回之间的时间间隔来计算距离。由于时间长度与声音通过的距离成正比关系,当发射超声波传感器发出一个短暂的脉冲波时,记时开始;当接收超声波传感器接收到第一个回波脉冲后,计时立即停止。此时,记录得到的时间值为 t,那么从超声波发射位置到障碍物之间的实际距离就可按下式求得。L=ct/2 (I
4、)式(I)中:L 为超声波发射位置到障碍物之间的实际距离;t 为超声波发生器发出超声波到接收到超声波的时间间隔。1.2 系统概述此系统为一个简易超声波测距仪,测量 4m 以内的距离。它以 MSP430G2553为中心控制器,由测距、显示、供电、以及测温部分组成。测距部分采用 HC-SR04 模块,显示部分为 5110 液晶显示。系统由两块串联到一起的手机电池供电,通过两个 1117 稳压芯片把电压转换成 5v 和 3.3v 给各个模块供电。DS18B20 芯片首先测得当前温度,对于超声波测距进行校正,并和温度值一起在 5110 液晶上进行显示。还可以通过两个按键锁定和解锁液晶。完成对于距离的测
5、量。考虑到这是一个便携式的设备,系统要尽可能的简化电路以减少功耗。程序设计也尽可能的减少硬件的工作次数,比如较为复杂温度的测量就是每隔30s 刷新一次。不仅如此系统的大小还得考虑,合理的安排元件的位置,以减4少板子的大小。第 2 章 设计方案与论证2.1 超声波测距模块方案一:按照电路图手工焊接相关电路。优点:可以合理安排零件的位置,减少系统的大小。缺点:调试难度大,并且精度没有保证。最后不予考虑。方案二:使用超声波模块 KS103。测距最大距离 8 米,盲区为最小 1cm 之内。测量精度平均 3mm,最高达 1mm.而且相当灵敏。具有目前其他同类超声波模块产品所无法达到的性能优势和质量保障。
6、测量距离,温度,光强,三合一功能 。但是缺点是价格太高,不予考虑。方案三:使用超声波模块 HC-SR04 模块。模块特点:HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。综合价格、大小、精度等各方面因素,系统最后选择此模块座位测距模块。2.2 供电模块方案一:使用若干节五号干电池供电。由于直流升压芯片相比降压来说要少,并且在稳压过程中的损耗比降压要大,所以需要 5v 以上的电压供电。干电池每节1.5v,也就是说需要 4 节干电池。体积较大,并且不能充电,所以不采用此方案。方案二:使用手机电池供电
7、。手机电池为锂电池,电量大,体积小。要达到 5v 以上电压只需两块电池串联。并且还可以充电,便于循环使用。两块手机电池串联之后实际电压为 8.4v,1117 稳压芯片也很便宜。经过两级降压分别输出 5v 和3.3v 的电压。本系统就是采用这个方案。2.3 显示模块方案一:51602 液晶显示屏,可以显示两排数字以及字符。但是它所占用的引脚太多,除去供电引脚外还需 12 个引脚。MSP430G2 只有组 8 位 I/O 口,所以 1602 不予考虑。方案二:5110 液晶显示屏可以显示 15*6 个数字或字符,并且还能显示汉字。除去电源引脚外只需占用 5 个 I/O 口即可工作,所以本系统采用此
8、液晶显示。2.4 测温模块方案一:使用热电阻组成电桥电路,将温度转换成电压值,经过单片机内部的 AD 转换电路变成数字量。但是电桥电路的平衡由于存在各种漂移不容易调整,并且电桥持续工作浪费电量,不符合便携式的设计要求,综上不予考虑此方案。方案二:数字化芯片 DS18B20 温度传感器,控制较为简单,并且只需占用一个引脚。集成程度高,休眠时的功率也很小。精度为 0.5 摄氏度。满足本系统的设计要求。第 3 章 硬件设计3.1 系统原理方框图6图 3-1 系统原理方框图3.2 主电路图图 3-2 主电路图3.3 I/O 口分配P1.0 接 DS18B20,P1.1 和 P1.2分别接 HC-RS0
9、4 的 Trig 和 Echo 引脚。P1.3 P1.4 接两个按钮。P1.7 P1.6 P2.5 P2.4 P2.3 接5110 液晶显示屏7图 3-3 单片机 I/O 口分配图3.4 元器件选型3.4.1 主控制芯片 MSP430G2553MSP430G2 系列是德州仪器推出的一款产品, 在秉承 MSP430 超低功耗, 高集成度的优点的同时,具有高性价比的特点MSP430 单片机片上外围模块: 16MHz 主频 16 位 CPU 片上程序存储器 FLASH(512B/1KB/2KB/4KB/8KB/16KB)及 FLASH 控制器 片上随机存储器 SRAM(128B/256B/512B)
10、 通用并行输入输出端口 GPIO(4 位/16 位/20 位/24 位) 支持电容触摸式 I/O 看门狗定时器 WDT 上电复位模块 BOR 多功能通信模块 USI(I2C/SPI)USIC_A(UART/LIN/IrDA/SPI) USIC_B(I2C8(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;(3)有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S)/2。图 3-4 HC-SR04 模块原理图3.4.3 温度传感器 DS18B20独特的一线接口,只需要一条口线通信 多点
11、能力,简化了分布式温度传感应用 无需外部元件 可用数据总线供电,电压范围为 3.0 V至 5.5 V 无需备用电源 测量温度范围为-55 C 至+125 。 -10 C 至+85 C 范围内精度为0.5 C。温度传感器可编程的分辨率为 912 位,温度转换为 12 位数字格式最大值为 750 毫秒,用户可定义的非易失性温度报警设置。由于 DS18B20 是一条口线通信,所以中央微处理器与 DS18B20 只有一个一条口线连接。为读写以及温度转换可以从数据线本身获得能量,不需要外接电源。 因为每一个 DS18B20 的包含一个独特的序号,多个 ds18b20s 可以同时存在于 图 3-5 DS1
12、8B20 接线图1 条总线。这使得温度传感器放置在许多不同的2 条地方。 93.4.4 稳压芯片 LM1117AMS1117 是一个正向低压降稳压器,在 1A 电流下压降为 1.2V。AMS1117 有两个版本:固定输出版本和可调版本,固定输出电压为1.5V、1.8V、2.5V、2.85V、3.0V、3.3V、5.0V,具有 1的精度;固定输出电压为 1.2V 的精度为 2%。AMS1117 内部集成过热保护和限流电路,是电池供电和便携式计算机的最佳选择。图 3-6 1117 稳压模块原理模块3.4.5 5110 液晶显示该模块具有以下特点:1、84x48 的点阵 LCD,可以显示 4 行汉字
13、,2、采用串行接口与主处理器进行通信,接口信号线数量大幅度减少,包括电源和地在内的信号线仅有 9 条。支持多种串行通信协议(如 AVR 单片机的I、MCS51 的串口模式等) ,传输速率高达 4Mbps,可全速写入显示数据。3、可通过导电胶连接模块与印制版,而不用连接电缆,用模块上的金属钩可将模块固定到印制板上,因而非常便于安装和更换。4、LCD 控制器驱动器芯片已绑定到 LCD 晶片上,模块的体积很小。5、采用低电压供电,正常显示时的工作电流在 200A 以下,且具有掉电模式10图 3-7 5110 原理图第 4 章 软件设计4.1 主流程图及介绍图 4-1 系统软件流程图11程序初始化之后
14、,首先由 DS18B20 为温度赋初值。之后 HC-SR04 模块开始测距,测距时使用的定时器 T0 为模块返回的高脉冲计时,按模块的设计要求,计算出脉冲宽度即可得到声波反射所需时间。得出时间后代入公式测试:距离=(高电平时间*声速(340M/S)/2。并且此时的声速已经经过了温度矫正,以减少误差。与此同时定时器 T1 一直在定时,每隔 50ms 就会产生一次中断,在中断程序中标志位每次加 1,当标志位加到 600 时,即一共 30s 时,程序就会刷新温度值。在 5110 液晶上显示的为距离值,单位 cm,以及温度值。当按键 1 按下时,触发中断改变标志位,使得液晶锁屏。按键 2 按下时触发中
15、断解锁屏幕。由于超声波计数和温度测量时的程序不允许打断,在这两项进行的时候全局中断关闭,防止打断程序影响结果。第五章 系统调试5.1 测距调试首先将 HC-SR04 模块固定,前方放置一个长直尺,单片机中烧入测距程序并循环此程序。在循环开始处设置断点,通过 CCS 软件自带的单步执行功能在电脑上显示出测距值,并于直尺上的数值进行对照。在 3cm 之内时测量实际值/cm0.5 1 1.5 2.0 2.5 3.0 3.5测量值/cm无结果 2.4 左右2.0 2.2 2.4 3.1 3.7表 5-1 近距离系统测试结果(在 3cm 之内的程序略有不同,对于数值的显示精确度进行了修改)在 3cm 之
16、外的测量实际值/cm5 10 15 20 30 40 50 60测量 4 9 14 20 29 40 50 5912值/cm表 5-2 远距离系统测试结果通过结果可得在 2cm 之内时,测距值精确度不高,因为盲区的影响不能实现近距测量。但是 3cm 之后的测量比较准确,基本可以实现设计要求。第 6 章 设计心得通过此次课程设计首先我学习 HC-SR04 超声波测距模块的使用方法,也了解了很多超声波的应用以及测距的发展历史。另外 DS18B20 的使用是我对于串行口的数据输出、输入的常用格式有了一定的了解。其次对于 5110 液晶的学习使得以后再显示应用中有了更多的选择,不需要再进行繁琐的数码管
17、焊接,并且显示的效果也更好。当然对于其他电路,比如稳压电路也是一种复习。但是5110 的显示功能很强,这一次只用到了很少的一部分功能,以后还要继续研究学习。在这次设计工程中,查阅了许多关于便携式设备的资料,了解到当前便携式设备最主要考虑的一个问题就是功耗问题。由于不能随时充电,对于低功耗的设计就显得很重要。这方面的研究还有很大的前景等着我们去探索。本系统的芯片选型就考虑到了这方面的要求,芯片选型就是采用 TI 公司专门为这方面设计的单片机。不过这款单片机的真正功能在这个系统中并未很好的体现出来,对于它复杂的时钟系统以及各种休眠模式的应用并不多,以后可以继续改进程序。在制作、编程过程中我学习到细
18、节的重要性。焊接电路版的时候任何小的接线都会影响整个系统的正常运行。特别是在软件上,有时候一个符号的错误都会导致整个程序的混乱,所以下次制作一定要细心,减少这种事情的发生。总之,通过此次课程设计,不仅学习到了一些实际应用,也将我们的理论和实践相结合,取得了不少了收获。13参考文献【1】郭天祥. 51 单片机 C 语言教程入门、提高、开发、拓展全攻略. 电子工业出版社 2009【2】沈建华 杨艳琴 MSP430 系列 16 位低功耗原理与应用 清华大学出版社,2004【3】谭浩强. C 程序设计 (第二版) 清华大学出版社,2000【4】阎石. 数字电子技术基础 (第五版) 高等教育出版社 20
19、05【5】夏路易 石宗义.电路原理图与电路板设计教程 Protel 99SE 北京希14望电子出版社 2002【6】张迎新. 单片机微型计算机 原理、应用及接口技术 (第二版) 国防工业出版社 2009【7】康华光. 电子技术基础 模拟部分 (第五版) 高等教育出版社 2005【8】电子发烧网电子论坛15附录 1:源程序/*主程序函数*/#include #include “Display.h“#include “Distance.h“#include “Temperature.h“#define uint unsigned int#define uchar unsigned charint
20、T;uint distance_main,count;uchar style;void init()WDTCTL=WDTPW+WDTHOLD;if (CALBC1_1MHZ =0xFF | CALDCO_1MHZ = 0xFF)while(1);BCSCTL1 = CALBC1_1MHZ;DCOCTL = CALDCO_1MHZ;TA1CTL |= TASSEL_0+ MC_1 + TACLR;TA1CCR0 = 1637;TA1CCTL0 = CCIE; P1DIR|=BIT2;P1DIRTACTL|=TASSEL_1; P1DIRP1REN|=BIT3+BIT4;P1OUT|=BIT3+B
21、IT4;P1IES|=BIT3+BIT4;16P1DIR |= BIT6+BIT7; P2DIR |= BIT3+BIT4+BIT5;void main(void)init();LCD_init();T = Temperature();_EINT();while(1)distance_main = Distance();if(style)Display(distance_main,T);_delay_cycles(50000);#pragma vector=PORT1_VECTOR_interrupt void Port(void)_delay_cycles(10000);if(P1INif(
22、P1INP1IFG#pragma vector = TIMER1_A0_VECTOR _interrupt void Timer_A(void)count+;if(count600)T = Temperature();17count = 0;/*超声波测距函数*/#ifndef DISTANCE_H_#define DISTANCE_H_int Distance();#endif /* DISTANCE_H_ */#include #include “Distance.h“#define uint unsigned int#define uchar unsigned charint T;uin
23、t distance,times;int Distance()P1OUT|=BIT2;_delay_cycles(10);P1OUTwhile(!(P1INTACTL|=MC_2+TACLR;while(P1INTACTLtimes=TAR;distance=times*(332 + 0.607*T/10)/655.36;times=0;return distance;/*温度测量程序*/ #ifndef TEMPERATURE_H_18#define TEMPERATURE_H_#define uint unsigned int#define uchar unsigned char#defi
24、ne POUT P1DIR|=BIT0;#define PIN P1DIR#define P_1 P1OUT|=BIT0;#define P_0 P1OUTuchar Temperature_init(void);void Temperature_write(uchar data);uchar Temperature_read(void);int Temperature_main(void);int Temperature(void);#endif /* TEMPERATURE_H_ */#include #include “Temperature.h“#define uint unsigne
25、d int#define uchar unsigned charextern uint T;uchar Temperature_init(void)uchar i;POUT;P_0;_delay_cycles(600);P_1;_delay_cycles(60);if(P1INelsei=1;_delay_cycles(480);return i;void Temperature_write(uchar data)19uchar i;for(i=0;i=1uchar Temperature_read(void)uchar tem=0,i;for(i=0;i=1;POUT;P_0;P_1;PIN
26、;if(P1IN_delay_cycles(40);return tem;int Temperature_main(void)uchar T_L,T_H;int num=0;while(!Temperature_init();20Temperature_write(0xcc);Temperature_write(0x44);_delay_cycles(400);while(!Temperature_init();Temperature_write(0xcc);Temperature_write(0xbe);T_L=Temperature_read();T_H=Temperature_read(
27、);if(T_Hn-)T+=Temperature_main();_EINT();T=T/3;/*5110 液晶显示程序*/#define uint unsigned int#define uchar unsigned char#define DC_1 P2OUT|=BIT5;21#define DC_0 P2OUT#define CE_1 P1OUT|=BIT6;#define CE_0 P1OUT#define RST_1 P1OUT|=BIT7;#define RST_0 P1OUT#define SDIN_1 P2OUT|=BIT4;#define SDIN_0 P2OUT#defin
28、e SCLK_1 P2OUT|=BIT3;#define SCLK_0 P2OUTvoid LCD_write_byte(uchar data,uchar command);void LCD_set_XY(uchar X,uchar Y);void LCD_clear();void LCD_init();void LCD_write_char(uchar c);void LCD_write_Char(uchar X,uchar Y,uchar asc);void LCD_write_English_string(uchar X,uchar Y,char *s) ;void LCD_write_
29、nummber_1(uchar X,uchar Y,uint num);void LCD_write_nummber_2(uchar X,uchar Y,uint num);void Display(uint dis,int T);#endif /* DISPLAY_H_ */#include #include“Display.h“const uchar font6x86 = 0x00, 0x00, 0x00, 0x00, 0x06, 0x00 , / sp 32 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 , / ! 33 0x00, 0x00, 0x07, 0x0
30、0, 0x07, 0x00 , / “ 34 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 , / # 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 , / $ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 , / % 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 , / 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 , / 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 , / ? 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E
31、, / 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C , / A 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 , / B 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 , / C 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C , / D 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 , / E 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 , / F 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A , / G 0x00, 0x7
32、F, 0x08, 0x08, 0x08, 0x7F , / H 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 , / I 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 , / J 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 , / K 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 , / L 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F , / M 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F , / N 0x00, 0x3E, 0x41, 0x41
33、, 0x41, 0x3E , / O 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 , / P 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E , / Q 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 , / R23 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 , / S 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 , / T 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F , / U 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1
34、F , / V 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F , / W 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 , / X 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 , / Y 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 , / Z 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 , / 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 , / 55 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 , / 0x00, 0x
35、04, 0x02, 0x01, 0x02, 0x04 , / 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 , / _ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 , / 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 , / a 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 , / b 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 , / c 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F , / d 0x00, 0x38, 0x54, 0x54, 0
36、x54, 0x18 , / e 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 , / f 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C , / g 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 , / h 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 , / i 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 , / j 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 , / k 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 , /
37、 l 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 , / m 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 , / n 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 , / o 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 , / p 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC , / q 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 , / r 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 , / s 0x00, 0x04
38、, 0x3F, 0x44, 0x40, 0x20 , / t 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C , / u 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C , / v 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C , / w 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 , / x24 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C , / y 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 , / z 0x14, 0x14, 0x14, 0x1
39、4, 0x14, 0x14 / horiz lines;void LCD_write_byte(uchar data,uchar command) uchar i;CE_0;if(command=0)DC_0;elseDC_1;for(i=0;i0;i-)LCD_set_XY(X+(3-i)*6,Y); for (line=0; line0;i-)LCD_set_XY(X+(2-i)*6,Y); for (line=0; line6; line+)LCD_write_byte(font6x8ni-1line, 1);void Display(uint dis,int T)LCD_write_C
40、har(0,0,68);LCD_write_Char(6,0,105);LCD_write_Char(12,0,115);LCD_write_Char(18,0,116);LCD_write_Char(24,0,97);LCD_write_Char(30,0,110);LCD_write_Char(36,0,99);LCD_write_Char(42,0,101);LCD_write_Char(48,0,58);LCD_write_nummber_1(5,1,dis);LCD_write_Char(54,1,99);LCD_write_Char(60,1,109);LCD_write_Char(36,3,84);LCD_write_nummber_2(10,3,T);LCD_write_Char(72,3,32);LCD_write_Char(78,3,67);28附录 2:相关照片图 附-1 实际工作图29图 附-2 各模块图