倒车测距论文.docx
《倒车测距论文.docx》由会员分享,可在线阅读,更多相关《倒车测距论文.docx(16页珍藏版)》请在冰豆网上搜索。
倒车测距论文
单片机汽车倒车测距仪
学号:
班级:
姓名:
摘要
本设计是一种基于AT89C52单片机的超声波测距系统,由单片机模块、超声波模块、液晶显示模块等组成。
本设计利用一片单片机对超声波信号循环不断地进行采集,能测量出倒车方向的障碍物与汽车之间的距离,并通过LCD显示模块显示两者之间的距离,然后通过蜂鸣器发出不同频率的声响,从而起到提示和报警的作用。
关键词:
单片机超声波液晶显示信号
Abstract
ThisdesignisakindofultrasonicrangingsystembasedonAT89C52MCU,MCU,ultrasonicmodulebymodule,LCDmodule.Thisdesignusingasinglechipontheultrasonicsignalcontinuouslycollected,canmeasurebetweentheobstacleandthecarreversingthedirectionofthedistance,andthroughtheLCDdisplaymoduletodisplaythedistancebetweenthetwo,andthenthroughthebuzzersoundsofdifferentfrequenciesanddifferentcolorsoftheLEDlightout,thusplaystheroleoftipsandalarm.
Keywords:
singlechipultrasonicliquidcrystaldisplaysignal
目录
1方案设计-1-
1.1主控模块选择-1-
1.2超声波模块-1-
1.3液晶显示模块-2-
1.4提示报警模块-2-
2结束语
3参考文献-4-
4附件
1方案设计
主控模块选择
单片机控制模块在本系统中处于核心地位,其工作包括号的采集,进行数据处理,控制执行机构的运行等。
对单片机控制模块的基本要求是具有较高的速度且资源配置满足要求。
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kbytes的可反复擦写的Flash只读程序存储器和256bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。
单片机技术成熟,且易操作,所以主控芯片选择AT89C52单片机。
超声波模块
本模块性能稳定,测度距离精确。
能和国外的SRF05,SRF02等超声波
测距模块相媲美。
模块高精度,盲区(2cm)超近,测量稳定。
使用本模块,占用单片机的两个IO口,一个IO口做为触发端。
一个IO口做为回波PWM信号捕捉引脚。
写程序时,先在TRIG引脚端为一个大约10US的高电平触发模块,同时模块内部将发出8个40kHz周期电平并检测回波。
并在内部程序处理变换成一个PWM的信号从Echo引脚输出,一旦检测到有回波信号则输出回响信号,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;目前的超声波模块精度能到1cm。
液晶显示模块
字符型液晶显示模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,专门用于显示字母、数字、符号等点阵式LCD。
LCD1602LCD1是字符型液晶,它是16*2的显示的,采用标准的16脚(带背光)接口,各引脚接口说明如表:
提示报警模块
蜂鸣器是一种一体化结构的电子讯响器,主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
它的发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此需要增加一个电流放大的电路。
通过一个三极管C8550来放大驱动蜂鸣器。
根据声音的不同频率来辨别距离的不同。
2结束语
通过调试完成了题目的基本设计要求,在某些方面系统性能还超过了题目要求。
通过设计学会了软件编程和硬件开发技能,懂得了软硬件结合的设计,理论联系实际的重要性,这对我们以后的学习和工作不无裨益。
当然,我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高。
3参考文献
[1]王兆安刘进军电力电子技术(第五版)北京:
机械工业出版社2009.5
[2]童诗白华成英模拟电子技术基础(第四版)北京:
高等教育出版社2006.5
[3]阎石数字电子技术基础(第五版)北京:
高等教育出版社2006.5
[4]孙涵芳徐爱卿单片机原理及应用北京:
北京航空航天大学出版社2004.6
4附件
附件:
1系统框图
附件:
2电路图
附件:
3实物
附件:
4程序
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include
sbitRS=P2^6;//定义端口
sbitRW=P2^5;
sbitEN=P2^4;
sbitTX=P1^0;
sbitRX=P1^1;
sbitBEEP=P1^2;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodeASCII[]={'0','1','2','3','4','5','6','7','8','9'};
unsignedchardisbuff[]={0,0,0,0,};
/*------------------------------------------------
uS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5uS
------------------------------------------------*/
voidDelayUs2x(unsignedchart)
{
while(t--);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的范围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voiddelay1(unsignedintt)
{
while(t--);
}
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
while(LCD_Check_Busy());//忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
while(LCD_Check_Busy());//忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
/*------------------------------------------------
时间换算
------------------------------------------------*/
voidConut(void)
{
uintT,S;//,flag;
T=TH0*256+TL0;
TH0=0;
TL0=0;
S=20.4*T/1100;//算出来是CM
if(S>20&S<=30)
{
BEEP=1;//将P0.0口赋值0,该口电平为低,蜂鸣器不响
delay1(50000);//调用延时程序;更改延时数字可以更改延时长度;
//用于改变声音频率
BEEP=0;//将P0.0口赋值1,该口电平为高,使蜂鸣器响
delay1(50000);
}
if(S>10&S<=20)
{
BEEP=1;//将P0.0口赋值0,该口电平为低,蜂鸣器不响
delay1(30000);//调用延时程序;更改延时数字可以更改延时长度;
//用于改变声音频率
BEEP=0;//将P0.0口赋值1,该口电平为高,使蜂鸣器响
delay1(30000);
}
if(S<=10)
{
BEEP=1;//将P0.0口赋值0,该口电平为低,蜂鸣器不响
delay1(5000);//调用延时程序;更改延时数字可以更改延时长度;
//用于改变声音频率
BEEP=0;//将P0.0口赋值1,该口电平为高,使蜂鸣器响
delay1(5000);
}
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10%10;
LCD_Write_Char(7,1,ASCII[disbuff[0]]);
LCD_Write_Char(8,1,ASCII[disbuff[1]]);
LCD_Write_Char(9,1,ASCII[disbuff[2]]);
LCD_Write_Char(11,1,'C');//显示C
LCD_Write_Char(12,1,'M');//显示M
}
/********************************************************/
voidzhongduan0()interrupt1//T0中断用来计数器溢出,超过测距范围
{
ucharflag;
flag=1;//中断溢出标志
}
/********************************************************/
voidStartModule()//启动模块
{
TX=1;//启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
LCD_Init();//初始化
LCD_Clear();//清屏
TMOD=0x01;//设T0为方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1;//允许T0中断
EA=1;//开启总中断
while
(1)
{
StartModule();
while(!
RX);//当RX为零时等待
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
TR0=0;//关闭计数
Conut();
DelayMs(10);
}
}