1、闽南理工学院设计报告基于单片机的超声波测距系统设计 系 别 电子与电气工程系 专 业 电子信息工程 班 级 学 号 姓 名 指导教师 完成时间 评定成绩 目 录1 绪论32 超声波测距系统方案设计33 超声波测距硬件电路设计64 超声波测距软件设计105 实验调试156 总结与展望16参考文献17附录 (可选择)18附录A 系统原理图18附录B超声波测距系统焊接组装图19附录C 部分源程序19 1 绪论超声波是指频率在 20kHz106kHz的机械波,波速一般为 1500m/s,波长为 0.01cm10cm。超声波既是一种波动形式 ,又是一种能量形式 ,在传播过程中与媒介相互作用产生超声效应。
2、随着科学技术的发展 ,相关技术领域相互渗透 ,使超声波技术广泛应用于工业、化工、医学、石油化工等许多领域。迄今为止,国内外许多学者均着眼于测距传感器的研究。通常的倒车雷达主要由感应器、主机、显示设备等三部分组成。感应器发出和接受超声波信号,并将接收到的信号传输到主机,再通过显示设备显示出来。感应器装在后保险杠上,以角45辐射,检查目标,能探索到那些低于保险杠而司机从后窗又难以看见的障碍物并报警,显示设备装在仪表板上,提醒驾驶员汽车据后面物体还有多少距离,到危险距离时,蜂鸣器就开始鸣叫,提示司机停车。根据感应器种类不同,倒车雷达可分为粘贴式、钻孔式和悬挂式等种。转帖式感应器后有一层胶,可直接粘在
3、后保险杠上:钻孔式感应器是在保险杠上钻一个洞,然后把感应器嵌进去:悬挂式感应器主要用于载货车。根据显示设备种类不同,倒车雷达又可以分为数字式、颜色式和蜂鸣式等三种。数字式显示设备是一只如传呼机大小的盒子,安装在驾驶台上,直接用数字表示汽车与后面物体的距离,并可精确到1厘米,让驾驶员一目了然。经过几年的发展,倒车雷达系统已经过了数代的技术改良,不管从结构外观上,还是从性能价格上,这几代产品都各有特点,目前使用较多的是数码显示、荧屏显示和魔幻镜倒车雷达这3种。2 超声波测距系统方案设计超声波测距的方法有多种,如相位检测法、声波幅值检测法和渡越时间检测法等。相位检测法虽然精度高,但检测范围有限; 声
4、波幅值检测法易受反射波的影响。本测距系统采用超声波渡越时间检测法。其原理为: 检测从超声波发射器发出的超声波,经气体介质的传播到接收器的时间,即渡越时间。渡越时间与气体中的声速相乘,就是声波传输的距离。超声波发射器向某一方向发射超声波,在发射时刻的同时单片机开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。再由单机计算出距离,送LED数 码管显示测量结果。超声波在相同的传播媒体里 (大气条件) 传播速度相同, 即在相当大的频率范围内声速不随频率变化, 波动的传播方向与振动方向一致, 是纵向振动的弹性机械波, 它是借助于传播介质的分子运动而传播的,
5、波动方程描述方法与电磁波是类似的。式中, A (x ) 为振幅, A 0 为常数, 为圆频率, t 为时间, x 为传播距离, k= 2/为波数, 为波长, 为衰减系数。衰减系数与声波所在介质及频率的关系为=af2 (3)式中, a 为介质常数, f 为振动频率。在空气里, a =210- 13 s2/cm, 当振动的声波频率f = 40kHz (超声波) 代入式(3) 可得 a = 3.210-4 cm-1 , 即1/= 31m;若f = 30 kHz, 则1/= 56m。它的物理意义是: 声波在空气媒质里传播, 因空气分子运动摩擦等原因, 能量被吸收损耗。在 (1/) 长度上, 平面声波的
6、振幅衰减为原来的e 分之一, 由此可以看出, 频率越高, 衰减得越厉害, 传播的距离也越短。考虑实际工程测量要求,在设计超声波测距仪时, 选用频率f = 40kHz 的超声波, 波长为34000/40000=0.85cm。超声波发射器向某一方向发射超声波,时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到发射波就立即停止计时。超声波在空气中的传播速度随温度变化,其对应值如表2-1 。 表2-1 声速与温度的关系温度()3020100102030100声速(m/s)313319325323338344349386根据计时器记录的时间,发射点距障碍物的距离,如图2-1所示
7、 图2-1 超声波测距原理图2中被测距离为H,两探头中心距离的一半用M表示,超声波单程所走过的距离用表示,由图可得: (1) (2)将式(2)带入式(1)得: (3)在整个传播过程中,超声波所走过的距离为: (4)式中:为超声波的传播速度,为传播时间,即为超声波从发射到接收的时间。将式(4)带入式(3)可得: (5)当被测距离H远远大于M时,式(5)变为: (6)这就是所谓的时间差测距法。首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离2。由于是利用超声波测距,要测量预期的距离,所以产生的超声波要有一定的功率和合理的频率才能达到预定的传播距
8、离,同时这是得到足够的回波功率的必要条件,只有得到足够的回波频率,接收电路才能检测到回波信号和防止外界干扰信号的干扰。经分析和大量实验表明,频率为40左右的超声波在空气中传播效果最佳,同时为了处理方便,发射的超声波被调制成具有一定间隔的调制脉冲波信号。 图2-2 超声波测距时序图3 超声波测距硬件电路设计3.3.1 超声波测距单片机系统超声波测距单片机系统主要由:AT89S51单片机、晶振、复位电路、电源滤波部份构成。由K1,K2组成测距系统的按键电路。用于设定超声波测距报警值。如图3-3。图3-3:超声波测距单片机系统3.3.2 超声波发射、接收电路超声波发射如图3-4,接收电路如图3-5。
9、超声波发射电路由电阻R1、三极管BG1、超声波脉冲变压器B及超声波发送头T40构成,超声波脉冲变压器,在这里的作用是提高加载到超声波发送头两产端的电压,以提高超声波的发射功率,从而提高测量距离。接收电路由BG1、BG2组成的两组三级管放大电路构成;超声波的检波电路、比较整形电路由C7、D1、D2及BG3组成。40kHz的方波由AT89S51单片机的P2.7输出,经BG1推动超声波脉冲变压器,在脉冲变压器次级形成60VPP的电压,加载到超声波发送头上,驱动超声波发射头发射超声波。发送出的超声波,遇到障碍物后,产生回波,反射回来的回波由超声波接收头接收到。由于声波在空气中传播时衰减,所以接收到的波
10、形幅值较低,经接收电路放大,整形,最后输出一负跳变,输入单片机的P3脚。图3-4:超声波测距发送单元该测距电路的40kHz方波信号由单片机AT89S51的P2.7发出。方波的周期为1/40ms,即25s,半周期为12.5s。每隔半周期时间,让方波输出脚的电平取反,便可产生40kHz方波。由于单片机系统的晶振为12M晶振,因而单片机的时间分辨率是1s,所以只能产生半周期为12s或13s的方波信号,频率分别为41.67kHz和38.46kHz。本系统在编程时选用了后者,让单片机产生约38.46kHz的方波。图3-5:超声波测距接收单元由于反射回来的超声波信号非常微弱,所以接收电路需要将其进行放大。
11、接收电路如图3-5所示。接收到的信号加到BG1、BG2组成的两级放大器上进行放大。每级放大器的放大倍数为70倍。放大的信号通过检波电路得到解调后的信号,即把多个脉冲波解调成多个大脉冲波。这里使用的是I N 4148检波二极管,输出的直流信号即两二极管之间电容电压。该接收电路结构简单,性能较好,制作难度小。3.3.3显示电路本系统采用三位一体L E D 数码管显示所测距离值,如图3-6。数码管采用动态扫描显示,段码输出端口为单片机的P2口,位码输出端口分别为单片机的P3.4、P3.2、P3.3口,数码管位驱运用PNP三极管S9012三极管驱动。图3-6:显示单元图 显示电路的调试:目的是使LED
12、数码管显示器能正常显示09的数字。按照电路连接好电路,然后插上单片机仿真器,将下面的串行口显示程序运行,能看到三个显示器轮流显示09.3.3.4 供电电路本测距系统由于采用的是LED数码管用为显示方式,正常工作时,系统工作电流约为30-45mA,为保证系统统计的可靠正常工作,系统的供电方式主要交流AC6-9伏,同时为调试系统方便,供电方式考虑了第二种方式,即由USB口供电,调试时直接由电脑USB口供电。6伏交流是经过整流二极管D1-D4整流成脉动直流后,经虑波电容C1虑波后形成直流电,为保证单片机系统的可电,供电路中由5伏的三端稳压集成电路进行稳压后输出5伏的直流电供整个系统用电,为进一步提高
13、电源质量,5伏的直流电再次经过C3、C4滤波。图3-7:供电单元电路图3.3.5报警输出电路报警信号由单片机P3.1端口输出,继电器输出,可驱动较大的负载,电路由电阻R6、三极管BG9、继电器JDQ组成,当测量值低于事先设定的报警值时,继电器吸合,测量值高于设定的报警值时,继电器断开。报警输出电路如图3-8。图3-8 报警输出电路4 超声波测距软件设计4.1 主程序设计超声波测距的软件设计主要由主程序、超声波发生子程序、超声波接收程序及显示子程序组成。超声波测距的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),所以控制程序可采用C语言编程。主程序首先是对系统环境
14、初始化,设定时器0为计数,设定时器1定时。置位总中断允许位EA。进行程序主程序后,进行定时测距判断,当测距标志位ec=1时,测量一次,程序设计中,超声波测距频度是4-5次/秒。测距间隔中,整个程序主要进行循环显示测量结果。当调用超声波测距子程序后,首先由单片机产生4个频率为38.46kHz超声波脉冲,加载的超声波发送头上。超声波头发送完送超声波后,立即启动内部计时器T0进行计时,为了避免超声波从发射头直接传送到接收头引起的直射波触发,这时,单片机需要延时约1.5 -2ms时间(这也就是超声波测距仪会有一个最小可测距离的原因,称之为盲区值)后,才启动对单片机P3.5脚的电平判断程序。当检测到P3
15、.5脚的电平由高转为低电平时,立即停止T0计时。由于采用单片机采用的是12 MHz的晶振,计时器每计一个数就是1s,当超声波测距子程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按式(2)计算,即可得被测物体与测距仪之间的距离。设计时取15时的声速为340 m/s则有:d=(ct)/2=172T0/10000cm其中,T0为计数器T0的计算值。测出距离后结果将以十进制BCD码方式送往LED显示约0.5s,然后再发超声波脉冲重复测量过程。4.2 超声波测距子程序 void wdzh()TR0=0;TH1=0x00;TL1=0x00;csbint=1;sx=0;delay
16、(1700);csbfs();csbout=1;TR1=1;i=yzsj;while(i-)i=0;while(csbint)/判断接收回路是否收到超声波的回波i+;if(i=3300)csbint=0;TR1=0;s=TH1;s=s*256+TL1;TR0=1;csbint=1;jsz=s*csbc;/计算测量结果jsz=jsz/2; 产生超声波的子程序:为了方便程序移置及准确产生超声波信号,本测距的超声波产生程序是用汇编语言编写的进退声波产生程序。产生的超声波个数为UCSBFS SEGMENT CODERSEG UCSBFSPUBLIC CSBFSCSBFS:mov R6,#8h ;超声波
17、发射的完整波形个数:共计四个 here:cpl p2.7 ;输出40kHz方波 nop nop nop nop nop nop nop nop nop djnz R6,here RETEND4.3 超声波测距程序流程图 YYN=N0=0=1开始初始化测量标志启动定时器超声波测距距离上限值距离盲区值=显示值= C C C显示值= - - -测量段码转换显示设定段码转换距离报警值=报警输出=N4.4 超声波测距程子序流程图Y标志=1?发送超声波延时避开盲区收到回波否?预设时间?启动计时器T0停止计时计算测量值超声波测距结束NNYYN5 实验调试5.1.1软件调试建立源程序,在计算机上,利用KILE
18、软件对第一步输入的源程序进行编译,变为可执行的目标代码,动态在线调试。在软件编写过程中经常会出现程序语法错误,导致程序编写过程错误,无法编译。解决方法:通过计算机开发系统的编辑软件,按照所要求的格式、语法规定、源程序输入到开发系统中,并存在磁盘上。在计算机上,利用KILE软件对第一步输入的源程序进行编译,变为可执行的目标代码。如果源程序有语法错误,则其错误将显示出来,然后返回到第一步进行修改,再进行编译,直到语法错误全部纠正为止5.1.2 硬件调试 确认个元件后,将原件安装完毕,将写好程序的AT89S51机装到测距板上,通电后将测距板的超声波头对着墙面往复移动,看数码管的显示结果会不会变化,在
19、测量范围内能否正常显示。如果一直显示“- - -”,则需将下限值增大。本测距板1s测量4-5次,超声波发送功率较大时,测量距离远,则相应的下限值(盲区)应设置为高值。在硬件安装过程中,经常讲元件接反和及相关引脚没有接到正确的地方。 解决方法:系统上电之前,先用万用表等工具,根据硬件逻辑设计图,仔细检查线路是否连接正确,并核对元器件的型号、规格和安装是否符合要求,应特别注意电源系统的检查,以防止电源的短路和极性错误,并重点检查系统总线是否存在相互之间短路或与其它信号线的短路。6 总结与展望经过为期三周的基于单片机的超声波测距系统的课程设计,顺利的完成系统设计任务,在本次设计中,我们充分了解了各环
20、节设计理论知识和实践操作各个环节。本次设计中,我们用到了以前学到的很多知识,比如电工、单片机、和汇编语言等。这使我们意识到,任何一件产品的产生,都不是单一知识所能实现的。而且在电路的设计和程序的编制过程中,出现了很多意想不到的错误,让我们措手不及,有些甚至是一些非常低级的错误,但是这些错误也同样让我们获益非浅,它使我们意识到,研究是一个非常严肃的过程,来不得半点马虎。必须有一个严谨的态度,加上100的努力才有可能获得成功的喜悦。 总之,在本课题的设计过程中尽管走了很多的弯路,但是还是学到了不少知识,从中受益匪浅。了解了超声波传感器的原理,学会了各种放大电路的分析、设计,也掌握了单片机的开发过程
21、中所用到的开发方法和工具。动手能力与自学能力得到了锻炼与提高,对待事物的态度也发生了变化。理论总是离不开实践的,设计制作过程中,盲目地追寻理论知识根本不足以解决任何问题,一味的死研究课本是不会真正掌握单片机的。只有真正动手去做才能发现问题,解决问题,提高能力 参考文献1. 李全利单片机原理及接口技术(第二版北京:高等教育出版社,2009年。2. 李建忠单片机原理及应用(第二版)西安:西安电子科技大学出版社,2008。3. 冯文旭等单片机原理及应用北京:机械工业出版社,2008。4. 李广弟等单片机基础(第3版) 北京:北京航空航天大学出版社,2007。5. 何立民单片机高级教程:应用与设计(第
22、2版) 北京:北京航空航天大学出版社,2007。6. 谢自美电子线路设计实验测试M武汉:华中理工大学出版社, 1992.7. 何立民单片机应用系统设计M北京:北京航空航天大学出版社, 1993.8. 李光才单片机课程设计实例指导M北京:北京航空航天大学出版社, 2004附录 (可选择) 附录A 系统原理图23附录B 超声波测距系统焊接组装图附录C 部分源程序#include #include #define uchar unsigned char#define uint unsigned int#define k1 P3_7 /k1功能键#define k2 P3_6 /k2数值调整键#def
23、ine bjh P3_1 /定值输出#define sx P0_2 /报警值输出(声音)#define csbout P2_7 /超声波发送#define csbint P3_5 /超声波接收uchar ec,cls;cs;xl,mq,xm0,xm1,xm2,sec20,sec,sec1,buffer3,BitCounter,temp,Number8=1,2,3,4,5,6,7,8; uchar temp1,convert10=0x81,0xED,0xA2,0xA8,0xCC,0x98,0x90,0xAD,0x80,0x88;/09段码uint zzz,dz,zzbl,i,jsz,yzsj,k
24、k,s,ss;static uchar bdata ke,kw; /可位寻址的状态寄存器float csbc,wdz;sbit LED1 = P34;/数码管位驱动sbit LED2 = P32;/数码管位驱动sbit LED3 = P33;/数码管位驱动sbit k11=ke0;sbit k12=ke1;sbit k22=ke2;sbit k21=ke3;sbit b=ke4;sbit c=ke5;sbit d=ke6;sbit e=ke7;sbit w=kw0;sbit zj1=kw1;sbit zj2=kw2;void delay(i);/延时函数void scanLED();/显示函数
25、void timeToBuffer();/显示转换函数void time();void jpcl();void jy();void wdzh();void bgcl();void jpzcx();void mqjs();void csbfs();void csbsc();void clcs();void offmsd();void main()EA=1; /开中断 TMOD=0x11; /设定时器0为计数,设定时器1定时ET0=1; /定时器0中断允许 TH0=0xD8;TL0=0xF0;/设定时值为20000us(20ms)TR0=1;csbout=1;d=0;TR1=0; temp1=15
26、;zzz=699;mq=40; dz=100;cls=5;xl=temp1; csbsc();mqjs(); /盲区设定k12=1;k1=1;k2=1;k22=1;bjh=1;d=1;sx=0;clcs(); /测量次数while(1)if (ec=1) ec=0;wdzh(); /调用超声波测量bgcl(); /调用报警处理程序timeToBuffer();/调用转换段码功能模块offmsd(); /调用显示转换程序 scanLED(); /调用显示函数if(jszzzz)buffer0=0x93;buffer1=0x93;buffer2=0x93;else if (jsz=cs) / 50
27、 * 10 ms = 0.5 s sec20=0;ec+;e=e; if (ec3) ec=0; sec1+;if (sec1100) sec1=0; sec+; /秒计时 if (sec=3) sec=0; void jpcl() /按键处理程序k11=k1;if (!k12&k11) b=1;k12=k11;k11=k1;k21=k2;if (b=1) sx=0;while(b)buffer0=0x84;buffer1=0x84;buffer2=0x84;sec=0;c=0;while(!c)if (sec=2)c=1;scanLED();c=0;zzbl=jsz;jsz=dz;timeT
28、oBuffer();jpzcx();dz=kk; if (dz699) dz=200;if (dz6) xm0=0; if (e=1)buffer2=0xFF;else buffer2=convertxm0;scanLED();if (!k12&k11) c=1;k22=k21;k12=k11;buffer2=convertxm0;c=0;while(!c)k11=k1; k21=k2;if (!k22&k21) xm1+;if (xm19)xm1=0;if (e=1)buffer1=0xFF;else buffer1=convertxm1;scanLED();if (!k12&k11) c=
29、1;k22=k21;k12=k11;buffer1=convertxm1;c=0;while(!c)k11=k1; k21=k2;if (!k22&k21) xm2+;if (xm29)xm2=0;if (e=1)buffer0=0xFF;else buffer0=convertxm2;scanLED();if (!k12&k11) c=1;b=0;kk=xm0*100+xm1*10+xm2;k22=k21;k12=k11;void wdzh()TR0=0;TH1=0x00;TL1=0x00;csbint=1;sx=0;delay(1700);csbfs();csbout=1;TR1=1;i=
30、yzsj;while(i-)i=0;while(csbint)/判断接收回路是否收到超声波的回波i+;if(i=3300)csbint=0;TR1=0;s=TH1;s=s*256+TL1;TR0=1;csbint=1;jsz=s*csbc;/计算测量结果jsz=jsz/2; void bgcl()if (jszdz)bjh=0;elsebjh=1;void mqjs()yzsj=260;void csbsc()csbc=0.034;void clcs() cs=100/4; /测量2次/秒void offmsd() /百位为数0判断模块 if (buffer2=0x81) /如果值为零时百位不显示 buffer2 = 0xff;