基于单片机控制的超声波雷达系统文档格式.docx
《基于单片机控制的超声波雷达系统文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机控制的超声波雷达系统文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
T为测量距离传播的时间差
(T为发射到接收时间数值的一半)。
本设计通过从单片机TX脚(P3.3)输出40KH的方波信号,即从该引脚连续发出高低电平,产生方波,方波的个数一般为10个左右,发出后启动定时器,开始计时,此时,超声波发射头(T端)开始发出超声波,当发出的超声波被前方的障碍物返射回来,返射回来的超声波被接收探头(R)接收到,此时,单片机的RX引脚(P3.2)会产生一个从高电平到低电平的跳变,从而引起中断。
此时,停止计时,保存计时的时间。
在本设计中我们根据以下公式:
测量距离=(时间*声速(340M/S))/2
可以算出测量距离。
然后我们再通过一定的函数算法和C语言子程序的调用与整合,使测量距离显示在事先设计好的数码管显示电路上。
本设计的精度为0.1cm。
本设计用Stc8989c52单片机作为主控制器,用动态扫描法实现数码管数字显示,超声波驱动信号用单片机的定时器完成,超声波测距器的系统框图
二、系统组成
系统主要有软件部分和硬件部分组成。
1.硬件部分介绍
硬件部分主要由单片机系统及显示电路、超声波发射电路和超声
波检测接收电路等三部分组成。
采用stc89c52单片机来实现对
CX20106A红外接收芯片和CD4609系列超声波转换模块的控制。
单片机通过P3.3引脚经反相器来控制超声波的发送,然后单片机不
停的检测INT0引脚,当INT0引脚的电平由高电平变为低电平时就
认为超声波已经返回。
计数器所计的数据就是超声波所经历的时间,
通过换算就可以得到传感器与障碍物之间的距离。
本设计利用的是压电超声波转换器,其原理是:
利用压电晶体谐振工作。
它有两个压电晶片和一个共振板。
当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动产生超声波,这时它就是一超声波发生器;
如没加电压,当共振板接受到超声波时,将压迫压电振荡器作振动,将机械能转换为电信号,这时它就成为超声波接受转换器。
硬件部分电路图如下:
a.超声波发射电路
b.单片机控制电路
c.超声波接收电路图
2.软件部分介绍
软件部分主要由主程序、超声波发生子程序、超声波接收中
断程序及显示子程序等部分组成。
超声波发生子程序的作用是通过P3.3端口发送2个左右的超声波信号频率约40KHz的方波,脉冲宽度为12us左右,同时把计数器T0打开进行计时。
超声波测距器主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(INT0引脚出现低电平),立即进入中断程序。
进入该中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。
如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值
0以表示此次测距不成功。
a.以下是程序流程图
b.以下是本设计的程序部分:
#include<
reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
sbitTx=P3^3;
//产生脉冲引脚
sbitRx=P3^2;
//回波引脚
sbitfmq=P1^7;
ucharcodeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uintdistance[4];
//测距接收缓冲区
ucharge,shi,bai,temp,flag,outcomeH,outcomeL,i;
//自定义寄存器
bitsucceed_flag;
//测量成功标志
voidconversion(uinttemp_data)//显示数据转换程序
{
ucharge_data,shi_data,bai_data;
bai_data=temp_data/100;
temp_data=temp_data%100;
//取余运算
shi_data=temp_data/10;
temp_data=temp_data%10;
ge_data=temp_data;
bai_data=SEG7[bai_data];
shi_data=SEG7[shi_data]&
0x7f;
ge_data=SEG7[ge_data];
EA=0;
bai=bai_data;
shi=shi_data;
ge=ge_data;
EA=1;
}
//20us延时函数
voiddelay_20us()
{ucharbt;
for(bt=0;
bt<
38;
bt++);
//500us基准延时程序
voiddelay500us()
{
unsignedcharj;
for(j=0;
j<
57;
j++)
{;
}
//1ms基准延时程序
voiddelay1ms(unsignedinti)
while(i--)
{
115;
}
//产生1KHZ频率声音的函数
voidbeep()
fmq=0;
delay1ms(500);
fmq=1;
//主程序
voidmain(void)
{uintdistance_data,a,b;
ucharCONT_1;
i=0;
flag=0;
Tx=0;
//首先拉低脉冲输入引脚
TMOD=0x11;
//定时器0,定时器1,16位工作方式
TR0=1;
//启动定时器0
IT0=0;
//由高电平变低电平,触发外部中断
ET0=1;
//打开定时器0中断
EX0=0;
//关闭外部中断
//打开总中断0
while
(1)//程序循环
EA=0;
Tx=1;
delay_20us();
//产生一个20us的脉冲,在Tx引脚
while(Rx==0);
//等待Rx回波引脚变高电平
succeed_flag=0;
//清测量成功标志
EX0=1;
//打开外部中断
TH1=0;
//定时器1清零
TL1=0;
TF1=0;
//
TR1=1;
//启动定时器1
while(TH1<
50);
//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0;
//关闭定时器1
if(succeed_flag==1)
{
distance_data=outcomeH;
//测量结果的高8位
distance_data<
<
=8;
//放入16位的高8位
distance_data=distance_data|outcomeL;
//与低8位合并成为16位结果数据
distance_data*=12;
//因为定时器默认为12分频
distance_data/=58;
//微秒的单位除以58等于厘米
}//为什么除以58等于厘米,Y米=(X秒*344)/2
//X秒=(2*Y米)/344==》X秒=0.0058*Y米==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0;
//没有回波则清零
distance[i]=distance_data;
//将测量结果的数据放入缓冲区
i++;
if(i==3)
{
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
a=distance_data;
if(b==a)CONT_1=0;
if(b!
=a)CONT_1++;
if(CONT_1>
=3)
CONT_1=0;
b=a;
conversion(b);
if(b>
0&
&
b<
200)
fmq=0;
delay1ms(100);
fmq=1;
}
}
i=0;
}
//外部中断0,用做判断回波电平
INTO_()interrupt0//外部中断是0号
outcomeH=TH1;
//取出定时器的值
outcomeL=TL1;
succeed_flag=1;
//至成功测量的标志
//定时器0中断,用做显示
timer0()interrupt1//定时器0中断是1号
TH0=0xfd;
//写入定时器0初始值
TL0=0x77;
switch(flag)
{case0x00:
P0=ge;
P2=0x7f;
flag++;
break;
case0x01:
P0=shi;
P2=0xbf;
case0x02:
P0=bai;
P2=0xdf;
flag=0;
}
本设计当测出的距离小于20cm时,单片机通过调用一个1000HZ的音频子程序发出周期性的声音警报,同时伴随LED警示灯周期性的闪烁,从而起到报警作用。
三.小结
利用本系统对0cm~60cm范围进行了多次测试,经补偿后最大误差达1cm,线性度、稳定性和重复性都比较好。
系统具有结构简单、体积小、实时数码管显示和报警、抗干扰性能好等优点。
系统的误差主要来自于发射探头发出的超声波是呈喇叭状扩散传播、被测物的表面不光滑且不一定垂直于两探头的轴线而导致所反射回来的波也许是从不同点获得,此外电子元器件自身的时延、干扰等也造成一定影响。
本设计电路相对简单,编程方便且成本较低,随着设计电路的进一步完善与改进,它一定会具有广泛的商业前景与实际应用价值。
参考文献:
【1】张洪润,《传感器应用设计300例(上册)》,北京航空航天大学出版社,出版日期2008-10-01
【2】赵燕,《传感器原理及应用》,北京大学出版社,出版日期
2010-02-01
..