基于51单片机倒车雷达系统.doc_第1页
基于51单片机倒车雷达系统.doc_第2页
基于51单片机倒车雷达系统.doc_第3页
基于51单片机倒车雷达系统.doc_第4页
基于51单片机倒车雷达系统.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于超声波的倒车雷达系统 电子0601郑灵光 电子0602潘建标,陈永根摘 要随着科技的发展,人们生活水平的提高,城市发展建设加快,城市给交通系统也有较大发展,其状况不断改善。但是,由于多种原因合成时间住的许多不可预见因素,城市还是经常出现大量的交通事故,特别是倒车时,看不到后方而导致大量的交通事故。因此,设计出好的倒车雷达系统,对于减少城市的交通事故将有一个很好的控制作用。当然这要求倒车雷达系统,具有精度高,抗干扰强,价格应该低,适宜推广等特点,这样基于超声波的测距系统,完全可以胜任此任务。本设计采用以AT89C51单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法。整个电路采用模块化设计,由主程序、发射子程序、接收子程序、显示子程序等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。该设计设抗干扰能力较好,实时性良好,误差可以达到mm级,可以有效地解决汽车倒车作用。本系统在倒车时不断测量汽车尾部与其后面障碍物的距离,并随时显示其距离,并用语音及时提示。在不同的距离范围内,不同的温度下测出距离,发出报警信号,以提高汽车倒车时的安全性的仪器。目录第一章 绪论 31.1 课题背景,目的和意义 31.2两种常用的超声波测距方案 3第2章 超声波测距系统设计 32.1 超声波测距的原理 42.2超声波测距系统电路的设计 42.2.1 总体设计方案 42.2.2发射电路的设计 42.2.3接收电路的设计 42.2.4显示模块的设计 52.2.5 温度补偿模块设计52.2.6 语音处理模块5第三章 超声波测距系统的软件设 .53.1总体流程图 .53.2 程序及分析 .6第四章 电路调试及误差分析 .74.1电路的调试 .74.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单片机定时器能方便的计数到1s的精度,因此系统采用89C51定时器能保证时间误差在1mm的测量范围内。,则将n与1us相乘即可以得到时间,从而利用超声波测距的原理就可以判断距离以是否利用利用凌阳61版的语音处理功能,进行报警及播放当前的距离,温度和超声波传播速度。再者显示器也将显示距离,温度,及超声波传播速度。2.2.2发射电路的设计 用单片机直接产生的40khz信号经过74ls04放大后直接驱动超声波发射探头。2.2.3接收电路的设计 将超声波接收探头接收的信号经cx20106红外线专用芯片处理接收,然后送给单片机。 2.2.4显示模块的设计 使用1602液晶屏,与单片机连接,将单片机的距离,温度,超声波数度(声速)传送给液晶屏显示出来。2.2.5 温度补偿模块设计 因为声速在不同温度下的传播速度是不同的,根据补偿公式C=C0+0.607T C0为零度时的声波速度332m/s;T为实际温度()。采用18b20温度传感器测温,根据测得的温度,来确定具体的声速。2.2.6 语音处理模块 根据手中的现有的材料,利用凌阳61版的语音处理功能,播放出:“倒车请注意”并通过51单片机和凌阳的串口通讯,将51测得的距离,温度,声速数据传给凌阳,然后通过凌阳的语音处理将其播报出来。第三章 超声波测距系统的软件设计 3.1总体流程图3.1.1凌阳模块流程图3.1.2 51单片机模块 3.2 程序及分析(见附录)第4章 电路调试及误差分析 5.1电路的调试(盲区问题) 由于超声波发射探头在发射超声波时,接受探头也会接受到超声波,所以在发射超声波时,必须先关外部中断,延时一段时间,进而消除回波干扰,所以在测量中会有盲区出现,所以硬件调试中主要的就是调节延时时间,使盲区达到最小,进而跳高测量的精度。通过硬件调试,来控制发射脉冲波的个数以及延时时间,并在实际测量中测出三种不同测距模式下的盲区,分别约为5cm,20cm及45cm。、 5.2系统的误差分析 28根据超声波测距公式L=CT,可知测距的误差是由超声波的传播速度误差和测量距离传播的时间误差引起的。1.时间误差当要求测距误差小于1mm时,假设已知超声波速度C=344m/s (20室温),忽略声速的传播误差。测距误差st(0.001/344) 0.000002907s 即2.907ms。 在超声波的传播速度是准确的前提下,测量距离的传播时间差值精度只要在达到微秒级,就能保证测距误差小于1mm的误差。使用的12MHz晶体作时钟基准的89C51单片机定时器能方便的计数到1s的精度,因此系统采用89C51定时器能保证时间误差在1mm的测量范围内。2.超声波传播速度误差超声波的传播速度受空气的密度所影响,空气的密度越高则超声波的传播速度就越快.第5章 功能扩展通过串口与PC机进行通讯,并利用所学知识,用VB写了了一个接受模块,将51单片机中的数据经串口传到电脑上显示。参考文献 33单片机原理与控制技术 机械工业出版社数字电子技术教程 清华大学出版社模拟电子技术教程 清华大学出版社胡萍.超声波测距仪的研制.计算机与现代化时德刚,刘哗.超声波测距的研究.计算机测量与控制/mgjqr/blog/item/63c5bd1e5346c164f624e4b8.html 超声波测距原理附录:/主文件程序main/3.2.1超声波测距#include#include #include18B20.h #include intrins.h#includeLCD1602.H#includeDelay1.h#define uchar unsigned char#define uint unsigned intuchar ucHigh_time,ucLow_time; /超声波传输时间 uchar ucFlag; /中断标志位uchar frq;/音乐频率节拍问题float c; /不同温度下的超声波传播速度/*针脚定义*/sbit Hz40k_out=P36; /40k信号输出端sbit Mod_short=P14;sbit Mod_long=P15;sbitMod_out = P17;/ 判断数据是发给电脑机还是凌阳版sbit Key_tran=P16; /发送数据,开始通讯/*/*函数声明*/void Tmr0_int(void);void Int0_int(void);void Send_40khz_long(void) ; /发射超声波void Send_40khz_medium(void) ;void Send_40khz_short(void) ;int Distance_count(); /距离转换函数float Compensate_c(); /温度补偿函数void Display_dis(void); /距离显示函数void Display_tem(void); /温度显示函数void Display_c(void) ; /声速显示函数void delayms(unsigned char ms);void Tmr1_int(void);/*子程序 */ void Tmr0_int(void)TMOD|=0x01; /tmr0方式1,16位计数EA=0; /关总中断ET0=0; /关T0中断TR0=0; /停止计时器0TH0=0X00;TL0=0X00; /void Int0_int(void)IT0=0; /低电平沿触发EA=0; /关总中断EX0=0; /屏蔽中断/void Ustart_int(void)SCON |= 0x50; /串口方式1,允许接收TMOD |= 0x20; /定时器1定时方式2/TCON = 0x40; /设定时器1开始计数TH1 = 0xF3;/12MHz 2400波特率TL1 = 0xF3; TR1 = 0; /关闭定时器 /void Ustart_send_lingyang(void) uchar send3; uint Voice_v; send0=Distance_count(); send1=Distance_count()8; TR1 = 1; /启动定时器 TI=0; SBUF=send1; /先发高位再发低位 while(!TI); /等待发送完成 TI=0; while(!RI); /等待接收完成 RI=0; /delay_ms(200); SBUF=send0; while(!TI); TI=0; send0=Read_Temperature()/10;send1=(Read_Temperature()/10)8;/发送的为实际温度的十倍37.2C则发送372while(!RI); /等待接收完成 RI=0; /delay_ms(200); SBUF=send1; while(!TI); TI=0; while(!RI); /等待接收完成 RI=0; /delay_ms(200); SBUF=send0; while(!TI); TI=0;Voice_v=Compensate_c(); /将浮点型转换为整型 send0=Voice_v; send1=Voice_v8; while(!RI); /等待接收完成 RI=0; /delay_ms(200); SBUF=send1; while(!TI); TI=0; while(!RI); /等待接收完成 RI=0; /delay_ms(200); SBUF=send0; while(!TI); TI=0; while(!RI); /等待接收完成 RI=0;TR1=0;/关闭定时器 /void Ustart_send_pc(void) uchar send4; uint Voice_v; send0=Distance_count()/1000+0x30; send1=Distance_count()%1000/100+0x30; send2=Distance_count()%100/10+0x30; send3=Distance_count()%10+0x30; TR1 = 1; /启动定时器 TI=0; SBUF=send0; while(!TI); TI=0; SBUF=send1; while(!TI); TI=0; SBUF=send2; while(!TI); TI=0; SBUF=send3; while(!TI); TI=0; send0=(Read_Temperature()/10)/100+0x30; send1=(Read_Temperature()/10)%100/10+0x30;/发送的为实际温度的十倍 37.2C则发送372 send2=(Read_Temperature()/10)%10+0x30; SBUF=send0; while(!TI); TI=0; SBUF=send1; while(!TI); TI=0; SBUF=send2; while(!TI); TI=0; Voice_v=Compensate_c(); /将浮点型转换为整型 send0=Voice_v/100+0x30; send1=Voice_v%100/10+0x30; send2=Voice_v%10+0x30; SBUF=send0; while(!TI); TI=0; SBUF=send1; while(!TI); TI=0; SBUF=send2; while(!TI); TI=0; TR1=0;/关闭定时器 void Key_scan(void)Key_tran=1;/写1准备开始读 if(Key_tran=0) delay_ms(10);while(!Key_tran) ;/等待按键放开if (Mod_out=1)Ustart_send_lingyang(); elseUstart_send_pc(); /void Send_40khz_short(void)/从P1.0发出40KHz的脉冲 短波测量短距离uchar n,p;for(n=0;n1;n+) /输出1个脉冲Hz40k_out=1;for(p=0;p3;p+);Hz40k_out=0;for(p=0;p2;p+);Hz40k_out=0;/void Send_40khz_medium(void)/从P1.0发出40KHz的脉冲 中波 测量中距离uchar n,p;for(n=0;n2;n+) /输出2个脉冲Hz40k_out=1;for(p=0;p3;p+);Hz40k_out=0;for(p=0;p2;p+);Hz40k_out=0;/void Send_40khz_long(void)/从P1.0发出40KHz的脉冲长波测量长距离uchar n,p;for(n=0;n40;n+) /输出40个脉冲Hz40k_out=1;for(p=0;p3;p+);Hz40k_out=0;for(p=0;p0)/判读显示位数 write_number(Distance_count(),4);else if(Distance_count()/1000)write_number(Distance_count(),3);else if(Distance_count()/100)write_number(Distance_count(),2); write_string_LCD1602( );else write_number(Distance_count(),1);write_string_LCD1602( ); write_string_LCD1602(mm); break; case 2: LCD_gotoxy(0, 0); write_string_LCD1602(Distance:wrong ) ; break; default : LCD_gotoxy(0, 0); write_string_LCD1602(Begin ) ; break; /void Display_tem(void)/显示温度 LCD_gotoxy(1, 0); write_string_LCD1602(T:); if (Read_Temperature()/100=100)write_number(Read_Temperature()/100,3);elsewrite_number(Read_Temperature()/100,2);write_string_LCD1602(.);write_number(Read_Temperature()%100/10,1);write_string_LCD1602(C); /void Display_c(void) /显示声速LCD_gotoxy(1, 8);write_string_LCD1602(c:);write_number(Compensate_c(),3);write_string_LCD1602(m/s); /*中断处理*/void INT0_Ultrasonic() interrupt 0 uchar ucTemp_time1,ucTemp_time2;ucFlag=1;/外部中断标志位TR0=0;/关定时器0ET0=0;/屏蔽定时器0中断EX0=0;/关外部中断ucTemp_time1=TL0;ucTemp_time2=TH0;if(ucTemp_time1!=0)&(ucTemp_time2!=0)ucHigh_time=TH0;ucLow_time=TL0;/void over()interrupt 1/T0溢出为无效测量FFF;ucFlag=2;/溢出标志位 TR0=0;/关定时器0 ET0=0;/屏蔽定时器0中断EX0=0;/屏蔽外部中断/*主程序*/void main(void)Tmr0_int();Int0_int();Ustart_int(); /串口通讯初始化init_LCD1602() ;EA=1; /开总中断 while(1) PX0=1; /设置外部0中断优先级为最高TH0=0;TL0=0;/清定时0TR0=1;/开定时0ET0=1;/开启定时器0中断if(Mod_long=0)Send_40khz_long();/发射40khz脉冲 测量长距离delay_ms(1); /1msdelay_us(80); / 0.724ms 防回波干扰 总延时25*40/1000+1+0.724=2.724ms /盲区:2.724*170=463mm if (Mod_long=1& Mod_short=1) Send_40khz_medium();/发射40khz脉冲 测量中距离delay_us(127);/ 防回波干扰 1.157ms延时 /总延时1.157+0.05=1.207ms /盲区:1.207*170=205.19mmif(Mod_short=0) Send_40khz_short();/发射40khz脉冲 测量短距离 EX0=1; /开启int0中断Display_dis( ); /距离显示Display_tem(); /温度显示Display_c(); /声速显示/*Tmr1_int(); 音乐播放 delay_ms(200);delay_ms(200);/delay_ms(200);ET1=0; /关tmr1中断 关闭音乐,避免开音乐是中断太频繁,引起测温和测距离都不准确 */ / delay_ms(200); delay_ms(200); Key_scan(); /扫描按键判断是否要发送数据与凌阳版通讯 (2)显示模块#ifndef _RZ_LCD1602_#define _RZ_LCD1602_#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endifuchar code number10=0123456789;/用来显示数据#define Port P2sbit RS_LCD1602=P11;sbit RW_LCD1602=P12;sbit EN_LCD1602=P13;void Delay_Ms_LCD1602(uint ms)/延时程序(以毫秒为单位)。uchar y,z;for(;ms0;ms-)for(y=0;y11;y+)for(z=0;z25;z+);bit get_status_LCD1602() /读状态。 Port=0xff;EN_LCD1602=0;RS_LCD1602=0;RW_LCD1602=1;EN_LCD1602=1;return(bit)(Port&0x80);void write_command_LCD1602(uchar com) /写命令。while(get_status_LCD1602();EN_LCD1602=0;RS_LCD1602=0;RW_LCD1602=0;Delay_Ms_LCD1602(5);Port=com;EN_LCD1602=1;Delay_Ms_LCD1602(20);EN_LCD1602=0;void set_cursor_LCD1602(uchar line,uchar add) /设置光标的行(line),列(add)位置。write_command_LCD1602(0x80+line*0x40+add);void write_char_LCD1602(uchar indata) /写数据。while(get_status_LCD1602();EN_LCD1602=0;RS_LCD1602=1;RW_LCD1602=0;Delay_Ms_LCD1602(5);P2=indata;EN_LCD1602=1;Delay_Ms_LCD1602(20);EN_LCD1602=0;void Write_CGA_LCD1602(uchar *CGA_Data,uchar CGA_Index) /写自定义字符 uchar index;CGA_Index&=0x07;/最多8个字符。CGA_Index=CGA_Index3;/决定CGARAM相对地址。for(index=0;index8;index+)/设置CGARAM地址。write_command_LCD1602(CGA_Index|index|0x40);/写入字模数据。write_char_LCD1602(*CGA_Data);CGA_Data+;void write_char_add_LCD1602(uchar indata,uchar line,uchar add)/在指定的行(line),列(add)位置写入字符(indata)。set_cursor_LCD1602(line,add);write_char_LCD1602(indata);void write_string_LCD1602(uchar indata)/从当位置开始写入指定长度(lenght)的字符串(indata)。/一次最多写入255个。uchar index=0;while(indataindex!=0&index255)/直到遇到字符串结束标志。write_char_LCD1602(indataindex);index+; void cursor_show_LCD1602() /打开显示屏并显示闪烁的光标。write_command_LCD1602(0x0f);void cursor_hide_LCD1602() /隐藏光标write_command_LCD1602(0x0c);void clear_LCD1602() /清屏。while(get_status_LCD1602()&0x80);/等待空闲状态。write_command_LCD1602(0x01);Delay_Ms_LCD1602(50);void init_LCD1602() /初始化液晶write_command_LCD1602(0x38);/设置显示模式。write_command_LCD1602(0x80);/光标初始位置。write_command_LCD1602(0x0f);/打开显示屏并显示闪烁的光标。write_command_LCD1602(0x06);/输入数据后光标自动向后移。cursor_hide_LCD1602();/隐藏光标。*/void LCD_gotoxy(uchar x, uchar y) x &= 0x1; /限制x不能大于1,y不能大于15 y &= 0xF; if(!x)write_command_LCD1602(0x80|y); else write_command_LCD1602(0xC0|y);/*/void write_number(uint num,uchar n) uchar a; /个位 uchar b; /十位 uchar c; /百位 uchar d; /千位 uchar e; /万位 switch(n) case 1:write_char_LCD1602(numbernum); break; case 2:b=num/10; a=num%10; write_char_LCD1602(numberb); write_char_LCD1602(numbera); break; case 3:c=num/100; b=num%100/10; a=num%10; write_char_LCD1602(numberc); write_char_LCD1602(numberb); write_char_LCD1602(numbera); break; case 4:d=num/1000; c=num%1000/100; b=num%1000%100/10; a=num%10; write_char_LCD1602(numberd); write_char_LCD1602(numberc); write_char_LCD1602(numberb); write_char_LCD1602(numbera); break; case 5:e=num/10000; d=num%10000/1000; c=num%1000/100; b=num%1000%100/10; a=num%10; write_char_LCD1602(numbere); write_char_LCD1602(numberd); write_char_LCD1602(numberc); write_char_LCD1602(numberb); write_char_LCD1602(numbera); break; #endif(3)温度传感器模块/*函数功能:单一18B20驱动 *环境:TA89S52 晶振:12M *版本:V1.0 测试通过(负温度未测试) *By Andy 2008-5-23 copyright: */#ifndef DS18B20_H#define DS18B20_H#include #include #include typedef unsigned char byte;typedef unsigned int word;/*DS18B20温度定义部分*/sbit DQ=P10; /18B20 接口bit flag_minus=0;word temp_data3;/*函数列表*/void adjust_res(char res); /res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应 byte ow_reset(void);byte read_byte(void);void write_byte(char val);word Read_Temperature(void);/*void DS18B20_delay(word useconds) for(;useconds0;useconds-); /延时87byte ow_reset(void) /复位byte presence; DQ = 0; /拉低总线 DS18B20_delay(29); / 保持 480us 29 DQ = 1; / 释放总线 DS18B20_delay(3); / 等待回复 presence = DQ; / 读取信号 DS18B20_delay(25); / 等待结

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论