
汽车倒车雷达系统的设计与实现2009-09-30 10:22引 言
随着中国经济的持续增长和汽车价格的持续下降,越来越多的家庭拥有了私家车。在享受汽车给人们带来便利的同时,由于倒车而产生的问题也日益突出。据初步调查统计,15%的汽车事故是由汽车倒车“后视”不良造成的。早期的倒车防撞仪可以测试车后一定距离范围的障碍物从而发出警报,后来发展到根据距离分段报警。随着人们对汽车驾驶辅助系统易用性要求的提高,对汽车倒车雷达的要求也越来越高。本文设计的基于单片机AT89C51的倒车雷达,采用美国DAL-LAS半导体羡神凳公司生产的DS18B20单总线型数字温度传感器进行温度补偿提高了测距精度,采用OC-MJ12232C_3液晶显示模块对车兄旅距进行实时显示和ISD4004语音芯片实现了倒车雷达语音报警的功能,并可以根据距离的不同做出不同的语音提示。由于采用了超声波专用集成电路芯片LM1812,有效地提高了系统的可靠性和稳定性。
1 超声波测距原理
超声传感器是一种将其他形式的能转变为所需频率的超声能或是把超声能转变为同频率的其他形式的能的器件。超声波测距原理是利用单片机在超声波传感器发射超声波的同时单片机的T0计数器开始计数,当检测到回波信号后单片机的T0计数器停止计数。测得的时间和声速相乘就可以得到超声波往返过程中走过的路程,所以所测距离S为声波传输距离的一半:
S=Ct/2
式中:S为超声波发射点与被测障碍物之间的距离;C为声波在介质中的传输速率;t为超声波发射到超声波返回的时间间隔。声波在空气中传输速率为:
式中:T为绝对温度;C0=331.45 m/s。
采用单片机脉冲计数的方法,可精确测出t的值。假设单片机幕�髦芷谖猅机,则有t=NT机,则测得的距离为:
2 系统硬件电路设计
2.1 系统结构
系统框图如图1所示。该系统由单片机控制电路、超声波发射与接收电路、温度补偿电路、LCD显示电路以及语音报警电路等几部分组成。单片机AT89C51是整个系统的核心部件,协调各部分电路的工作。单片机在超声波信号发射的同时开始计时,超声波信号在空气中传播遇到障碍物后发生反射,反射的回波信号经过处理后输入到单片机的INTO端产生中断,计数器停止计数。通过计数器测得的脉冲数可得到超声波信号往返所需要的时间,从而达到测距的目的。超声波探头选用TCF40-25TR1型收发一体式超声波传感器,谐振频率为40 kHz;超声发射与接收电路采用LM1812专业集成电路,不仅外围元件较少,电路简单,而且有更好的稳定性及可靠性;温度补偿电路采用一线制数字温度传感器DS18B20,利用声速和温度之间的关系对声速进行校正,从而消除温度对声速的影响;语音报警电路瞎闷采用ISD4004,可实现汽车倒车过程中的语音报警。
2.2 单片机控制电路
系统控制部分的核心是ATMEL公司生产的AT89C51。AT89C51采用40引脚的双列直插式封装(DIP)形式,内部由CPU,4 KB的ROM,256 B的RAM,2个16位的定时/计数器T0和T1,4个8位的I/O端口和一个全双工串行通信口等部分组成。AT89C51单片机具有系统结构简单,成本低,可靠性高,低功耗等特点。特别是内部集成了4 KB的FLASH程序存储器,使单片机系统的结构更加简单,也使其得到了广泛的应用。同时,它还具有高级语言编程的特点,指令丰富,软件开发简单。AT89C51单片机是整个系统的核心部件,其作用是控制超声波专用集成芯片LM1812的发射和接收,对计时器的计数结果进行数据处理后送入LCD显示以及控制语音报警电路工作。
2.3 超声波发射和接收电路
本系统采用超声波专用集成电路LM1812作为超声波发射和接收电路的主控芯片。LM1812是一种通用型超声波收发器,主要用在各种各样的测距、定向和通信中。芯片包括一个脉冲调制C类发射器,一个高增益接收器,一个脉冲调制检测器及噪音抑制电路。LM1812第1脚外
vae.la
//*****************************************************
// ISD4002-89c51开发板演示例程 C51版本 *
// *
//*****************************************************
#include <reg51.h>
sbit SS = P1^0//片选
sbit SCLK = P1^1//ISD4003时钟
sbit MOSI = P1^2//数据输入
sbit MISO = P1^3//数据输出
sbit LED = P1^7//指示灯
sbit ISD_INT= P3^2//中断
sbit AN = P1^6//执行
sbit STOP = P1^5//复位
sbit PR = P1^4//PR=1录音? PR=0放音
void delay(unsigned int time) //延迟n微行姿秒
{
while(time!=0)
{
time--
}
}
void delayms(unsigned int time) //延型带橘迟n毫秒
{ TMOD=0x01
for(timetime>0time--)
{
TH0=0xfc
TL0=0x18
TR0=1
while(TF0!=1)
{}
TF0=0
TR0=0
}
}
//************************************
//ISD4002 spi串行发送子程序,8位数据
//************************************
void spi_send(unsigned char isdx)
{ unsigned char isx_counter
SS=0//ss=0,打开spi通信端
SCLK=0
for(isx_counter=0isx_counter<8isx_counter++) //先发低位再发高位,依次发送。
{ if ((isdx&0x01)==1)
MOSI=1
else
MOSI=0
isdx=isdx>>1
SCLK=1
delay(2)
SCLK=0
delay(2)
}
}
//*******************************
//发送stop指令
//*******************************
void isd_stop(void)
{ delay(10)
spi_send(0x30)
SS=1
delayms(50)
}
//*******************************
//发送上电指令,并延迟50ms
//*******************************
void isd_pu(void)
{ delay(10)
SS=0
spi_send(0x20)
SS=1
delayms(50)
}
//*******************************
//发送掉电指令,并延迟50ms
//*******************************
void isd_pd(void)
{ delay(10)
spi_send(0x10)
SS=1
delayms(50)
}
//*******************************
//发送play指令
//*******************************
void isd_play(void)
{
LED=0
spi_send(0xf0)
SS=1
}
//*******************************
//发送rec指令
//*******************************
void isd_rec(void)
{
LED=0
spi_send(0xb0)
SS=1
}
//*******************************
//发送setplay指令
//*******************************
void isd_setplay(unsigned char adl,unsigned char adh)
{
spi_send(adl)//发送卜团放音起始地址低位
adh=adh|0xe0
spi_send(adh)//发送放音起始地址高位
SS=1
}
//*******************************
//发送setrec指令
//*******************************
void isd_setrec(unsigned char adl,unsigned char adh)
{
spi_send(adl)//发送放音起始地址低位
adh=adh|0xa0
spi_send(adh)//发送放音起始地址高位
SS=1
}
//************************************
//芯片溢出,LED闪烁提醒停止录音
//************************************
void isd_overflow(void)
{
while(AN==0)
{LED=1
delayms(300)
LED=0
delayms(300)
}
}
//************************************
//检查芯片是否溢出(读OVF,并返回OVF值)
//************************************
unsigned char chk_isdovf(void)
{
SS=0
delay(2)
SCLK=0
delay(2)
SCLK=1
SCLK=0
delay(2)
if (MISO==1)
{ SCLK=0
SS =1//关闭spi通信端
isd_stop()//发送stop指令
return 1//OVF为1,返回1
}
else
{ SCLK=0
SS =1//关闭spi通信端
isd_stop()//发送stop指令
return 0//OVF为0,返回0
}
}
//************************************************************************
//主程序
//功能:1.录音时,按住AN键,LED点亮开始录音,松开AN即可停止录音
// 再次按下AN键,LED点亮开始录第二段音,依次类推,直到芯片溢出。
// 按stop键芯片复位
// 2.放音时,按一下AN键,即播放一段语音。 按stop键芯片复位。
//************************************************************************
void main(void)
{unsigned char ovflog
while(1)
{
P0=P1=P2=P3=0xff//初始化
while (AN==1) //等待AN键按下
{
if (AN==0) //按键防抖动
{delayms(20)}
}
isd_pu()//AN键按下,ISD上电并延迟50ms
isd_pd()
isd_pu()
if (PR==1) //如果PR=1则转入录音部分
{
delayms(500)//延迟录音
isd_setrec(0x00,0x00)//发送0x0000h地址的setplay指令
do
{ isd_rec()//发送rec指令
delay(20)
while(AN==0) //等待录音完毕
{if (ISD_INT==0) //如果芯片溢出,进行LED闪烁提示,
isd_overflow()//如果取消录音(松开AN键)则停止录音,芯片复位
}
if (ISD_INT==0)
break
LED=1//录音完毕,LED熄灭
isd_stop()//发送停止命令
while(AN==1) //如果AN再次按下,开始录制下一段语音
{if(STOP==0) //如果按下STOP按键,则芯片复位
break
if (AN==0)
delayms(500)
}
}while(AN==0)
}
else //如果PR==0则转入放音部分
{
while(AN==0){}
isd_setplay(0x00,0x00)//发送setplay指令,从0x0000地址开始放音
do
{
isd_play()//发送放音指令
delay(20)
while(ISD_INT==1) //等待放音完毕的EOM中断信号
{}
LED=1
isd_stop()//放音完毕,发送stop指令
if (ovflog=chk_isdovf()) //检查芯片是否溢出 ,如溢出则停止放音,芯片复位
break
while(AN==1) //等待AN键再次按下
{if (STOP==0)
delayms(20)
if (STOP==0)
break
if(AN==0)
delayms(20)
}
LED=0
}while(AN==0)// AN键再次按下,播放下一段语音
}
isd_stop()
isd_pd()
}
}
/*注意:与ISD4002/03不同的是,由于ISD4004芯片的语音地址是16位,在发送带地址指令(如setplay,setrec,setmc)时,需要先发送两个字节的地址信息,再发送一个字节的命令字,ISD4004的程序编写与ISD4002/03的区别,仅此而已。
//例如,ISD4004的setplay指令程序应为:
void isd_setplay(unsigned char adl,unsigned char adh)
{
delayms(1)
spi_send(adl)//发送放音起始地址低位
delay(2)
spi_send(adh)//发送放音起始地址高位
delay(2)
spi_send(0xe0)//发送setplay指令字节
SS=1
}*/
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)