超声波测距仪的设计.docx
《超声波测距仪的设计.docx》由会员分享,可在线阅读,更多相关《超声波测距仪的设计.docx(15页珍藏版)》请在冰豆网上搜索。
![超声波测距仪的设计.docx](https://file1.bdocx.com/fileroot1/2023-2/6/51648316-70e8-453b-81f6-aad2ffc0b900/51648316-70e8-453b-81f6-aad2ffc0b9001.gif)
超声波测距仪的设计
题目:
超声波测距仪的设计
超声波测距仪的设计
一、设计目的:
以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超声波测距模块实物图
⑦高精度:
可达2mm
2.接线方式:
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】 将此距离进行处理,在数码管上利用动态扫描法实时显示。
系统的结构框图:
STC89C52
电源电路
单片机外围电路
超声波测试模块
障碍物
显示电路
我们将整个系统划分为:
超声波模块、显示模块,以及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分别对应‘位码’,即连接SM410561的‘S1,S2,S3,S4’分别控制每一位的亮灭。
‘S1,S2,S3,S4’相当于是每一段的COM端,由于是共阳极,只有某一位对应的COM端为‘1’时,所送的‘段码’对该端来说才是有效的。
仿真电路图
(五)硬件整体设计方案:
我们在硬件设计上主要包括以下几个模块的设计:
(六)软件设计方案:
程序如下:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharqian,bai,shi,ge;//数码管显示千,百,十,个,单位为cm
uinttime=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为方式1
TH0=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口输出,显示相应的1
delay(100);//加入短暂延时
P0=0XFF;//清除数码管显示,因是共阳型,所以不是0
SMG_q=0;//关闭千位数码管
SMG_b=1;//选择百位数码管
P0=table[bai];//查找"2"定义好的数码管段值与P0口输出,显示相应的2
delay(100);//加入短暂延时
P0=0XFF;//清除数码管显示,因是共阳型,所以不是0
SMG_b=0;//关闭百位数码管
SMG_s=1;//选择十位数码管
P0=table[shi]&0x7f;//查找"2"定义好的数码管段值与P0口输出,显示相应的2
delay(100);//加入短暂延时
P0=0XFF;//清除数码管显示,因是共阳型,所以不是0
SMG_s=0;//关闭十位数码管
SMG_g=1;//选择个位数码管
P0=table[ge];//查找"2"定义好的数码管段值与P0口输出,显示相应的2
delay(100);//加入短暂延时
P0=0XFF;//清除数码管显示,因是共阳型,所以不是0
SMG_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为单位显示且精度小于1cm
if((S<1)||(S>4500)||(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;a<100;a++)
{
display(qian,bai,shi,ge);
}//扫描100次数码管,进行显示
}
}
voidtimer0()interrupt1
{
TH0=0;
TL0=0;
flag=0;//标志位,当检测超过65ms退出等待回波,继续下一次检测,非常必要
}
五、设计中遇到的问题及解决办法:
(1)在课程设计初期,我们组在一个现成的电路板(只有编码和位选与我们所要设计的作品的接法不同)上进行编写和调试程序。
于此同时,也开始在prteus中搭建电路:
我们选用P0口作为‘段码’,连接SM410561D3B‘a,b,c,d,e,f,g,dp’,每一段的亮灭。
选用P2.4~P2.7分别对应‘位码’,即连接SM410561的‘S1,S2,S3,S4’分别控制每一位的亮灭。
在程序初步完成,用proteus和keil进行仿真后,数码管却不能正常显示,千位只能在0和1之中跳变,无法出现其他数字。
经检查程序,发现计数初值的设置有问题,于是,经过反复调试,终于能使数码管在我们的设计范围内显示数字。
(2)在进行动态显示的时候延时是非常重要的。
延时太长,四位数码管的显示会有明显的闪烁感;延时太短,则有可能相邻几位显示同一个数码,因为时间太短还来不及变化,显示效果也很不理想。
经过我们仿真调试,不断修改程序中的延时,在仿真环境下,动态显示已很稳定。
(3)在电路板焊接完成后,我们将编写好的程序下载到单片机中,开始进行测试。
这时,问题又出现了:
数码管的每位的C段都不亮,而且个,十,百,千位的数据显示刚好相反。
前者先考虑是电路板上出现的问题,经用万用表检查电路,发现与C段相连的P0.2被短接。
修改好电路板后,C段正常显示,因宋英同学的认真细致,实际电路板上也就只出现了这一个问题。
而后者经分析,发现程序中的定义未能和电路板上的接口相对应,于是我们又修改了个,十,百,千位的定义。
至此,我们的作品设计成功了,整个过程很顺利。
六、设计心得体会和收获:
在这次试验中,我的主要工作是:
搭建电路板。
焊接电路。
兼职工作是帮王明友分析电路。
有些同学认为焊接电路是没有技巧的工作,没有什么含金量,锻炼不出自己的真实能力。
而我却不这么认为,在这项工作中,我还是学到了很多东西,我坚信这些知识是在课本当中学不到的,比如说;每个器件位置的合理安排,经过板子的每一条线的布置,让板子整体看起来比较美观,呈献给大家的是一个赏心悦目的板子。
硬件的完美是我们的终极目标,我们始终要坚信的是:
软件和硬件是相辅相成的。
软件的简洁,硬件的完美是成功的必需品。
这次课程设计我深深的体会了这点。
在整个板子的焊接过程中,每个结点的焊接必须做到谨慎小心,一不小心就会出现短路现象,在焊接过程当中,时刻准备用万用表来检测电路。
在这次的焊接过程当中,我每焊接一个结点,都会用万用表去检测。
做到精益求精。
防止在板子焊好之后,再检测,就会有些无从下手。
给自己更少的机会去检查。
而是更多的机会去做到完美。
在这次课程设计中,我学会了:
谨慎,仔细,小心。
我坚信,这些知识会让我受益匪浅。
在这次课程设计当中,我也有很多做的不好的地方。
那天板子还没有喊好的时候,惠林看到我们的板子的时候说:
’你的板子裸露在外面的线实在是太不安全了。
特别容易短路,;我说:
“不会的,这些线是压不下去的,”,他的一句话让我恍然大悟,“客户有时候是不会善待你的劳动成果的,我们的服务对象是客户,而不是我们自己。
我们得把目光放的长远一点”,自己在这方面的考虑还是欠缺的。
希望以后通过更多的机会,得到锻炼、提高。
在这次课程设计中,我主要负责硬件仿真和写报告的工作。
刚开始,我们整个组都不知如何下手。
在查找完资料的第二天,在组长王明友的带领下,他自告奋勇的承担了程序编写和软件调试工作,也给各组员分配了工作。
通过参考资料,我大致懂得了超声波测距原理,但是对于数码管如何实现显示功能还是一头雾水。
于是,在数码管显示这一模块进行了大量的资料查找,结合单片机各管脚功能,终于了解到充分使用单片机的I/O接口与数码管动态显示接口相连接,通过程序即能实现数码管的数据显示。
懂得了基本原理,电路搭建起来就很轻易了。
然而,我对软件部分还不是很了解,整个程序基本上是请教王明友慢慢读懂的。
由于硬件仿真这块,如果不能仿真出来就需要修改程序,所以读懂程序还是非常有必要的。
但是,编写程序目前对于我来说还有一定的困难,我也会在今后坚持不断的学习。
硬件仿真完成后,为了很好的完成报告,一直都在不断向王明友同学学习他是如何调试,以及如何解决问题的。
经过本次的课程设计,我觉得我最大的收获是深入了解到了51(或52)单片机的各管脚功能,真正将理论和实践结合起来,以及更加明确计数方式,机器周期,晶振频率(或周期)的有关知识。
延时程序的编写和中断的内容也更加深入细致。
还有就是,我明白了任何事情都不难,只要我们积极思考,而不是被动的接受知识;遇到问题不用怕,主动请教,过关斩将,那么什么问题都不再是问题,而变成自己的知识储备。
队友的认真、耐心和热心使我们每个环节的完成都比较顺利,良好的合作以及明确的分工使我们高效率的完成了本次课程设计。
短短两周的课程设计转眼间就结束了,在这个过程中我收获了很多,不仅感受到了充实,而且体会到学以致用的欣喜。
在我们的学习中,很多课程都只是在不断重复着理论的叠加,然而随着时间的推移,沉淀下来的也微乎其微。
真正能够让我们学以致用的很少。
而单片机这两周的课程设计却能让人欣喜,特别是当我们付出努力并获得一定的成果时,那些许的成就感让我们燃起了希望。
学以致用,这是我们作为学生内心深处的呼唤。
刚开始课程设计的前两天,我收集了很多有关我们课程设计的资料,仔细阅读了并深入体会了此次设计的思想,之后便开始了我们自己的设计。
经过两天的努力,我们自己的设计图纸也出来了,软件和硬件仿真也都正常。
星期五宋英同学便开始了焊接,与此同时,我利用一块同学闲置的单片机开发板开发我们的程序,因为显示电路基本一致,只是把超声波测距模块用杜邦线连接即可,经过不断调试,程序很快就编写完毕。
第二周,板子焊接完毕,上电下载程序,没有反应,心里一阵失落,开始调试,找不出原因。
第二天,在老师的指点下,进过测电压发现有个管脚焊接有问题,修正后数码管有了显示,但是显示的不对,再调试发现编码有问题,反复测试了几次,最终成功了,我们内心都很高兴。
课程设计的这两周,让我对单片机有了新的认识,有了新的理解,佩服其功能强大的同时,感慨自己需要学习的还有很多,感受从无到有,从失败到成功的欣喜。
这次课程设计的记忆将在我以后的学习和生活中影响深远,激励我继续努力学习,学以致用。
都说付出就有收获,经过2个星期的努力,我和合伙人带着好奇和兴奋顺利的做完了所有步骤和程序。
说真的,这两个星期我学到了好多好多,同时眼界也宽了好多好多。
还有我想说的是,通过指导老师的指导,加上自己能够亲手操作能够加强对超声波及超声波测距的了解和单片机学习和传感器学习的熟练程度,同时也能熟悉PROTELDXP2004软件和KIL4软件的使用。
更能了解对PCB板制作工艺和流程以及那些设备的操作,及我们所学课程的理解。
更有利的是能加强我们专业素养和专业技能,为我们以后能更好的就业,打下很好的基础,提高我们动手能力和综合素质能力。
此次试验花费的心神较多,首先是设计电路,然后是单片机代码,开始焊电路,用了4天时间进行焊接和调整后,发现发射和接收部分还是不能用,万不得已用到别的模块,在少了N次代码后终于成功了。
总之“一分耕耘,一分收获”。
通过我们亲手的操作,我们确实学到了许多东西。
我同时希望学校能更多的给与我们实训做项目和课题的机会。