基于51单片机倒车雷达系统.docx
《基于51单片机倒车雷达系统.docx》由会员分享,可在线阅读,更多相关《基于51单片机倒车雷达系统.docx(28页珍藏版)》请在冰豆网上搜索。
基于51单片机倒车雷达系统
基于超声波的倒车雷达系统
电子0601郑灵光
电子0602潘建标,陈永根
摘要
随着科技的发展,人们生活水平的提高,城市发展建设加快,城市给交通系统也有较大发展,其状况不断改善。
但是,由于多种原因合成时间住的许多不可预见因素,城市还是经常出现大量的交通事故,特别是倒车时,看不到后方而导致大量的交通事故。
因此,设计出好的倒车雷达系统,对于减少城市的交通事故将有一个很好的控制作用。
当然这要求倒车雷达系统,具有精度高,抗干扰强,价格应该低,适宜推广等特点,这样基于超声波的测距系统,完全可以胜任此任务。
本设计采用以AT89C51单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法。
整个电路采用模块化设计,由主程序、发射子程序、接收子程序、显示子程序等模块组成。
各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。
在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。
该设计设抗干扰能力较好,实时性良好,误差可以达到mm级,可以有效地解决汽车倒车作用。
本系统在倒车时不断测量汽车尾部与其后面障碍物的距离,并随时显示其距离,并用语音及时提示。
在不同的距离范围内,不同的温度下测出距离,发出报警
信号,以提高汽车倒车时的安全性的仪器。
第一章绪论…………………………………………3
1.1课题背景,目的和意义………………………………………3
1.2两种常用的超声波测距方案…………………………………3
第2章超声波测距系统设计…………………………………3
2.1超声波测距的原理………………………………4
2.2超声波测距系统电路的设计…………………………4
2.2.1总体设计方案……………………………………4
2.2.2发射电路的设计………………………………4
2.2.3接收电路的设计……………………4
2.2.4显示模块的设计………………………………………5
2.2.5温度补偿模块设计………………………………5
2.2.6语音处理模块………………………………………5
第三章超声波测距系统的软件设……………………………..5
3.1总体流程图……………………………..5
3.2程序及分析……………………………..6
第四章电路调试及误差分析……………………………..7
4.1电路的调试……………………………..7
4.2系统的误差分析……………………………..7
第5章功能扩展………………………………………7
参考文献……………………………..7
附录:
………………………………………8-22
第1章绪论
1.1课题背景,目的和意义
由于社会的进步,经济的发展和生活水平的不断提高,汽。
车数量逐年增长,造成道路交通拥挤不堪,交通事故频繁发生
汽车倒车报警器:
在倒车时不断测量汽车尾部与其后面障碍物的距离,并随时显示其距离,并用语音及时提示。
在不同的距离范围内,不同的温度下测出距离,发出报警信号,以提高汽车倒车时的安全性的仪器。
2.2两种常用的超声波测距方案
2.2.1基于CPLD的超声波测距系统
CPLD模块主要由发射模块,16位计时计数器模块,接收模块,顺序执行计数器模块和六选一数据选择器模块五部分组成。
其总体框图如图1所示。
CPLD模块主要完成超声波的发射、接收和时间的测量。
超声波发射模块启动40KHz的超声波发射,当发射脉冲串达到设定值后,关闭超声波的发射,同时启动六路计时计数器模块开始计时;信号经过障碍物反射回来,接收电路接收到回波后,将其进行整形,作为接收模块的信号,当接收完回波脉冲信号后,接收模块输出端发出信号,关闭计时计数器停止工作;当所有的回波接收完毕后,顺序执行计数器输出端发出信号启动单片机开始接收数据,通过顺序执行计数器的计数值、数据选择器的选择端与计时计数器的控制端分别读取六路不同的计数值。
所有的数据读取完后,清除计时计数器的计数值,准备下一次的循环计数。
2.2.1基于单片机的超声波测距系统
本警器由单片机来控制。
整个控制系统由超声波发射电路、超声波接收电路、报警电路、复位电路、显示电路组成。
实行实时数字显示测得的距离,在不同的距离范围内发出不同的报警信号,驾驶员可根据个人需要调整设置报警距离,以减少事故的发生。
本作品将采用此种方法。
第二章超声波测距系统设计
2.1超声波测距的原理
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
超声波在空气中的传播速度为c,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:
s=ct/2。
这就是所谓的时间差测距法。
2.2超声波测距系统电路的设计
2.2.1总体设计方案
该设计总体基于51,包括发射模块,接收模块,显示模块,语音模块,温度补偿模块。
由发射电路发射超声波,51计数器从0开始计时,当超声波反射回来,接收电路接收,51停止计时,将所计得得数转化成十进制n,因为使用的12MHz晶体作时钟基准的89C51单片机定时器能方便的计数到1μs的精度,因此系统采用89C51定时器能保证时间误差在1mm的测量范围内。
,则将n与1us相乘即可以得到时间,从而利用超声波测距的原理就可以判断距离以是否利用利用凌阳61版的语音处理功能,进行报警及播放当前的距离,温度和超声波传播速度。
再者显示器也将显示距离,温度,及超声波传播速度。
2.2.2发射电路的设计
用单片机直接产生的40khz信号经过74ls04放大后直接驱动超声波发射探头。
2.2.3接收电路的设计
将超声波接收探头接收的信号经cx20106红外线专用芯片处理接收,然后送给单片机。
2.2.4显示模块的设计
使用1602液晶屏,与单片机连接,将单片机的距离,温度,超声波数度(声速)传送给液晶屏显示出来。
2.2.5温度补偿模块设计
因为声速在不同温度下的传播速度是不同的,根据补偿公式C=C0+0.607×T℃C0为零度时的声波速度332m/s;T为实际温度(℃)。
采用18b20温度传感器测温,根据测得的温度,来确定具体的声速。
2.2.6语音处理模块
根据手中的现有的材料,利用凌阳61版的语音处理功能,播放出:
“倒车请注意”并通过51单片机和凌阳的串口通讯,将51测得的距离,温度,声速数据传给凌阳,然后通过凌阳的语音处理将其播报出来。
第三章超声波测距系统的软件设计
3.1总体流程图
3.1.1凌阳模块流程图
3.1.251单片机模块
3.2程序及分析
(见附录)
第4章电路调试及误差分析
5.1电路的调试(盲区问题)
由于超声波发射探头在发射超声波时,接受探头也会接受到超声波,所以在发射超声波时,必须先关外部中断,延时一段时间,进而消除回波干扰,所以在测量中会有盲区出现,所以硬件调试中主要的就是调节延时时间,使盲区达到最小,进而跳高测量的精度。
通过硬件调试,来控制发射脉冲波的个数以及延时时间,并在实际测量中测出三种不同测距模式下的盲区,分别约为5cm,20cm及45cm。
、5.2系统的误差分析28
根据超声波测距公式L=C×T,可知测距的误差是由超声波的传播速度误差和测量距离传播的时间误差引起的。
1.时间误差
当要求测距误差小于1mm时,假设已知超声波速度C=344m/s(20℃室温),忽略声速的传播误差。
测距误差s△t<(0.001/344)≈0.000002907s即2.907ms。
在超声波的传播速度是准确的前提下,测量距离的传播时间差值精度只要在达到微秒级,就能保证测距误差小于1mm的误差。
使用的12MHz晶体作时钟基准的89C51单片机定时器能方便的计数到1μs的精度,因此系统采用89C51定时器能保证时间误差在1mm的测量范围内。
2. 超声波传播速度误差
超声波的传播速度受空气的密度所影响,空气的密度越高则超声波的传播速度就越快.
第5章功能扩展
通过串口与PC机进行通讯,并利用所学知识,用VB写了了一个接受模块,将51单片机中的数据经串
口传到电脑上显示。
参考文献33
单片机原理与控制技术机械工业出版社
数字电子技术教程清华大学出版社
模拟电子技术教程清华大学出版社
胡萍.超声波测距仪的研制.计算机与现代化
时德刚,刘哗.超声波测距的研究.计算机测量与控制
超声波测距原理
附录:
//////////////主文件程序main//////////////////////////////////////////////
3.2.1超声波测距
#include
#include
#include"18B20.h"
#include"intrins.h"
#include"LCD1602.H"
#include"Delay1.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharucHigh_time,ucLow_time;//超声波传输时间
ucharucFlag;//中断标志位
ucharfrq;//音乐频率节拍问题
floatc;//不同温度下的超声波传播速度
/*************************针脚定义********************************/
sbitHz40k_out=P3^6;//40k信号输出端
sbitMod_short=P1^4;
sbitMod_long=P1^5;
sbitMod_out=P1^7;//判断数据是发给电脑机还是凌阳版
sbitKey_tran=P1^6;//发送数据,开始通讯
/*****************************************************************/
/**********************函数声明***********************************/
voidTmr0_int(void);
voidInt0_int(void);
voidSend_40khz_long(void);//发射超声波
voidSend_40khz_medium(void);
voidSend_40khz_short(void);
intDistance_count();//距离转换函数
floatCompensate_c();//温度补偿函数
voidDisplay_dis(void);//距离显示函数
voidDisplay_tem(void);//温度显示函数
voidDisplay_c(void);//声速显示函数
voiddelayms(unsignedcharms);
voidTmr1_int(void);
/***********************子程序********************************/voidTmr0_int(void)
{TMOD|=0x01;//tmr0方式1,16位计数
EA=0;//关总中断
ET0=0;//关T0中断
TR0=0;//停止计时器0
TH0=0X00;
TL0=0X00;
}
//////////////////////////////////////////////////////////////
voidInt0_int(void)
{IT0=0;//低电平沿触发
EA=0;//关总中断
EX0=0;//屏蔽中断
}
/////////////////////////////////////////////////////////////
voidUstart_int(void)
{SCON|=0x50;//串口方式1,允许接收
TMOD|=0x20;//定时器1定时方式2
//TCON=0x40;//设定时器1开始计数
TH1=0xF3;//12MHz2400波特率
TL1=0xF3;
TR1=0;//关闭定时器
}
///////////////////////////////////////////////////////////
voidUstart_send_lingyang(void)
{ucharsend[3];
uintVoice_v;
send[0]=Distance_count();
send[1]=Distance_count()>>8;
TR1=1;//启动定时器
TI=0;
SBUF=send[1];//先发高位再发低位
while(!
TI);//等待发送完成
TI=0;
while(!
RI);//等待接收完成
RI=0;
//delay_ms(200);
SBUF=send[0];
while(!
TI);
TI=0;
send[0]=Read_Temperature()/10;
send[1]=(Read_Temperature()/10)>>8;//发送的为实际温度的十倍37.2C则发送372
while(!
RI);//等待接收完成
RI=0;
//delay_ms(200);
SBUF=send[1];
while(!
TI);
TI=0;
while(!
RI);//等待接收完成
RI=0;
//delay_ms(200);
SBUF=send[0];
while(!
TI);
TI=0;
Voice_v=Compensate_c();//将浮点型转换为整型
send[0]=Voice_v;
send[1]=Voice_v>>8;
while(!
RI);//等待接收完成
RI=0;
//delay_ms(200);
SBUF=send[1];
while(!
TI);
TI=0;
while(!
RI);//等待接收完成
RI=0;
//delay_ms(200);
SBUF=send[0];
while(!
TI);
TI=0;
while(!
RI);//等待接收完成
RI=0;
TR1=0;//关闭定时器
}
//////////////////////////////////////////////////////////////////////////
voidUstart_send_pc(void)
{
ucharsend[4];
uintVoice_v;
send[0]=Distance_count()/1000+0x30;
send[1]=Distance_count()%1000/100+0x30;
send[2]=Distance_count()%100/10+0x30;
send[3]=Distance_count()%10+0x30;
TR1=1;//启动定时器
TI=0;
SBUF=send[0];
while(!
TI);
TI=0;
SBUF=send[1];
while(!
TI);
TI=0;
SBUF=send[2];
while(!
TI);
TI=0;
SBUF=send[3];
while(!
TI);
TI=0;
send[0]=(Read_Temperature()/10)/100+0x30;
send[1]=(Read_Temperature()/10)%100/10+0x30;//发送的为实际温度的十倍37.2C则发送372
send[2]=(Read_Temperature()/10)%10+0x30;
SBUF=send[0];
while(!
TI);
TI=0;
SBUF=send[1];
while(!
TI);
TI=0;
SBUF=send[2];
while(!
TI);
TI=0;
Voice_v=Compensate_c();//将浮点型转换为整型
send[0]=Voice_v/100+0x30;
send[1]=Voice_v%100/10+0x30;
send[2]=Voice_v%10+0x30;
SBUF=send[0];
while(!
TI);
TI=0;
SBUF=send[1];
while(!
TI);
TI=0;
SBUF=send[2];
while(!
TI);
TI=0;
TR1=0;//关闭定时器
}
voidKey_scan(void)
{Key_tran=1;//写1准备开始读
if(Key_tran==0)
{delay_ms(10);
while(!
Key_tran);//等待按键放开
if(Mod_out==1)
Ustart_send_lingyang();
else
Ustart_send_pc();
}
}
////////////////////////////////////////////////////////////////////////////////////////
voidSend_40khz_short(void)//从P1.0发出40KHz的脉冲短波测量短距离
{ucharn,p;
for(n=0;n<1;n++)//输出1个脉冲
{Hz40k_out=1;
for(p=0;p<3;p++);
Hz40k_out=0;
for(p=0;p<2;p++);
Hz40k_out=0;
}
}
/////////////////////////////////////////////////////////////
voidSend_40khz_medium(void)//从P1.0发出40KHz的脉冲中波测量中距离
{ucharn,p;
for(n=0;n<2;n++)//输出2个脉冲
{Hz40k_out=1;
for(p=0;p<3;p++);
Hz40k_out=0;
for(p=0;p<2;p++);
Hz40k_out=0;
}
}
////////////////////////////////////////////////////////////
voidSend_40khz_long(void)//从P1.0发出40KHz的脉冲长波测量长距离
{ucharn,p;
for(n=0;n<40;n++)//输出40个脉冲
{Hz40k_out=1;
for(p=0;p<3;p++);
Hz40k_out=0;
for(p=0;p<2;p++);
Hz40k_out=0;
}
}
//////////////////////////////////////////////////////////
floatCompensate_c()//温度补偿公式
{c=331.45+0.607*Read_Temperature()/100;
returnc;
}
/////////////////////////////////////////////////////////
intDistance_count()//距离计算函数
{floatTemp;
Temp=ucHigh_time*256+ucLow_time-96;//96为实际调试中距离的调整
Temp=(Temp/1000)/2;
Temp*=Compensate_c();//毫米
returnTemp;
}
///////////////////////////////////////////////////////
voidDisplay_dis(void)//显示距离
{switch(ucFlag)
{case1:
{LCD_gotoxy(0,0);
write_string_LCD1602("Distance:
");
if(Distance_count()/1000>0)//判读显示位数
write_number(Distance_count(),4);
elseif(Distance_count()/100>0)
write_number(Distance_count(),3);
elseif(Distance_count()/10>0)
{write_number(Distance_count(),2);write_string_LCD1602("");}
else
{write_number(Distance_count(),1);write_string_LCD1602("");}
write_string_LCD1602("mm");
break;
}
case2:
{LCD_gotoxy(0,0);
write_string_LCD1602("Distance:
wrong");
break;
}
default:
{LCD_gotoxy(0,0);
write_string_LCD1602("Begin");
break;
}
}
}
///////////////////////////////////////////////////////////////////
voidDisplay_tem(void)//显示温度
{LCD_gotoxy(1,0);
write_string_LCD1602("T:
");
if(Read_Temperature()/100>=100)
write_number(Read_Temperature()/100,3);
else
write_number(Read_Temperature()/100,2);
write_string_LCD1602(".");
write_number(Read_Temperature()%100/10,1);
write_string_LCD1602("C");
}
////////////////////////////////////////////