基于单片机的超声波测距仪设计.docx
《基于单片机的超声波测距仪设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的超声波测距仪设计.docx(17页珍藏版)》请在冰豆网上搜索。
![基于单片机的超声波测距仪设计.docx](https://file1.bdocx.com/fileroot1/2023-1/9/9a2187ba-f918-4597-ac29-661e34e880c7/9a2187ba-f918-4597-ac29-661e34e880c71.gif)
基于单片机的超声波测距仪设计
基于单片机的超声波测距仪设计
1总体设计方案介绍
1.1超声波测距原理
发射器发出的超声波以速度υ在空气中传播,在到达被测物体时被反射返回,由接收器接收,其往返时间为t,由s=vt/2即可算出被测物体的距离。
由于超声波也是一种声波,其声速v与温度有关,下表列出了几种不同温度下的声速。
在使用时,如果温度变化不大,则可认为声速是基本不变的。
如果测距精度要求很高,则应通过温度补偿的方法加以校正。
表1-1超声波波速与温度的关系表
温度(℃)
-30
-20
-10
0
10
20
30
100
声速(m/s)
313
319
325
323
338
344
349
386
表1-1
1.2超声波测距仪原理框图如下图
单片机发出40kHZ的信号,经放大后通过超声波发射器输出;超声波接收器将接收到的超声波信号经放大器放大,用锁相环电路进行检波处理后,启动单片机中断程序,测得时间为t,再由软件进行判别、计算,得出距离数并送LED显示。
图1-1超声波测距仪原理框图
2系统的硬件结构设计
硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分。
单片机采用AT89C51或其兼容系列。
采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。
单片机用P1.0端口输出超声波换能器所需的40kHz的方波信号,利用外中断0口监测超声波接收电路输出的返回信号。
显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管8550驱动。
2.151系列单片机的功能特点及测距原理
2.1.151系列单片机的功能特点
5l系列单片机中典型芯片(AT89C51)采用40引脚双列直插封装(DIP)形式,内部由CPU,4kB的ROM,256B的RAM,2个16b的定时/计数器TO和T1,4个8b的工/O端I:
IP0,P1,P2,P3,一个全双功串行通信口等组成。
特别是该系列单片机片内的Flash可编程、可擦除只读存储器(E~PROM),使其在实际中有着十分广泛的用途,在便携式、省电及特殊信息保存的仪器和系统中更为有用。
5l系列单片机提供以下功能:
4kB存储器;256BRAM;32条工/O线;2个16b定时/计数器;5个2级中断源;1个全双向的串行口以及时钟电路。
空闲方式:
CPU停止工作,而让RAM、定时/计数器、串行口和中断系统继续工作。
掉电方式:
保存RAM的内容,振荡器停振,禁止芯片所有的其他功能直到下一次硬件复位。
5l系列单片机为许多控制提供了高度灵活和低成本的解决办法。
充分利用他的片内资源,即可在较少外围电路的情况下构成功能完善的超声波测距系统。
2.1.2单片机实现测距原理
单片机发出超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差tr,然后求出距离S=Ct/2,式中的C为超声波波速。
限制该系统的最大可测距离存在4个因素:
超声波的幅度、反射的质地、反射和入射声波之间的夹角以及接收换能器的灵敏度。
接收换能器对声波脉冲的直接接收能力将决定最小的可测距离。
为了增加所测量的覆盖范围、减小测量误差,可采用多个超声波换能器分别作为多路超声波发射/接收的设计方法。
由于超声波属于声波范围,其波速C与温度有关。
2.2超声波发射电路
超声波发射电路原理图如图2-2所示。
发射电路主要由反相器74LS04和超声波发射换能器T构成,单片机P1.0端口输出的40kHz的方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推换形式将方波信号加到超声波换能器的两端,可以提高超声波的发射强度。
输出端采两个反向器并联,用以提高驱动能力。
上位电阻R1O、R11一方面可以提高反向器74LS04输出高电平的驱动能力,另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡时间。
压电式超声波换能器是利用压电晶体的谐振来工作的。
超声波换能器内部有两个压电晶片和一个换能板。
当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片会发生共振,并带动共振板振动产生超声波,这时它就是一个超声波发生器;反之,如果两电极问未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收换能器。
超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志。
2.3超声波检测接收电路
集成电路CX20106A是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。
考虑到红外遥控常用的载波频率38kHz与测距的超声波频率40kHz较为接近,可以利用它制作超声波检测接收电路(如图2-3)。
实验证明用CX20106A接收超声波(无信号时输出高电平),具有很好的灵敏度和较强的抗干扰能力。
适当更改电容C4的大小,可以改变接收电路的灵敏度和抗干扰能力。
图2-3超声波检测接收电路
2.4超声波测距系统的硬件电路设计
本系统的特点是利用单片机控制超声波的发射和对超声波自发射至接收往返时间的计时,单片机选用AT89C51,经济易用,且片内有4K的ROM,便于编程。
电路原理图如见附件。
其中只画出前方测距电路的接线图,左侧和右侧测距电路与前方测距电路相同,故省略之。
3系统软件的设计
超声波测距仪的软件设计主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序组成。
我们知道C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率且容易精细计算程序运行的时间,而超声波测距仪的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),所以控制程序可采用C语言和汇编语言混合编程。
3.1超声波测距仪的算法设计
超声波测距的原理为超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就被超声波接收器R所接收到。
这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器与反射物体的距离。
距离的计算公式为:
d=s/2=(c×t)/2
(1)
其中,d为被测物与测距仪的距离,s为声波的来回的路程,c为声速,t为声波来回所用的时间。
在启动发射电路的同时启动单片机内部的定时器T0,利用定时器的计数功能记录超声波发射的时间和收到反射波的时间。
当收到超声波反射波时,接收电路输出端产生一个负跳变,在INT0或INT1端产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离。
其部分源程序如下:
RECEIVE0:
PUSHPSW
PUSHACC
CLREX0;关外部中断0
MOVR7,TH0;读取时间值
MOVR6,TL0?
CLRC
MOVA,R6
SUBBA,#0BBH;计算时间差
MOV31H,A;存储结果
MOVA,R7
SUBBA,#3CH
MOV30H,A
SETBEX0;开外部中断0
POPACC
POPPSW
RETI
3.2主程序流程图
软件分为两部分,主程序和中断服务程序,如图3-1(a)(b)(c)所示。
主程序完成初始化工作、各路超声波发射和接收顺序的控制。
定时中断服务子程序完成三方向超声波的轮流发射,外部中断服务子程序主要完成时间值的读取、距离计算、结果的输出等工作。
主程序首先是对系统环境初始化,设置定时器T0工作模式为16位定时计数器模式。
置位总中断允许位EA并给显示端口P0和P1清0。
然后调用超声波发生子程序送出一个超声波脉冲,为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约0.1ms(这也就是超声波测距仪会有一个最小可测距离的原因)后,才打开外中断0接收返回的超声波信号。
由于采用的是12MHz的晶振,计数器每计一个数就是1μs,当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按式
(2)计算,即可得被测物体与测距仪之间的距离,设计时取20℃时的声速为344m/s则有:
d=(c×t)/2=172T0/10000cm
(2)
其中,T0为计数器T0的计算值。
测出距离后结果将以十进制BCD码方式送往LED显示约0.5s,然后再发超声波脉冲重复测量过程。
为了有利于程序结构化和容易计算出距离,主程序采用C语言编写。
3.3超声波发生子程序和超声波接收中断程序
超声波发生子程序的作用是通过P1.0端口发送2个左右超声波脉冲信号(频率约40kHz的方波),脉冲宽度为12
μs左右,同时把计数器T0打开进行计时。
超声波发生子程序较简单,但要求程序运行准确,所以采用汇编语言编程。
超声波测距仪主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(即INT0引脚出现低电平),立即进入中断程序。
进入中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。
前方测距电路的输出端接单片机INT0端口,中断优先级最高,左、右测距电路的输出通过与门IC3A的输出接单片机INT1端口,同时单片机P1.3和P1.4接到IC3A的输入端,中断源的识别由程序查询来处理,中断优先级为先右后左。
部分源程序如下:
RECEIVE1:
PUSHPSW
PUSHACC
CLREX1;关外部中断1
JNBP1.1,RIGHT;P1.1引脚为0,转至右测距电路中断服务程序
JNBP1.2,LEFT;P1.2引脚为0,转至左测距电路中断服务程序
RETURN:
SETBEX1;开外部中断1
POPACC
POPPSW
RETI
RIGHT:
...;右测距电路中断服务程序入口
AJMPRETURN
LEFT:
...;左测距电路中断服务程序入口
AJMPRETURN
4系统的软硬件的调试
超声波测距仪的制作和调试都比较简单,其中超声波发射和接收采用Φ15的超声波换能器TCT40-10F1(T发射)和TCT40-10S1(R接收),中心频率为40kHz,安装时应保持两换能器中心轴线平行并相距4~8cm,其余元件无特殊要求。
若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。
根据测量范围要求不同,可适当调整与接收换能器并接的滤波电容C0的大小,以获得合适的接收灵敏度和抗干扰能力。
硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。
根据实际情况可以修改超声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要。
根据所设计的电路参数和程序,测距仪能测的范围为0.07~5.5m,测距仪最大误差不超过1cm。
系统调试完后应对测量误差和重复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量要求。
5设计总结
由于时间和其它客观上的原因,此次设计没有做出实物。
但是对设计有一个很好的理论基础。
设计的最终结果是使超声波测距仪能够产生超声波,实现超声波的发送与接收,从而实现利用超声波方法测量物体间的距离。
以数字的形式显示测量距离。
超声波测距的原理是利用超声波的发射和接受,根据超声波传播的时间来计算出传播距离。
实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。
此次设计采用反射波方式。
超声波测距仪硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分。
单片机采用AT
89C51或其兼容系列。
采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。
单片机用P1.0端口输出超声波换能器所需的40kHz的方波信号,利用外中断0口监测超声波接收电路输出的返回信号。
显示电路采用简单实用的4位共阳LED数码管,段码用74LS244驱动,位码用PNP三极管8550驱动。
超声波发射电路主要由反相器74LS04和超声波发射换能器T构成,单片机P1.0端口输出的40kHz的方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推换形式将方波信号加到超声波换能器的两端,可以提高超声波的发射强度。
输出端采两个反向器并联,用以提高驱动能力。
上位电阻R1O、R11一方面可以提高反向器74LS04输出高电平的驱动能力,另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡时间。
压电式超声波换能器是利用压电晶体的谐振来工作的。
超声波换能器内部有两个压电晶片和一个换能板。
当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片会发生共振,并带动共振板振动产生超声波,这时它就是一个超声波发生器;反之,如果两电极问未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收换能器。
超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志。
超声波检测接收电路主要是由集成电路CX20106A组成,它是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。
考虑到红外遥控常用的载波频率38kHz与测距的超声波频率40kHz较为接近,可以利用它制作超声波检测接收电路。
实验证明用CX20106A接收超声波(无信号时输出高电平),具有很好的灵敏度和较强的抗干扰能力。
适当更改电容C4的大小,可以改变接收电路的灵敏度和抗干扰能力。
超声波测距仪的软件设计主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序组成。
我们知道C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率且容易精细计算程序运行的时间,而超声波测距仪的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),所以控制程序可采用C语言和汇编语言混合编程。
主超声波测距仪主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(即INT0引脚出现低电平),立即进入中断程序。
进入中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。
前方测距电路的输出端接单片机INT0端口,中断优先级最高,左、右测距电路的输出通过与门IC3A的输出接单片机INT1端口,同时单片机P1.3和P1.4接到IC3A的输入端,中断源的识别由程序查询来处理,中断优先级为先右后左。
超声波测距的算法设计原理为超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就被超声波接收器R所接收到。
这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器与反射物体的距离。
在启动发射电路的同时启动单片机内部的定时器T0,利用定时器的计数功能记录超声波发射的时间和收到反射波的时间。
当收到超声波反射波时,接收电路输出端产生一个负跳变,在INT0或INT1端产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离。
在元件及调制方面,由于采用的电路使用了很多集成电路。
外围元件不是很多,所以调试应该不会太难。
一般只要电路焊接无误,稍加调试应该会正常工作。
电路中除集成电路外,对各电子元件也无特别要求。
根据测量范围要求不同,可适当调整与接收换能器并接的滤波电容C0的大小,以获得合适的接收灵敏度和抗干扰能力。
若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。
小组成员姓名
班级
学号
苏涛
07电子二班
07205010244
胡朝
07电子二班
07205010215
杨宇翔
07电子二班
小组成员签字:
附录
附录1超声波测距电路原理图
附录2超声波测距程序清单
#INCLUDE
#DEFINEK1P3_4
#DEFINECSBOUTP3_5//超声波发送
#DEFINECSBINTP3_7//超声波接收
#DEFINECSBC=0.034
#DEFINEBGP3_3
UNSIGNEDCHARCSBDS,OPTO,DIGIT,BUFFER[3],XM1,XM2,XM0,KEY,JPJS;//显示标识
UNSIGNEDCHARCONVERT[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//0~9段码
UNSIGNEDINTS,T,I,XX,J,SJ1,SJ2,SJ3,MQS,SX1;
BITCL;
VOIDCSBCJ();
VOIDDELAY(J);//延时函数
VOIDSCANLED();//显示函数
VOIDTIMETOBUFFER();//显示转换函数
VOIDKEYSCAN();
VOIDK1CL();
VOIDK2CL();
VOIDK3CL();
VOIDK4CL();
VOIDOFFMSD();
VOIDMAIN()//主函数
{
EA=1;//开中断
TMOD=0X11;//设定时器0为计数,设定时器1定时
ET0=1;//定时器0中断允许
ET1=1;//定时器1中断允许
TH0=0X00;
TL0=0X00;
TH1=0X9E;
TL1=0X57;
CSBDS=0;
CSBINT=1;
CSBOUT=1;
CL=0;
ŌPTO=0XFF;
JPJS=0;
SJ1=45;
SJ2=200;
SJ3=400;
K4CL();
TR1=1;
WHILE
(1)
{
KEYSCAN();
IF(JPJS<1)
{
CSBCJ();
IF(S>SJ3)
{
BUFFER[2]=0X76;
BUFFER[1]=0X76;
BUFFER[0]=0X76;
}
ELSEIF(S{
BUFFER[2]=0X40;
BUFFER[1]=0X40;
BUFFER[0]=0X40;
}
ELSETIMETOBUFFER();
}
ELSETIMETOBUFFER();//将值转换成LED段码
OFFMSD();
SCANLED();//显示函数
IF(SBG=0;
BG=1;
}
}
VOIDSCANLED()//显示功能模块
{
DIGIT=0X04;
FOR(I=0;I<3;I++)//3位数显示
{
P3=~DIGIT&OPTO;//依次显示各位数
P1=~BUFFER;//显示数据送P1口
DELAY(20);//延时处理
P1=0XFF;//P1口置高电平(关闭)
IF((P3&0X10)==0)//判断3位是否显示完
KEY=0;
DIGIT>>=1;//循环右移1位
}
}
VOIDTIMETOBUFFER()//转换段码功能模块
{
XM0=S/100;
XM1=(S-100*XM0)/10;
XM2=S-100*XM0-10*XM1;
BUFFER[2]=CONVERT[XM2];
BUFFER[1]=CONVERT[XM1];
BUFFER[0]=CONVERT[XM0];
}
VOIDDELAY(I)
{
WHILE(--I);
}
VOIDTIMER1INT(VOID)INTERRUPT3USING2
{
TH1=0X9E;
TL1=0X57;
CSBDS++;
IF(CSBDS>=40)
{
CSBDS=0;
CL=1;
}
}
VOIDCSBCJ()
{
IF(CL==1)
{
TR1=0;
TH0=0X00;
TL0=0X00;
I=10;
WHILE(I--)
{
CSBOUT=!
CSBOUT;
}
TR0=1;
I=MQS;//盲区
WHILE(I--)
{
}
I=0;
WHILE(CSBINT)
{
I++;
IF(I>=2450)//上限值
CSBINT=0;
}
TR0=0;
TH1=0X9E;
TL1=0X57;
T=TH0;
T=T*256+TL0;
S=T*CSBC/2;
TR1=1;
CL=0;
}
}
VOIDKEYSCAN()//健盘处理函数
{
XX=0;
IF(K1!
=1)//判断开关是否按下
{
DELAY(400);//延时去抖动
IF(K1!
=1)//判断开关是否按下
{
WHILE(!
K1)
{
DELAY(30);
XX++;
}
IF(XX>2000)
{
JPJS++;
IF(JPJS>4)
JPJS=0;
}
XX=0;
SWITCH(JPJS)
{
CASE1:
K1CL();BREAK;
CASE2:
K2CL();BREAK;
CASE3:
K3CL();BREAK;
CASE4:
K4CL();BREAK;
}
}
}
}
VOIDK1CL()
{
SJ1=SJ1+5;
IF(SJ1>100)
SJ1=30;
S=SJ1;
}
VOIDK2CL()
{
SJ2=SJ2+5;
IF(SJ2>500)
SJ2=40;
S=SJ2;
}
VOIDK3CL()
{
SJ3=SJ3+10;
IF(SJ3>500)
SJ3=100;
S=SJ3;
}
VOIDK4CL()
{
SX1=SJ1-1;
SX1=SX1/CSBC;
MQS=SX1/4.5;
}
VOIDOFFMSD()
{
IF(BUFFER[0]==0X3F)
BUFFER[0]=0X00;
}
附录3超声波测距元器件清单
AT89C511个
LM3581个
LM5671个
24C021个
74LS1641个
74LS041个
CX20106A1个
LED七段数码管2位
10KΩ电阻4个
1KΩ电阻3个
4.7KΩ电阻1个
100Ω电阻1个
2.2KΩ电阻3个
220KΩ电阻1个
可变电阻1个
12M晶振1个
发光二极管2个
三极管1个
1μF电容3个
22μF电容2个
104pF电容2个
152pF电容1个
330pF电容2个
3.3μF电容1个
30pF电容2个
资料仅供参考!
!
!