超声波测距仪设计实验报告
课题设计目的及意义
随着科学技术的快速发展,超声波将在测距仪中的应用越来越广。但就目前技术水平来说,人们可以具体利用的测距技术还十分有限,因此,这是一个正在蓬勃发展而又有无限前景的技术及产业领域。展望未来,超声波测距仪作为种新型的非常重要有用的工具在各方面都将有很大的发展空间,它将朝着更加高定位高精度的方向发展,以满足日益发展的社会需求,如声纳的发展趋势基本为:研制具有更高定位精度的被动测距声纳,以满足水中武器实施全隐蔽攻击的需要;继续发展采用低频线谱检测的潜艇拖曳线列阵声纳,实现超远程的被动探测和识别;研制更适合于浅海工作的潜艇声纳,特别是解决浅海水中目标识别问题;大力降低潜艇自噪声,改善潜艇声纳的工作环境。无庸置疑,未来的超声波测距仪将与自动化智能化接轨,与其他的测距仪集成和融合,形成多测距仪。随着测距仪的技术进步,测距仪将从具有单纯判断功能发展到具有学习功能,最终发展到具有创造力。在新的世纪里,面貌一新的测距仪将发挥更大的作用。
随着科技的发展,人们生活水平的提高,城市发展建设加快,城市给排水系统
也有较大发展,其状况不断改善。但是,由于历史原因合成时间住的许多不可预见因素,城市给排水系统,特别是排水系统往往落后于城市建设。因此,经常出现开挖已经建设好的建筑设施来改造排水系统的现象。城市污水给人们带来了困扰,因此箱涵的排污疏通对大城市给排水系统污水处理,人们生活舒适显得非常重要。而设计研制箱涵排水疏通移动机器人的自动控制系统,保证机器人在箱涵中自由排污疏通,是箱涵排污疏通机器人的设计研制的核心部分。控制系统核心部分就是超声波测距仪的研制。因此,设计好的超声波测距仪就显得非常重要了。这就是我设计超声波测距仪的意义。
实验原理
超声波在液体、固体中衰减小、穿透力强、对某些固体、穿透深度能达到几十米的范围;另外,超声波方向性好,能够定向传播。因此,可以作为物体探查和进行测量的可靠手段。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停 止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2。
整体电路设计
整体电路的控制核心为单片机STC89C52。超声波发射和接收电路中都对相应信号进行整形及放大,以保证测量结果尽可能精确。超声波探头接OUT口实现超声波的发射和接收。整体结构图包括超声波发射电路,超声波接收电路,单片机电路,显示电路和语音提示电路等几部分模块组成。而超声波发射与接收电路还要加入放大电路。在发射后把信号放大,接收前也要把还再次放大。
整体电路结构图如图4-1。
图4-1超声波测距原理图
单片机发出40kHZ的信号,经放大后通过超声波发射器输出;超声波接收器将接收到的超声波信号经放大器放大,用锁相环电路进行检波处理后,启动单片机中断程序,测得时间为t,再由软件进行判别、计算,得出距离数并送液晶显示。
系统的硬件电路设计
硬件电路的设计主要包括单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分。单片机采用 STC89C52 或其兼容系列。采用 12MHz 高精度的晶振,以获得较稳定时钟频率,减小测量误差。单片机用 P3.0 端口输出超声波换能器所需的40kHz的方波信号,利用外中断 0口监测超声波接收电路输出的返回信号。显示电路采用简单实用的12864液晶屏。
一、 单片机的功能特点及应用
5l系列单片机中典型芯片(STC89C52)采用40引脚双列直插封装(DIP)形式,内部由CPU,4kB的ROM,256 B的RAM,2个16b的定时/计数器TO和T1,4个8 b的工/O端I:IP0,P1,P2,P3,一个全双功串行通信口等组成。特别是该系列单片机片内的Flash可编程、可擦除只读存储器(E~PROM),使其在实际中有着十分广泛的用途,在便携式、省电及特殊信息保存的仪器和系统中更为有用。该系列单片机引脚与封装如图2-1所示。
5l系列单片机提供以下功能:4 kB存储器;256 BRAM;32条工/O线;2个16b定时/计数器;5个2级中断源;1个全双向的串行口以及时钟电路。
空闲方式:CPU停止工作,而让RAM、定时/计数器、串行口和中断系统继续工作。掉电方式:保存RAM的内容,振荡器停振,禁止芯片所有的其他功能直到下一次硬件复位。 5l系列单片机为许多控制提供了高度灵活和低成本的解决办法。充分利用他的片内资源,即可在较少外围电路的情况下构成功能完善的超声波测距系统。
二、单片机在本实验中的应用
本实验中AT89C51单片机及P3.0用于超声波发射电路,P3.2用于接收电路,18和19脚照例接晶振。P1系列与语音芯片部分相接,P0和P2系列主要用于液晶屏的显示。剩余管脚依照设计接开关、按键等器材用于控制。
三、超声波发射电路
为了研究和利用超声波,人们已经设计和制成了许多超声波发生器。总体上讲,超声波发生器可以分为两大类:一 类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生 的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。目前较为常用的是压电式超声波发生器。
压电式超声波发生器实际上是利用压电晶体的谐振来工作的.它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志。
超声波发射电路原理图如下图所示,发射电路主要由反相器74LS04和超声
波发射换能器T构成,单片机P3.0端口输出的40kHz的方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推换形式将方波信号加到超声波换能器的两端,可以提高超声波的发射强度。输出端采用两个反向器并联,用以提高驱动能力。上位电阻R1O、R11一方面可以提高反向器74LS04输出高电平的驱动能力,另一方面可增加超声波换能器的阻尼效果,缩短其自由振荡时间。
四、超声波接收电路
集成电路CX20106A是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控常用的载波频率38 kHz与测距的超声波频率40 kHz较为接近且当 CX20106A 接收到40KHz的信号时,会在第7脚产生一个低电平下降脉冲,这个信号可以接到单片机的外部中断引脚作为中断信号输入,因此可以利用它制作超声波检测接收电路。实验证明用CX20106A接收超声波(无信号时输出高电平),具有很好的灵敏度和较强的抗干扰能力。其原理图如下:
五、12864液晶显示电路
液 晶 显 示 器 (LCD/Liquid Crystal Display)的 显 像原理,是将液晶置于两片导电玻璃之间,靠两个电极间电场的驱动,引起液晶分子扭曲,以控制光源透射或遮蔽功能,在电源关开之间产生明暗而将影像显示出来,若加上彩色滤光片,则可显示彩色影像。 常见的液晶显示器分为 TN-LCD(扭曲向列 LCD)、STN-LCD(超扭曲向列 LCD)、DSTN-LCD(双层超扭曲向列 LCD)和 TFT-LCD(薄膜晶体管 LCD)四种。它们的显示原理主要是利用液晶的扭曲向列型(TN)效应配合偏光板来实现对光线通过路径的"开"和"关"的。
12864液晶显示电路如下所示,EDM12864 是内置了 HD61202 控制器的 128×64 点阵式液晶显示器,EDM12864 与单片机接口简单,这一特点使其广泛的应用于各种工业控制当中。计算机 89C52 通过高位地址 A11 控制 CSB;A10控制 CSA 选通液晶显示屏上各区的控制器 HD61202;89C52 用地址 A9 作为 R/W 信号控制数据总线的数据流向;用地址 A8 作为D/I 信号控制寄存器的选择;E 信号由 89C52 的读信号 RD 和写信号 WR 合成产生,实现计算机对内置 HD61202 图形液晶显示模块的电路连接。电位器用于显示对比度的调节。
液晶显示器与传统的显像管显示器相比,其优点如下:
一、显示质量高
由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不象阴极射线管显示器(CRT)那样需要不断刷新亮点。因此,液晶显示器画质高而且绝对不会闪烁,把眼睛疲劳降到最低。
二、没有电磁辐射
传统显示器的显示材料是荧光粉,通过电子束撞击荧光粉发光显示,电子束在打到荧光粉上的一刹那间会产生强大的电磁辐射,尽管目前有许多显示器产品在处理辐射问题上进行了比较有效的处理,尽可能地把辐射量降到最低,但要彻底消除是困难的。相对来说,液晶显示器在防止辐射方面具有先天的优势,因为它根本就不存在辐射。
三、可视面积大
对于相同尺寸的显示器来说,液晶显示器的可视面积要更大一些。液晶显示器的可视面积跟它的对角线尺寸相同。阴极射线管显示器显像管前面板四周有一英寸左右的边框不能用于显示。
五、数字式接口
液晶显示器都是数字式的,不像阴极射线管显示器采用模拟接口。也就是说,使用液晶显示器再也不需要像往常那样把数字信号转化成模拟信号再行输出了。理论上,这会使色彩和定位都更加准确完美。
七、“身材”匀称小巧
传统的阴极射线管显示器,后面总是拖着一个笨重的射线管。液晶显示器突破了这一限制,给人一种全新的感觉。传统显示器是通过电子枪发射电子束到屏幕,因而显像管的管颈不能做得很短,当屏幕增加时也必然增大整个显示器的体积。而液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示目的,即使屏幕加大,它的体积也不会成正比的增加,而且在重量上比相同显示面积的传统显示器要轻得多。
八、功率消耗小
传统的显示器内部由许多电路组成,这些电路驱动着阴极射线显像管工作时,需要消耗很大的功率,而且随着体积的不断增大,其内部电路消耗的功率肯定也会随之增大。相比而言,液晶显示器的功耗主要消耗在其内部的电极和驱动 IC 上,因而耗电量比传统显示器也要小得多。
六、语音提示电路
语音提示电路有芯片isd1420和各种电容电阻、极性电容以及录音器,扬声器,发光二级管等构成。
芯片特点:ISD1420芯片采用直接模拟存储技术,且录放音质极好,并有一定的混响效果;它的外围元件简单,仅需简单的阻、容元件即可组成简单的录、放电路;单电源供电,典型电压+SV。待机时低功耗(0.5林A),放音电流巧mA;放音时间205,可扩充级联;可持续放音,也可分段录放,最小分段:205/160段=0.1255/段,可分段160段;录、放次数达10万次;断电信息存储,无需后备电池,信息可存储100年;不需要专用的编程器及语音开发器;高优先级录音,低电平或负边沿放音。
引脚介绍:ISD142O芯片封装为DIP硬封装28引脚。其中,AO一A7为地址或操作模式控制端; Vssd为数字地;Vssa为模拟地;SP十、SP-为音频信号输出端,可以驱动8一16?扬声器;Vcca为模拟电源;Vccd为数字电源;MIC为话筒输人端,可用驻极体话筒,通过电容祸合;MICREF为话筒输人参考端,若不用应悬空;AGC为自动增益控制端,调整芯片内部前置放大器增益,使录人信号不失真;ANAIN、ANAOUT为两端间接电容,该端用于模拟信号的直接输人、输出;XCLK为外部时钟或接地(一般用户接地即可);REC为录、放音控制,低电平为录音。
系统的软件设计
程序框图
主程序段:
#include <REGX52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
数据定义
uchar code tab[]={"本次测量结果为:"
"测试状态: 发 "
" m "
" 未锁定 "};
uchar code tab1[]={"单连 未"};
uchar code tab2[]={"0123456789.-"};
uchar code warning[]={"锁定中....未收到回波"};
uchar code warn1[]={"连发中"};
uchar code DIS1[] = {" 欢迎使用 "};
uchar code DIS2[] = {" 超声波测距仪 "};
uchar code DIS3[] = {"生医01班超声小组"};
uchar code DIS4[] = {" 设计制作"};
bit back,next0;
uchar sa,ge=11,p1=11,p=11,mo,nosign,outge,outp1,outp2; //sa:统计发送40KHZ信号的个数=0.5sa;ge:个位;p1小数点第一位;p小数点第二位
long scount,stime_us,distance,disge,dispo; //scount:计数个数,stime_us:时间为多少微秒;distance:最终结果,但还要被分解成ge,p1,p;disge:最后结果的整数;dispo:最后结果的小数;
sbit RS = P2^7; //寄存器选择输入
sbit RW = P2^6; //液晶读/写控制
sbit EN = P2^5; //液晶使能控制
sbit PSB = P2^3; //串/并方式控制
sbit RST = P2^4; //液晶复位端口
extern void DELAY();
void init(); //初始化
void displaylock();
void test(); //第一次检测各种状态
void test0(); //连发状态下检测是否应该停止测量
void m_single();
void m_countinous();
void Calculation();
void lcd12864(uchar,uchar,uchar);
void delay_ms(uint z);
void delay_mus(uint z);
void warning1(bit);
void open();
bit lcdbusy();
void init1();
void state();
void sendcd(bit com,uchar dat);
/****************************************
小延时
*//***************************************/
void disnop()
{_nop_();_nop_();_nop_();_nop_();}
/****************************************
中断初始化
*//***************************************/
void init() //初始化总中断和INT0中断
{ EA=1;
EX0=1;}
/****************************************
检验
*//***************************************/
void test()
{ while(1)
{ back=0;
AGN: state();
if(P3_1) //是否按下发射键 if(P3_1)
goto AGN;
else
{if(!P3_4)
{lcd12864(ge,p1,p);
displaylock();
goto AGN;}}
if(P3_3) //检查是单发还是连发状态 当开关为断开时为单发,闭合为连发 m_single();
else
m_countinous();}
}
/****************************************
复验
*//***************************************/
void test0()
{ uchar n;
if(!P3_4) //是否锁定;若在连发状态下锁定(拨到on,为低电平)则停止测量 {back=1;
return;}
if(P3_3) //是否更改为单发,若改了则停止测试
{back=1;
sendcd(0,0x8f) ;
sendcd(1,warn1[5]);
sendcd(1,warn1[6]);
}
else
{ sendcd(0,0x8d);
delay_ms(1);
for(n=0;n<6;n++)
{
sendcd(1,warn1[n]);
delay_ms(1);
}
}
return; //用return 防止重入test()
}
/****************************************
单发
*//***************************************/
void m_single()
{ next0=0;
nosign=1;
TMOD=0X10;
DELAY();
P3_0=0 ;
delay_ms(2);
while(nosign==1) //如果nosign=1即没收到超声波则等待
{if(next0)
return;}
Calculation();
TH1=0;
TL1=0;
if(P3_3) //if(P3_3) 若是单发则返回第一次检测,为连发则返回连发程序
test();
}
/****************************************
连发
*//***************************************/
void m_countinous()
{ uint m;
while (1)
{m_single();
for(m=0;m<2000;m++)
{ delay_ms(1);
test0();
if(back) return;
}
}
}
/****************************************
1MS的延时
*//***************************************/
void delay_ms(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=120;y>0;y--);
}
/****************************************
十微秒左右的延时
*//***************************************/
void delay_mus(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=5;y>0;y--);
}
/****************************************
计算结果
*//***************************************/
void Calculation() //计算结果
{
scount=TH1*0x0100+TL1;
stime_us=scount/2; //上限32768,下限约为75
distance=340*stime_us; // 上限11141120, 下限约为25500,未超出界限,数量级为10的-6次方,换算成米为0.026到11.14米之间。
disge=distance/1000000; //上限11 ,下限0
dispo=distance%1000000; //小数位,共6位 上限999999 下限000000
ge=disge;
p1=dispo/100000;
p=(dispo%100000)/10000;
mo=(((dispo%100000)/10000)%1000);
if(mo>=5)
{p++;
if(p==10)
{p=0;
p1++;
if(p1==10)
{p1=0;
ge++; }
}
if(ge>=10)
{if(!P3_3)
ge=11,p1=11,p=11;
else
{warning1(1);
delay_ms(3000);
ge=11,p1=11,p=11;}
}}
lcd12864(ge,p1,p); }
/****************************************
锁定
*//***************************************/
void displaylock()
{ uint k;
warning1(0);
for(k=0;k<8000;k++)
{ delay_ms(1);
if(P3_4)
{ lcd12864(ge,p1,p); //若解除锁定,则显示刚才的数据并返回
return;
} }
lcd12864(ge,p1,p);
}
/****************************************
开机画面
*//***************************************/
void open()
{ char i;
delay_ms(200);
init1();
sendcd(0,0x80); //设置显示位置为第一行
for(i=0;i<16;i++)
{
sendcd(1,DIS1[i]);
delay_ms(20);
}
sendcd(0,0x90); //设置显示位置为第二行
for(i=0;i<16;i++)
{
sendcd(1,DIS2[i]);
delay_ms(0);
}
sendcd(0,0x88); //设置显示位置为第三行
for(i=0;i<16;i++)
{
sendcd(1,DIS3[i]);
delay_ms(0);
}
sendcd(0,0x98); //设置显示位置为第四行
for(i=0;i<16;i++)
{
sendcd(1,DIS4[i]);
delay_ms(0);
}
delay_ms(8000);
ge=11,p1=11,p=11;
lcd12864(ge,p1,p);
}
/****************************************
忙信号
*//***************************************/
bit lcdbusy()
{ bit busy;
RS=0;
RW=1;
EN=1;
disnop();
busy=(bit)(P0&0x80);
EN=0;
return(busy);
}
/****************************************
发送数据或指令
*//***************************************/
void sendcd(bit com,uchar dat)
{ while(lcdbusy());
RS=com;RW=0;EN=0;
P0=dat;
disnop();
EN=1;
disnop();
EN=0;
}
/****************************************
12864初始化
*//***************************************/
void init1()
{ PSB=1;
RST = 0; //液晶复位
delay_ms(3);
RST = 1;
delay_ms(3);
sendcd(0,0x34);
delay_ms(5);
sendcd(0,0x30);
delay_ms(5);
sendcd(0,0x0c);
delay_ms(5);
sendcd(0,0x01);
delay_ms(5);
sendcd(0,0x10);
delay_ms(5);
sendcd(0,0x06);
delay_ms(5);
}
/****************************************
重新载入12864初始界面
*//***************************************/
void resetlcd()
{ uchar i;
sendcd(0,0x80);
for(i=0;i<32;i++)
{
sendcd(1,tab[i]);
delay_ms(1);
}
sendcd(0,0x90);
for(i=32;i<64;i++)
{
sendcd(1,tab[i]);
delay_ms(1); //若没延时重启会出现乱码
}
}
/****************************************
12864结果显示
*//***************************************/
void lcd12864(uchar outa,uchar outb,uchar outc)
{ //delay_ms(100);//看情况这儿要不要
sendcd(0,0x01);
resetlcd();
sendcd(0,0x93);
sendcd(1,tab2[outa]);
sendcd(1,tab2[10]);
sendcd(1,tab2[outb]);
sendcd(1,tab2[outc]);
}
/****************************************
显示错误
*//***************************************/
void warning1(bit i)
{ uchar j=0;
sendcd(0,0x01);
delay_ms(5);
sendcd(0,0x92);
for(j=0;j<10;j++)
{ sendcd(1,warning[i*10+j]);
delay_ms(1); }
return;
}
/****************************************
接受信号后的中断
*//***************************************/
void int0() interrupt 0 //装载中断服务程序INT0
{
nosign=0;
TR1=0;
}
/****************************************
未收到信号的中断
*//***************************************/
void interr() interrupt 3 //当计数器满却没收到回复时,显示错误
{ TR1=0;
if(P3_3)
{warning1(1);
delay_ms(8000);}
ge=11,p1=11,p=11;
lcd12864(ge,p1,p);
delay_ms(1);
next0=1;
delay_ms(20000); //防止未收到的信号对下次产生干扰
}
/****************************************
显示状态
*//***************************************/
void state()
{ sendcd(0,0x8d);
if(P3_3)
{sendcd(1,tab1[0]);
sendcd(1,tab1[1]);}
else
{sendcd(1,tab1[2]);
sendcd(1,tab1[3]);}
sendcd(0,0x9a );
if(!P3_4)
{sendcd(1,tab1[4]);
sendcd(1,tab1[5]);}
else
{sendcd(1,tab1[6]);
sendcd(1,tab1[7]);}}
/****************************************
主函数
*//***************************************/
void main()
{ init();
open();
sta te();
test();
}
延时程序delay:
由于一句c语句会耗费多个机器周期的时间,因此不方便定时发射40KHZ左右的方波。所以我们采用汇编来进行延时,每隔13个机器周期输出端口取一次反,从而发出42KHZ左右的方波。
?PR?DELAY SEGMENT CODE;
PUBLIC DELAY;
RSEG ?PR?DELAY;
DELAY:
SETB EA
SETB ET1
MOV R1,#10 //发射5个方波
SETB TR1
cpl 0xb0 //0xb0为输出端口P3_0的地址
AGN: MOV r0,#4
DJNZ r0,$
NOP
cpl 0xb0
DJNZ R1,AGN RET
END
心得体会
本实验是一次关于超声波测距仪的设计性实验,本小组按照实验教学的安排在第一周的前3天以集体查阅资料并讨论的方式确定了实验方案和其原理图。在讨论过程中各成员各抒己见,奇思妙想,兴致勃勃地设计了相应的提高功能,对本次实验极有兴趣和想法。
周四上交元件清单领取器件后大家就按部就班的完成自己的任务,做硬件的同学认真仔细地对照电路原理图布置电路,以分块的形式一一完成,尽自己最大的努力力求电路可观可用,遇到不明白的地方大家就一起讨论,然后定出结论。做软件的同学也积极刻苦的进行单片机的学习及对应模块程序的研究及编写,常常废寝忘食,十分投入,在第二周周末成功完成基本功能的软硬件。
第三周我们顺利进入软硬件配合调试的过程,此过程属本次实验中比较困难和纠结的部分。起初调试时并没有得到任何结果,可我们并没有灰心,大家一起查阅资料检查电路经过多次调试,利用示波器验证了超声波发射端可以发射42KHZ的方波,但接收端依然接收不到信号。于是我组成员主动询问了其他组的同学,经过讨论和排查修改了接收端的元件值,其中最重要的莫过于CX20106芯片2脚的反馈电阻,起初我们所用电阻阻值过大,导致负反馈过强,从而不能正确地放大信号以致无回波。意识到此问题后我们换了一个8Ω的电阻发现可以接收到回波,液晶屏所显示的所测距离值也符合要求,我们为此还特地咨询了老师,老师为我们解答了疑惑,我们为自己的进步十分开心。之后经过多次测量发现单发时测距没有连发所能测到的远,经分析我们大胆猜测是因为单发事发射的波少且实验室障碍物过多,超声波在传输的过程中受到干扰衰减了。
通过本次实验增强了我们对单片机的认识并提高了我们C程序的编写能力,也让我们理解了超声波测距仪的原理。通过硬件的制作极大地提高了我们的动手能力,调试过程进一步锻炼了我们发现问题解决问题的能力。在此次实验中本组成员积极投入,团队意识强,开动脑筋解决了一个又一个的问题,很有成就。此次实验为我们以后的实验学习奠定了坚实的基础!
参考资料:
[1] 何琳.声学理论与工程应用[M].科学出版社,2006.
[2] 李丽霞.单片机在超声波测距中的应用[J] .电子技术,2002 ,29 (6) :7-9.
[3] 宋永东,周美丽,白宗文.高精度超声波测距系统设计[J],《现代电子技术》2008 年第 15 期总第 278 期.