超声波测距仪
目录
一.超声波测距原理…………………………………………………………………………3
二.超声波测距硬件部分……………………………………………………………………4
1.单片机部分及显示
………………………………………………………………5
2.发射部分………………………………………………………………………………7
3.接受部分………………………………………………………………………………7
三.超声波测距仪软件部分 ……………………………………………………………… 9
四.串口 …………………………………………………………………………………… 13
五.调试 …………………………………………………………………………………… 11
六. 实验心得……………………………………………………………………………… 15
七. 实验结果 ………………………………………………………………………………16
八. 参考文献 ………………………………………………………………………………17
附录一 ……………………………………………………………………………………… 18
附录二 …………………………………………………………………………………………21
一.超声波测距仪原理
超声波发生器内部结构有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波本时,将压迫压电晶片作振动,将机械能转换为电信号,就成为超声波接收器。在超声探测电路中,发射端得到输出脉冲为一系列方波,其宽度为发射超声的时间间隔,被测物距离越大,脉冲宽度越大,输出脉冲个数与被测距离成正比。超声测距大致有以下方法:① 取输出脉冲的平均值电压,该电压 (其幅值基本固定 )与距离成正比,测量电压即可测得距离;② 测量输出脉冲的宽度,即发射超声波与接收超声波的时间间隔 t,故被测距离为 S=1/2vt。本测量电路采用第二种
。由于超 声波 的声速 与温度有关,如果温度变化不大,则可认为声速基本不变 。如果测距精度要求很高,则应通 过温度补偿 的方法加以校正。超声波测距适用于高精度的中长距离测量。因为超声波在
空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测量精度理论上可以达到毫米级。
超声波仿真采用AT89C52,实际运用AT89S52单片机,晶振:11.0592M,单片机用P1.0口输出超声波换能器所需的40KHZ方波信号,利用外中断1口监测超声波接收电路输出的返回信号,显示电路采用简单的4位共阳LED数码管,断码用74HC245,位码用三极管驱动。
超声波测距的算法
: 超声波在空气中传播速度为每秒钟340米(15℃时)。X2是声波返回的时刻,X1是声波发声的时刻,X2-X1得出的是一个时间差的绝对值,假定X2-X1=0.03S,则有340m×0.03S=10.2m。由于在这10.2m的时间里,超声波发出到遇到返射物返回的距离,
超声波测距器的系统框图如下图所示:
二. 超声波测距仪硬件部分
超声波学习板采用仿真用了AT89C512,实物用的是或AT89S52单片机,晶振:11.0592M,单片机用P1.0口输出超声波换能器所需的40KHZ方波信号,利用外中断0口监测超声波接收电路输出的返回信号,显示电路采用简单的4位共阳LED数码管,断码用74HC245,位码用三极管驱动. 主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。采用AT89S52来实现对CX20106A红外接收芯片和T40-16系列超声波转换模块的控制。单片机通过P1.0引脚经反相器来控制超声波的发送,然后单片机不停的检测INT0引脚,当INT0引脚的电平由高电平变为低电平时就认为超声波已经返回。T1计数器所计的数据就是超声波所经历的时间,通过换算就可以得到传感器与障碍物之间的距离。
该测距装置是由超声波传感器、单片机、发射/接收电路和LED 显示器组成。
传感器输入端与发射接收电路相连,接收电路输出端与单片机相连接,单片机的输
出端与显示电路输入端相连接。其时序图如图1-2 所示。
1.单片机系统及显示电路
单片机采用89S51或其兼容系列。采用12MHz高精度的晶振,以获得较稳定的时钟频率,减小测量误差。单片机用P1.0端口输出超声波转化器所需的40KHz方波信号,利用外中断0口检测超声波接受电路输出的返回信号。显示电路采用简单实用的4位共阳LED数码管,段码用74LS245驱动,位码用PNP三极管驱动。单片机系统及显示电路如下图所示.
74HC245:总线驱动器,典型的TTL型三态缓冲门电路。
由于单片机等CPU的数据/地址/控制总线端口都有一定的负载能力,如果负载超过其负载能力,一般应加驱动器。
另外,也可以使用74HC244等其他电路,74HC244比74HC245多了锁存器。
74HC245 引脚图
第1脚DIR,为输入输出端口转换用,DIR=“1”高电平时信号由“A”端输入“B”端输出,DIR=“0”低电平时信号由“B”端输入“A”端输出。
第2~9脚“A”信号输入输出端,A1=B1、、、、、、A8=B8,A1与B1是一组,如果DIR=“1”OE=“0”则A1输入B1输出,其它类同。如果DIR=“0”OE=“0”则B1输入A1输出,其它类同。
第11~18脚“B”信号输入输出端,功能与“A”端一样,不再描述。
第19脚OE,使能端,若该脚为“1”A/B端的信号将不导通,只有为“0”时A/B端才被启用,该脚也就是起到开关的作用。
第10脚GND,电源地。
第20脚VCC,电源正极。
2.发射部分
由单片机产生的40kHz 的方波需要进行放大,才能驱动超声波传感器发射超声波,发射驱动电路其实就是一个信号放大电路,本次试验所选用的是74HC04集成芯片,图1-3 为发射电路图。
74HC04 逻辑图:
3.接收电路
超声波接收头接收到超声波后,转换为电信号,此时的信号比较弱,必需经过放大。本系统采用了CX20106A对接收到的信号进行放大,接收电路如下图 所示。
使用CX20106A集成电路对接收探头受到的信号进行放大、滤波。其总放大增益80db。以下是CX20106A的引脚注释。
1脚:超声信号输入端,该脚的输入阻抗约为40kΩ。
2脚:该脚与地之间连接RC串联网络,它们是负反馈串联网络的一个组成部分,改变它们的数值能改变前置放大器的增益和频率特性。增大电阻R1或减小C1,将使负反馈量增大,放大倍数下降,反之则放大倍数增大。但C1的改变会影响到频率特性,一般在实际使用中不必改动,推荐选用参数为R1=4.7Ω,C1=1μF。
3脚:该脚与地之间连接检波电容,电容量大为平均值检波,瞬间相应灵敏度低;若容量小,则为峰值检波,瞬间相应灵敏度高,但检波输出的脉冲宽度变动大,易造成误动作,推荐参数为3.3μf。
4脚:接地端。
5脚:该脚与电源间接入一个电阻,用以设置带通滤波器的中心频率f0,阻值越大,中心频率越低。例如,取R=200kΩ时,f0≈42kHz,若取R=220kΩ,则中心频率f0≈38kHz。
6脚: 该脚与地之间接一个积分电容,标准值为330pF,如果该电容取得太大,会使探测距离变短。
7脚:遥控命令输出端,它是集电极开路输出方式,因此该引脚必须接上一个上拉电阻到电源端,推荐阻值为22kΩ,没有接受信号是该端输出为高电平,有信号时则产生下降。
8脚:电源正极,4.5~5V。
三.超声波测距仪软件部分
控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。
模块工作原理:
(1)采用 IO 触发测距,给至少10us 的高电平信号;
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO 输出一高电平,高电平持续的时间就是
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
程序
图下图,(a)为主程序流程图,(b)为定时中断子程序流程图,(c)
为外部中断子程序流程图。
1. 延时
void delay_20us()
{ uchar bt ;
for(bt=0;bt<100;bt++);
}
2. 中断程序
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd; //写入定时器0初始值
TL0=0x77;
switch(flag)
{
case 0x00:P0=ge; P2=0xfd;flag++;break;
case 0x01:P0=shi;P2=0xfe;flag++;break;
case 0x02:P0=bai;P2=0xfb;flag++;break;
case 0x03:P0=qian;P2=0xf7;flag=0;break;
}
}
3. 显示部分
采用的共阳的显示管
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]={0,0,0,0}; //测距接收缓冲区
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd; //写入定时器0初始值
TL0=0x77;
switch(flag)
{
case 0x00:P0=ge; P2=0xfd;flag++;break;
case 0x01:P0=shi;P2=0xfe;flag++;break;
case 0x02:P0=bai;P2=0xfb;flag++;break;
case 0x03:P0=qian;P2=0xf7;flag=0;break;