题目:超声波测距仪的设计超声波测距仪的设计一、设计目的:以51单片机为主控制器,利用超声波模块HC-SR04,设计出一套可在数码管上实时显示障碍物距离的超声波测距仪。通过该设计的制作,更为深入的了解51的工作原理,特别是51的中断系统及定时器/计数器的应用;掌握数码管动态扫描显示的方法和超声波传感器测距的原理及方法,学会搭建51的最小系统及一些简单外围电路(LED显示电路)。从中提高电路的实际设计、焊接、检错、排错能力,并学会仿真及软件调试的基本方法。二、设计要求:设计一个超声波测距仪。要求:1.能在数码管上实时显示障碍物的实际距离;2.所测距离大于2cm小于300cm,精度2mm。三、设计器材:STC89C52RC单片机HC-SR04超声波模块SM410561D3B四位的共阳数码管9014三极管(4)按键(1)电容(30PF2,10UF1)排阻(10K),万用板,电烙铁,万用表,5V直流稳压电源,镊子,钳子,导线及焊锡若干,电阻(200欧5)。四、设计原理及设计方案:(一)超声波测距原理超声测距仪是根据超声波遇到障碍物反射回来的特性进行测量的。超声波发射器向某一方向发射超声波,在发射同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即中断停止计时。通过不断检测产生波发射后遇到障碍物所反射的回波,从而测出发射超声波和接收到回波的时间差T,然后求出距离L。基本的测距公式为:L=(△t/2)*C式中L——要测的距离T——发射波和反射波之间的时间间隔C——超声波在空气中的声速,常温下取为344m/s声速确定后,只要测出超声波往返的时间,即可求得L。根据本次设计所要求的测量距离的范围及测量精度,我们选用的是HC-SR04超声波测距模块。(如下图所示)。此模块已将发射电路和接收电路集成好了,硬件上不必再自行设计繁复的发射及接收电路,软件上也无需再通过定时器产生40Khz的方波引起压电陶瓷共振从而产生超声波。在使用时,只要在控制端‘Trig’发一个大于15us宽度的高电平,就可以在接收端‘Echo’等待高电平输出。单片机一旦检测到有输出就打开定时器开始计时。当此口变为低电平时就停止计时并读出定时器的值,此值就为此次测距的时间,再根据传播速度方可算出障碍物的距离。(二)超声波测距模块HC-SR04简要介绍HC-SR04超声波测距模块的主要技术参数使用方法如下所述:1.主要技术参数:①使用电压:DC5V②静态电流:小于2mA③电平输出:高5V④电平输出:低0V⑤感应角度:不大于15度⑥探测距离:2cm-300cmHC-SR04超声波测距模块实物图⑦高精度:可达2mm2.接线方式:VCC、trig(控制端)、echo(接收端)、GND使用方法:给Trig端发一个15uS以上的高电平,就可以在接收口Echo端等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。3.工作原理:①采用IO触发测距,给至少10us的高电平信号(在我们的程序中我们为了确保有效触发,给了约持续15us时间宽度的高电平);②模块自动发送8个40khz的方波,自动检测是否有信号返回;③有信号返回,通过Echo输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(344M/S))/2;(三)总体设计方案:以51单片机作为主控制器,在超声波模块HC-SR04的‘Trig’端加一个大于10us的高电平,本次设计中我们为了确保有效触发,程序中设置了约为15us的高电平进行触发。触发发射端产生超声波,同时在接收端(‘Echo’端)等待高电平的输出,一旦检测到有高电平的输出就打开定时器0进行计时。根据所给超声波模块的技术资料可知:‘Echo’端高电平持续的时间就是超声波从发射到返回的时间。当超声波遇到障碍物,回波被接收端接收到后,‘Echo’端变为低电平。此时关闭定时器0(令TR=0),读出定时器的值。这个值即为超声波的传播时间(单位为us)。根据声波在空气中的传播速度,方可算出距离。【测试距离≈(高电平时间*声速(344M/S))/2】将此距离进行处理,在数码管上利用动态扫描法实时显示。系统的结构框图:我们将整个系统划分为:超声波模块、显示模块,以及51单片机外围工作电路模块。(四)动态显示模块:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。在本次设计中,我们选用P0口作为‘段码’,连接SM410561D3B‘a,b,c,d,e,f,g,dp’,每一段的亮灭。选用P2.4~P2.7分别对应‘位码’,即连STC89C52电源电路单片机外围电路超声波测试模块障碍物显示电路接SM410561的‘S1,S2,S3,S4’分别控制每一位的亮灭。‘S1,S2,S3,S4’相当于是每一段的COM端,由于是共阳极,只有某一位对应的COM端为‘1’时,所送的‘段码’对该端来说才是有效的。仿真电路图(五)硬件整体设计方案:我们在硬件设计上主要包括以下几个模块的设计:(六)软件设计方案:开始变量及定时器0初始化给Trig端20us的高电平进行触发等待Echo变高Echo=1?TR0=1打开定时器,开始计时等待Echo变低Echo=1?Flag=1?检测是否超过65msTR0=0停止计时,计算出传播时间timeTH0=0,TL0=0计算出传输距离SS是否超出检测范围调用Display()进行显示结束显示‘----’程序如下:#includeintrins.h#includereg52.h#defineuintunsignedint#defineucharunsignedcharucharqian,bai,shi,ge;//数码管显示千,百,十,个,单位为cmuinttime=0;//探测时间unsignedlongS=0;//探测距离,注意是长整型//ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,//0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共阳数码管ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};sbitecho=P3^7;//接收端sbittrig=P3^6;//发射端sbitSMG_q=P2^4;//定义数码管阳级控制脚(千位)sbitSMG_b=P2^5;//定义数码管阳级控制脚(百位)sbitSMG_s=P2^6;//定义数码管阳级控制脚(十位)sbitSMG_g=P2^7;//定义数码管阳级控制脚(个位)ucharflag,a;//标志位/*函数名称:init()**输入参数:void**输出参数:void**函数功能:初始化超声波测距仪,定时器,中断*/voidinit(){echo=0;trig=0;flag=1;qian=10;bai=10;shi=10;ge=10;//数码管显示----TMOD=0x01;//设T0为方式1TH0=0;TL0=0;ET0=1;//允许T0中断TR0=0;EA=1;//开启总中断}/*函数名称:delay()**输入参数:unsignedcharcnt**输出参数:void**函数功能:延时函数*/voiddelay(unsignedcharcnt)//大约延时2*cnt微妙{while(--cnt);}/*函数名称:display()**输入参数:ucharqian,ucharbai,ucharshi,ucharge**输出参数:void**函数功能:数码管显示模块*/voiddisplay(ucharqian,ucharbai,ucharshi,ucharge){SMG_q=1;//选择千位数码管P0=table[qian];//查找1定义好的数码管段值与P0口输出,显示相应的1delay(100);//加入短暂延时P0=0XFF;//清除数码管显示,因是共阳型,所以不是0SMG_q=0;//关闭千位数码管SMG_b=1;//选择百位数码管P0=table[bai];//查找2定义好的数码管段值与P0口输出,显示相应的2delay(100);//加入短暂延时P0=0XFF;//清除数码管显示,因是共阳型,所以不是0SMG_b=0;//关闭百位数码管SMG_s=1;//选择十位数码管P0=table[shi]&0x7f;//查找2定义好的数码管段值与P0口输出,显示相应的2delay(100);//加入短暂延时P0=0XFF;//清除数码管显示,因是共阳型,所以不是0SMG_s=0;//关闭十位数码管SMG_g=1;//选择个位数码管P0=table[ge];//查找2定义好的数码管段值与P0口输出,显示相应的2delay(100);//加入短暂延时P0=0XFF;//清除数码管显示,因是共阳型,所以不是0SMG_g=0;//关闭个位数码管}/*函数名称:startmodule()**输入参数:void**输出参数:void**函数功能:超声波测距仪触发模块*/voidstartmodule(){trig=1;//15us启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();trig=0;delay(10);}/*函数名称:main()**输入参数:void**输出参数:void**函数功能:控制模块*/voidmain(){init();//初始化子程序while(1){startmodule();while(!echo)//起始为0,当为1时,开始计时;TR0=1;//开启计数while(echo&&flag);//当echo为1计数并等待//flag标志位,当检测超过65ms退出等待回波,继续下一次检测time=(TH0*256+TL0)*(12/11.0592);TR0=0;//停止计时TH0=0;TL0=0;//关闭计数S=(time*17.4)/100;//算出来是mm,注意程序按mm处理显示的时候在十位加小数点,则以cm为单位显示且精度小于1cmif((S1)||(S4500)||(flag==0))//大于1cm小于3m超出测量范围显示'----'{flag=1;qian=10;bai=10;shi=10;ge=10;}else{qian=S/1000;bai=S/100%10;shi=S%100/10;ge=S%10;}for(a=0;a100;a++){display(qian,bai,shi,ge);}//扫描100次数码管,进行显示}}voidtimer0()interrupt1{TH0=0;TL0=0;flag=0;//标志位,当检测超过65ms退出等待回波,继续下一次检测,非常必要}五、设计中遇到的问题及解决办法:(1)在课程设计初期,我们组在一个现成的电路板(