1、超声波测距原理
超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后求出距离s=ct/2,式中的c为超声波波速。
由于超声波也是一种声波,其声速c与温度有关,表1列出了几种不同温度下的声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速确定后,只要测得超声波往返的时间,即可求得距离。这就是超声波测距仪的机理。其系统框图如图1所示。
2、at89c2051的功能特点
at89c2051是一个2k字节可编程eprom的高性能微控制器。它与工业标准mcs-51的指令和引脚兼容,因而是一种功能强大的微控制器,它对很多嵌入式控制应用提供了一个高度灵活有效的解决方案。at89c2051有以下特点:2k字节eprom、128字节ram、15根i/o线、2个16位定时/计数器、5个向量二级中断结构、1个全双向的串行口、并且内含精密模拟比较器和片内振荡器,具有4.25v至5.5v的电压工作范围和12mhz/24mhz工作频率,同时还具有加密阵列的二级程序存储器加锁、掉电和时钟电路等。此外,at89c2051还支持二种软件可选的电源节电方式。空闲时,cpu停止,而让ram、定时/计数器、串行口和中断系统继续工作。可掉电保存ram的内容,但可使振荡器停振以禁止芯片所有的其它功能直到下一次硬件复位。
at89c2051有2个16位计时/计数器寄存器timer0ttimer1。作为一个定时器,每个机器周期寄存器增加1,这样寄存器即可计数机器周期。因为一个机器周期有12个振荡器周期,所以计数率是振荡器频率的1/12。作为一个计数器,该寄存器在相应的外部输入脚p3.4/t0和p3.5/t1上出现从1至0的变化时增1。由于需要二个机器周期来辨认一次1到0的变化,所以zui大的计数率是振荡器频率的1/24,可以对外部的输入端p3.2/int0和p3.3/int1编程,便于测量脉冲宽度的门。
表1声速与温度关系表
充分利用at89c2051的片内资源,即可在很少外围电路的情况下构成功能完善的超声波测距系统。
3、系统硬件电路设计
超声波测距仪的硬件电路如图2所示。
at89c2051通过外部引脚p1.6输出脉冲宽度为250μs,载波为40khz的10个脉冲的脉冲群,以推挽形式加到变压器的初级,经升压变换推动超声波换能器发射出去。在发射的同时,p1.7输出一个高电平启动,给电容c4充电。发射结束时高电平翻转为低电平,c4开始对r2、r3组成的分压器放电并输出到比较器的负端。超声波接收换能器将接收到的障碍物反射的超声波送到放大器进行放大,这是一个高增益、低噪声放大器,在对放大后的信号进行检波后将检测回波送到比较器的正输入端。发射时p1.7输出的电平可以抑制比较器的翻转,这样就可以抑制发射器发射的超声波直接辐射到接收器而导致错误检测。
图3是超声波测距原理的波形图,从图中可以看到,测出回波和发射脉冲之间的时间间隔,利用s=ct/2就可以算出距离,再在lcd上显示出来。当然还可以设置若干个键,以用来控制电路的工作状态。限制系统的zui大可测距离存在四个因素:超声波的幅度,反射而的质地,反射而和入射声波之间的夹角以及接收换能器的灵敏度。接收换能器对声波脉冲的直接接收能力将决定zui小的可测距离。
4、系统软件设计
at89c2051单片机和其开发应用系统具有语言简洁、可移植性好、表达能力强、表达方式灵活、可进行结构化设计、可以直接控制计算机硬件、生成代码质量高、使用方便等诸多优点。超声波测距仪就是用at89c51单片机开发设计的。它采用模块化设计,由主程序、发射子程序、查蟓接收子程序、定时子程序、显示子程序等模块组成。
图4和图5分别为主程序和测量子程序的框图。该系统的主程序处于键控循环工作方式,当按下测量键时,主程序开始调用发射子程序、查询接收子程序、定时子程序,并把测量结果用显示子程序在液晶屏上显示出来。
必须指出的是,由于液晶要使用同一p3口,所以必须全部使用位操作,否则将导致lcd不能正常显示。另外,在系统还可以加入温度传感器来监测环境温度,把表1所列的数据做到程序中可进行温度被偿。为了增强系统的可靠性,应在软硬件上采用一些特殊措施。限于篇幅,下面仅给出部分程序,感兴趣者可与作者。
#pragmadboecdot(5,speed)rom(large)iv
/*连接所需要的库*/
#include
#include
#include
/*定义数据类型*/
typedefunsingnedcharbyte;
typedefunsignedintword
#defineucharunsignedchar
#defineunintunsignedint
#defineulongunsignedlong
/*定义系统常数*/
#definetrue1
#definefalse0
#definec=340/*声速*/
/*定义功能位*/
sbitbflag=acc7;
sbitvolck=p1^5;
sbitming=p3^5;
sbitquiet=p1^3;
sbitback=p1^2;
/*定义显示缓冲区*/
ucharidataon[16]={’,’l’,’e’,’n’,’g’,’t’,’h’,’=’,’8’,’.’,’8’8’,’m’,’’,’’,’’};
/*主程序用延时子程序*/
woidmain-delay(void)
{
registeri;
tro=1;
for(i=0;i<15;i++)
{
th0=0;
tl0=0;
do{}while(!tf0);
tf0=0;
}
tr0=0;
}
*/通用延时子程序*/
voiddelay(void)
{
uninti;
for(i=0;i<200;i++){;}
}
/*键盘延时子程序*/
voidkey-delay(void)
{
uninti;
for(i=0;i<200;i++){;}
}
/*初始化程序*/
voidstart_main()
{
tegisteri;
uchara[16]={’’,’l’,’e’,’n’,’g’,’t’,’h’,’=,’8’,’.’,’8’,’8’,’m’,’’,’’,’’};
for(i=0;<16;i++)
{on[i]=a[i];}
nitlcd();/*初始化液晶*/
display(on);/*更新显示*/
}
/*主程序*/
voidmain()
{
registers,keycode;
longidatat;
start-main();/*初始化*/
main-delay();/*延时*/;
if(keycoed==true)
{
keycode=key-scan-wait();
/*判断是否有测量键按下*/
t=measure();*/测量*/
s=0.5*t*c;*/换算*/
decode-bcd(s.0x09);
/*把测量结果置换入显示缓冲区*/
init-lcd();/*初始化液晶*/
display(on);/*更新显示*/
}
}
5、结束语
虽然用一个单独计时器电路也可以测量超声波的传输时间,但利用at89c2051单片机可以简化设计,便于操作和直观读数。该系统经实际测试证明,可以满足大多数场合的测距要求。