超声波测距设计.docx
《超声波测距设计.docx》由会员分享,可在线阅读,更多相关《超声波测距设计.docx(28页珍藏版)》请在冰豆网上搜索。
超声波测距设计
目录
一、需求分析及方案论证1
(一)用户需求分析1
(二)方案论证和选择2
二、硬件模块分析设计和制作4
(一)单片机主控模块4
(二)超声波发射模块5
(三)超声波接收模块6
(四)语音播报模块7
(五)显示模块7
(六)硬件制作8
三、软件设计8
(一)软件流程图8
(二)程序说明9
四、设计总结10
参考文献11
附录一12
附录二12
附录三12
智能超声波测距
(应用电子技术专业应电08
(2)班,张南)
摘要:
本设计采用了单片机STC89C52作为核心,12864显示器件作为显示设备,构成了超声波发射、超声波接收和语音播报模块,根据程序计算超声波从发射到接收的传送时间,实现了待测距离的测试和语音播报。
本系统具有成本低、高精度、微型化、易检测、软件功能完善以及工作可靠、准确度高等优点,可用于倒车雷达、移动机器人,也可用于液位、井深、管道长度等测量场合。
关键字:
单片机;超声波;测距仪
一、需求分析及方案论证
(一)用户需求分析
随着科技的发展,人们生活水平的提高和生活步调的加快,汽车已经成为人们生活中不可或缺的交通工具。
但是就在汽车为我们带来方便的同时也为我们带来了安全隐患,我们的眼睛不能看到在我们身后的物体在倒车时很容易撞到车子后面的物体,为我们带来不必要的损失。
要避免这种情况的发生我们需要另外一对眼睛帮我们看着身后,这样倒车雷达就应运而生了。
我们这个设计就是关于倒车雷达的设计,在设计时我们对用户的需求做了相应的调查得到了以下结果:
(1)用户需求
要求测距范围在4米以内,测量时与被测物体无直接接触,能够清晰稳定地显示测量结果。
(2)需求分析报告详细介绍
根据需要此系统由四大个模块组成,即超声波测量模块,主控中心模块,显示模块,语音播报模块。
其模块示意图如图
(1)所示。
(二)方案论证和选择
利用超声波进行距离测量的设计,我们有多种方案可供选择如:
采用单片机来控制的超声波测距仪、采用CPLD来控制的超声波测距仪、采用锁相环频率合成技术,我们将将各方案的优缺点进行比较择优而用。
(1)设计方案一
采用单片机来控制的超声波测距仪
由单片机STC89c52编程产生40KHz的方波脉冲,由P3.6口输出,一旦有高电平出处,即在模块(74HC04集成芯片)中经过放大电路,驱动超声波发射探头发射超声波。
发射出去的超声波经障碍物反射回来后,由超声波接收头接收到信号,通过接收电路的检波放大、积分整形及一系列处理,接收口P3.3口即变为低电平,读取单片机中定时器的值。
单片机利用声波的传播速度和发射脉冲到接收反射脉冲的时间间隔计算出障碍物的距离,并由12864芯片显示出来,同时由WT588语音播报所测距离。
超声波测距模块的发射端在T0时刻发射方波,同时启动定时器开始计时,当收到回波后,产生一负跳变到单片机中断口,单片机响应中断程序,定时器停止计数。
计算时间差,
即可得到超声波在媒介中传播的时间t,由此便可计算出距离。
此方案具有易检测、软件完善、工作可靠、准确度高、成本低等有点。
设计原理示意图如图2所示。
(2)设计方案二
采用CPLD来控制的超声波测距仪,主要是在软件上运用VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage)编写程序使用MAX+plusII软件进行软硬件设计的仿真和调试,最终实现测距功能。
使用本方案的优点在于在超声波测距仪设计中采用的是MAX7000s系列中的EPM7128SLC84-15的CPLD器件,其最高频率可达175.4MHz,可用于组合逻辑电路、时序逻辑电路、算法、双端口RAM等的设计。
充分利用了其多达128个宏单元、68pin可编程I/O口,使该器件可以将分频功能、计数功能、显示编码功能、振荡功能全部集于一体。
又因其延时平均的特点,保证了测距结果精度高、响应速度快。
缺点是方案中需要一块FPGA,一块双口RAM,还需要一块用来存储波形数据的EEPROM,那么设计的成本较高。
同时在FPGA中还要用硬件描述语言(VHDL语言)编写程序来实现硬件电路功能。
由于EPM7128SLC84-15的算法复杂,所以在软件实现起来编程也复杂。
(3)方案设计三
采用锁相环频率合成技术,也可以实现我们所需要的超声波测距仪。
具体方案如下:
首先通过频率合成技术产生超声波所需要的频率,在通过信号线将采用锁频率相合成技术得到的频率引到超声波的发射头上,这样就可以实现超声波测距。
它的优点就是工作频率可调,也可以达到很高的频率分辨率;缺点是要求使用的滤波器通带可变,实现很困难。
它的原理如图3所示。
图3锁相环频率合成方框图
综上所述,由于采用单片机控制超声波测距优势突出,因此选择第一种设计方案。
二、硬件模块分析设计和制作
(一)单片机主控模块
微控单元MCU采用了STC89C52芯片。
它控制发射触发脉冲的开始时间及脉宽,响应回波时刻并测量、计数发射至往返的时间差。
对MCU编程,可对测得数据优化处理使测量误差降到最低限度。
MCU还控制显示电路,通过串行口的控制脉冲输出串行数据送数字显示电路,原理图如图4所示。
计数方式有两种方法
(1)在MCU发触发脉冲的同时开启T1,收到回波立即关闭T1,这时T1的值为超声波走过的时间(注意2倍)。
超声波测距的方法有多种:
如往返时间检测法、相位检测法、声波幅值检测法。
本设计采用往返时间检测法测距。
其原理是超声波传感器发射一定频率的超声波,借助空气媒质传播,到达测量目标或障碍物后反射回来,经反射后由超声波接收器接收脉冲,其所经历的时间即往返时间,往返时间与超声波传播的路程的远近有关。
测试传输时间可以得出距离。
(2)假定s为被测物体到测距仪之间的距离,测得的时间为t/s,超声波传播速度为v/m·s-1表示,则有关系式
(1)
s=vt/2
(1)
(二)超声波发射模块
超声波发射部分是为了让超声波发射换能器TCT40-16T能向外界发出40kHz左右的方波脉冲信号。
编程由单片机P3.2端口输出40kHz左右的方波脉冲信号,由于单片机端口输出功率不够,40kHz方波脉冲信号分成两路,送给一个由74HC04组成的推挽式电路进行功率放大以便使发射距离足够远,满足测量距离要求,最后送给超声波发射换能器TCT40-16T以声波形式发射到空气中。
发射部分的电路,如图所示。
图中输出端上拉电阻R3,R2,一方面可以提高反向器74HC04(so-14)输出高电平的驱动能力,另一方面可以增加超声换能器
的阻尼效果,缩短其自由振荡的时间。
发射部分电路如图5所示。
(三)超声波接收模块
上述TCT40-16T发射的超声波在空气中传播,遇到障碍物就会返回,超声波接收部分是为了将反射波(回波)顺利接收到超声波接收换能器TCT40-16R进行转换变成电信号,并对此电信号进行放大、滤波、整形等处理后,这里用索尼公司生产的集成芯片CX20106,得到一个负脉冲送给单片机的P3.3(INT1)引脚,以产生一个中断。
接收部分的电路,如图6所示。
(四)语音播报模块
WT588D语音芯片是一款功能强大的可重复擦除烧录的语音单片机芯片。
WT588D让语音芯片不再为控制方式而寻找合适的外围单片机电路,高度集成的单片机技术足以取代复杂的外围控制电路。
配套WT588DVioceChip上位机操作软件可随意更换WT588D语音单片机芯片的任何一种控制模式,把信息下载到SPI-Flash上即可。
软件操作方式简洁易懂,撮合了语音组合技术,大大减少了语言编辑的时间。
完全支持在线下载,即便是WT588D通电的情況下,一样可以通过下载器关联的SPI-Flash下载信息,給WT588D语音芯片电路复位一下,就能更新到刚下载进来的控制模式。
语音播报电路如图7所示。
(五)显示模块
本系统采用带中文字库的12864是一种具有4位/8位并行,2线或3线串行多种接口方式,内部含有国标一级,二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128*64,内置8192个16*16点汉字,和128个16*8ASCII字符集,利用该模块灵活的接口方式和简单方便的操作指令,可构成全中文人机交互图形界面。
可以显示8*4行16*16点阵的汉字,也可完成图形显示。
低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块,其原理图如图8所示。
(六)硬件制作
根据各模块绘制电路图并做出PCB图通过雕刻机刻出PCB板,再将各种所需的电子元器件焊接在电路板上。
元件在焊接前要先用万用表进行检测以免将坏的元件焊接在电路中使电路不能工作;焊接时要注意不能虚焊,这样就避免了电路不能工作,对其进行排查的麻烦。
本系统在设计和制作时各模块是分开的,制作时使用的元件大多是贴片式的,各模块的实物图见附录一和附录二。
三、软件设计
(一)软件流程图
软件在硬件平台上构筑,完成各部分硬件的控制和协调。
系统功能是由软、硬件共同实现的,由于软件的可伸缩性,最终实现的系统功能可强可弱,差别可能很大。
因此,软件是本系统的灵魂。
软件采用模块化设计方法,不仅易于编程和调试,也可减小软件故障率和提高软件的可靠性。
本系统的主要完成的工作是完成对系统的初始化,超声波的发射,接收;显示系统的显示和语音提示,以及根据所需要的功能进行相应的操作,如图9所示。
(二)程序说明
我们所设计的系统程序设置了三种超声波发射模式,在系统开始工作时系统首先对程序进行初始化,然后进行第一次超声波发射,如果在预定的时间内接收到超声波,则将接收到的信号送到存储器存储,再由主控芯片计算出距离送到显示模块显示并有语音模块进行播报;如果没有接收到反射回来的超声波,说明发射的超声波被吸收或者距离障碍物太远,系统将进行第二次超声波发射反射能量更强的超声波,如果接收到返回信号则送存储器,如果接收不到则进行第三次发射发射更强的超声波信号,如果接收到反射波则送存储器,接收不到则将0送到存储器存储,并由液晶显示器显示语音模块播报距离为0。
这个系统的程序除了包括我们所分析的主程序以外还包括显示模块和语音播报模块的驱动程序,但在这里我们就不再这里进行一一的说明了(主程序见附录二)。
四、设计总结
通过这一段时间的努力,基于单片机的智能超声波测距系统的设计终于在我们设计小组成员的共同努力下完成了,我们设计小组是由我、陈梦丽、曹艳组成。
设计能够成功的完成是与我们指导老师细心的指导和帮助分不开的,在此表示忠心的感谢。
在这次毕业设计过程中。
通过资料的查阅,制定方案等一系列过程,极大的丰富了我的专业知识,使我的理论与实际动手能力又有了一个很大的提高,毕业设计对我们来说,是三年来所学的所有知识的一个非常全面的综合性应用,涉及的理论知识面也很广,需要了解各方面的知识,是理论与实践相结合的最好体现,也是对我们大学三年生活的一种肯定,所以我们大家都是用心去把它做到最好。
在这次毕业设计过程中,虽然我们在小组内的分工各不相同,我主要负责硬件制作,但不论怎么说这次设计不但增强了我们的动手能力还让我们学会了如何去设计一个系统,在以前的学习过程中,我们虽然也做过一些系统但那都是老师事先设计好的,我们只是模仿一下,并不需要我们自己去组织材料去思考设计方案。
这次设计在查找资料的过程中还使我们知道了如何更好的利用互联网而不是只是利用互联网去玩游戏。
设计虽然完成,在设计的过程中我们也遇到了不少困难。
比方说我们设计PCB的时候要求我们要手工布线而且要设计单面板这对都是使用自动布线的我们来说无疑是个挑战,还有就是我们在制作电路板时所使用的原件大多都是贴片式的和我们以前使用的插孔式的有很大区别,而且贴片式原件体积小这给我们的焊接工作也增加了困难,不过这些困难都在我们指导老师的指导下得到了解决;这为我们能够完成这次设计提供了很大帮助。
这次设计能够完成除了老师的指导以外再有就是我们设计小组成员的相互协作,在此我也对他们表示感谢。
参考文献
[1]王静霞,单片机应用技术,电子工业出版社,2009
[2]张永枫,单片机应用实训教程,清华大学出版社,2008
[3]徐伟,C51单片机高效入门,机械工业出版社,2006
[4]刘建清,从零开始学单片机C语言,国防工业出版社,2006
[5]先锋工作室,单片机程序设计实例,清华大学出版社,2003
[6]刘守义,单片机应用技术(第二版),西安电子科技大学出版社,2007
附录一
最小系统实物图如图10所示
附录二
语音模块和超声波探头
图12超声波发射与接收
图11语音模块
附录三
主程序源代码
/**************************************
包含头文件
****************************************/
#include
#include
#defineNOP_nop_();_nop_();_nop_()
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
/***************************************
位定义
****************************************/
sbitcsb=P3^4;
//sbitgreen=P2^3;
//sbityellow=P2^4;
//sbitred=P2^5;
bitflag_1=0;
ucharvo_vo=0xe7;
uintspeed=340;
#include"delay.c"
//#include"sound.c"
#include"12864.c"
#include"display.c"
#include"DS18B20.c"
#include"SOUND.c"
#definenop_nop_()
floatdistance;
uintcount=0;
ucharhigh_time,low_time,flag=0,tc=2;
ucharflag_2=0;
uchartc_say=0;
ulongdis,dis_4[3];
/***************************************
函数名:
floatDistance_count()
功能:
距离计算函数
****************************************/
floatDistance_count()
{
floattemp;
temp=high_time*256+low_time;
temp=(temp*10/9216)/2;
temp*=speed;
returntemp;
}
/***************************************
函数名:
ulongdo_s(ulongdis_1)
功能:
距离补偿
****************************************/
ulongdo_s(ulongdis_1)
{
ucharn;
if((dis_1>70)&(dis_1<100))
{
n=dis_1/10;
switch(n)
{
case7:
dis_1-=40;break;
case8:
dis_1-=22;break;
case9:
dis_1-=26;break;
}
return(dis_1);
}
else
{
n=dis_1/100;
switch(n)
{
case1:
dis_1-=46;break;
case2:
dis_1-=48;break;
case3:
dis_1-=50;break;
case4:
dis_1-=53;break;
case5:
dis_1-=7;break;
case6:
dis_1-=60;break;
case7:
dis_1-=65;break;
case8:
dis_1-=72;break;
case9:
dis_1-=80;break;
case10:
dis_1-=84;break;
case11:
dis_1+=30;break;
case12:
dis_1-=87;break;
case13:
dis_1+=27;break;
case14:
dis_1+=34;break;//?
case15:
dis_1+=38;break;
case16:
dis_1+=45;break;
case17:
dis_1+=49;break;
case18:
dis_1+=53;break;
case19:
dis_1+=50;break;
case20:
dis_1+=55;break;
case21:
dis_1+=56;break;
case22:
dis_1+=60;break;
case23:
dis_1+=72;break;
case24:
dis_1+=78;break;
case25:
dis_1+=84;break;
case26:
dis_1+=92;break;
case27:
dis_1+=95;break;
case28:
dis_1+=98;break;
case29:
dis_1+=101;break;
case30:
dis_1+=114;break;
case31:
dis_1+=110;break;
case32:
dis_1+=103;break;
case33:
dis_1+=114;break;
case34:
dis_1+=120;break;
case35:
dis_1+=119;break;
case36:
dis_1+=119;break;
case37:
dis_1+=120;break;
case38:
dis_1+=122;break;
case39:
dis_1+=124;break;
case40:
dis_1+=125;break;
case41:
dis_1+=150;break;
case42:
dis_1+=155;break;
case43:
dis_1+=155;break;
case44:
dis_1+=155;break;
case45:
dis_1+=160;break;
case46:
dis_1+=175;break;
case47:
dis_1+=185;break;
case48:
dis_1+=195;break;
case49:
dis_1+=175;break;
case50:
dis_1+=175;break;
}
return(dis_1);
}
}
/***************************************
函数名:
voidtran(),voidtran1(),voidtran2()
功能:
超声波的发射
****************************************/
voidtran()
{
uchari;
TH0=0;
TL0=0;
TR0=1;
for(i=4;i>0;i--)
{
csb=!
csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;
delay_ms
(2);
EX1=1;
delay_ms(30);
if(flag==1)
{
distance=Distance_count();
dis=(ulong)distance;
flag=0;
}
elsedis=0;
}
voidtran1()
{
uchari;
TH0=0;
TL0=0;
TR0=1;
for(i=8;i>0;i--)
{
csb=!
csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;
delay_ms
(2);
EX1=1;
delay_ms(30);
if(flag==1)
{
distance=Distance_count();
dis=(unsignedlong)distance;
flag=0;
}
elsedis=0;
}
voidtran2()
{
uchari;
TH0=0;
TL0=0;
TR0=1;
for(i=16;i>0;i--)
{
csb=!
csb;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;
delay_ms
(2);
EX1=1;
delay_ms(40);
if(flag==1)
{
distance=Distance_count();
dis=(unsignedlong)distance;
flag=0;
}
elsedis=0;
}
/***************************************
函数名:
voiddis_all(ulongdis_s)
功能:
控制LED指示灯和语音播报
****************************************/
voiddis_all(ulongdis_s)
{
show(dis_s);
if(dis_s>2000)
{
show_one(DIS4,2);
//green=0;red=1;yellow=1;
if(flag_2!
=1)
{
send_oneline(12);//安全距离
delay_nms(50);
while(!
busy);
}
flag_2=1;
}
else
{
if((dis_s>500)&(dis_s<1000))
{
show_one(DIS5,2);
//green=1;red=1;yellow=0;
if(flag_2!
=2)
{
send_oneline(14);//保持距离
delay_nms(50);
while(!
busy);
}
flag_2=2;
}
else
{
if((dis_s>100)&(dis_s<500))
{
show_one(DIS6,2);
//green=1;red=0;yellow=1;
if(flag_2!
=3)
{
send_oneline(15);//请注意
delay_nms(50);
while(!
busy);
send_oneline(13);//危险距离
delay_nms(50);
while(!
busy);
}
flag_2=3;
}
else
{
show_one(DIS8,2);
//yellow=1;
//if(dis_s<100)
//{red=!
red;green=1;}
//else
//{green=!
green;red=1;}
}
}
}
}
/***********************