基于单片机的汽车防撞报警系统资料.docx
《基于单片机的汽车防撞报警系统资料.docx》由会员分享,可在线阅读,更多相关《基于单片机的汽车防撞报警系统资料.docx(38页珍藏版)》请在冰豆网上搜索。
![基于单片机的汽车防撞报警系统资料.docx](https://file1.bdocx.com/fileroot1/2023-5/23/09ca38df-7bd6-499f-aa56-1c9d1be53a58/09ca38df-7bd6-499f-aa56-1c9d1be53a581.gif)
基于单片机的汽车防撞报警系统资料
科技开放与实践创新项目
结题验收报告
项目名称:
基于单片机的汽车防撞报警系统
指导老师:
项目组员:
参赛学院:
电子与信息工程学院
日期:
2014/12/17
目录
第一部分系统方案···································
1.1功能模块的比较与选择
1.1.1单片机的比较选择
1.1.2超声波测距法的论证与选择
1.1.3显示器的选择
1.1.4蓝牙模块的选择
1.2方案描述
第二部分理论分析及计算··································
2.1超声波传感器的分析与计算
2.3蓝牙通信模块的分析处理
第三部分电路及程序设计·······························
3.1系统总体框图
3.1.1各模块原理图及电路
3.2各模块程序设计
第四部分测试方案与测试结果·······························
4.1硬件测试
4.2软件测试
4.3测试结果
第五部分总结·······························
附录1:
电路原理图
附录2:
源程序
摘要
本设计是以STC90C51单片机配合HC-06蓝牙模块控制的汽车防撞报警系统。
该装置将单片机的实时控制及数据处理功能与超声波的测距技术相结合,通过蓝牙模块控制小车的运行状态并检测汽车运行中与前方障碍物的距离,通过LCD显示装置显示距离,由蜂鸣器根据距离远近发出警告声。
关键词:
STC90C51、蓝牙、超声波传感器测距、报警、LCD
一、系统方案
本系统主要由超声波检测模块、蓝牙模块、LED显示模块、电源模块、声光报警模块(蜂鸣器、LED),下面分别论证这几个模块的选择。
1.1比较与选择
1.1.1单片机的比较选择
单片机芯片选型时,总的原则是:
(1)芯片含有功能或数量略大于设计需求,设计需求尽可能用芯片完成,少用外围器件。
(2)技术性:
要从单片机的技术指标角度,对单片机芯片进行选择,以保证单片机应用系统在一定的技术指标下可靠运行;
(3)实用性:
要从单片机的供货渠道、信誉程序等角度,对单片机的生产厂家进行选择以保证单片机应用系统在能长期、可靠运行;
(4)可开发性:
选用的单片机要有可靠的可以开发手段,如程序开发工具、仿真调试手段等。
STC90C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4KB的可反复擦写的只读程序存储器和128字节的随机存储器。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容,由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,它为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
STC90C51功能性能:
与MCS-51成品指令系统完全兼容;4KB可编程闪速存储器;寿命:
1000次写/擦循环;数据保留时间:
10年;全静态工作:
0-24MHz;三级程序存储器锁定;128*8B内部RAM;32个可编程I/O口线;2个16位定时/计数器;5个中断源;可编程串行UART通道;片内震荡器和掉电模式。
1.1.2超声波测距法的论证与选择
方案一:
强度法是利用声波在空气中的传输损耗值来测量被测物的距离,被测物越远其反射信号越弱,根据反射信号的强弱就可以知道被测物的远近,但在使用这种方法时由于换能器之间的直接耦合信号很难消除,在放大器增益较高时这一直接耦合信号就使放大器饱和从而使整套系统失效,由于直接耦合信号的影响强度法测距只使用与较短距离的且精度要求不高的场合。
方案二:
往返时间检测法其原理是超声波传感器发射一定频率的超声波借助空气媒介传播,到达测量目标或障碍物后反射回来,经反射后由超声波接收器接收脉冲,其所经历的时间即往返时间。
往返时间与超声波传播的路程的远近有关。
根据测试传输时间可以得出距离。
这种方法不受声波强度的影响,直接耦合信号的影响也可以通过设置“时间门”来加以克服,因此这种方法非常适合较远距离的测距,在精度的要求较高的情况下,需要考虑温度对超声波的传播速度的影响。
按式v=331.4+0.607T(T为实际温度单位为摄氏度,v为超声波在介质中的传播速度,单位为m/s)对超声波传播速度加以修正,以减小误差。
因此,本设计中采用第二种方法,即往返时间检测法。
1.1.3显示器的选择
方案一:
使用多个数码管显示。
LED数码管是利用二极管发光显示数字和字母,具有亮度大,接口设计业比较容易,价格相对较便宜等优点。
但是由于它工作时电流较大,显示的信息量有限。
方案二:
采用液晶显示。
液晶特别是具有字符显示功能的液晶显示器,来实现显示功能,不仅可以实现基本的显示信息,而且可以显示丰富的符号指示信息,信息量丰富且直观易懂。
而且液晶显示功耗低,体积小。
综上考虑,本设计采用方案二。
1.1.4蓝牙模块的选择
本模块分主机和从机,主机能和从机配对通信,从机与从机之间或主机与主机之间不能通信,从机能和电脑、手机等的蓝牙配对通信,购买时默认为从机。
我们在做智能小车控制时,蓝牙模块主要是实现接收从手机端发送过来的指令,所以我们需要的是从机模块。
蓝牙串口在模块功能上,偶数命名的互相兼容,从机命名的也互相兼容,也就是说,HC-04与HC-06,HC-03与HC-05在功能上是兼容的。
HC-04与HC-06是比较早的版本,用户不可以自己切换主机或者从机,AT指令集很少,包括修改蓝牙名(限于从机),修改密码,修改波特率,询问版本号等几个基本功能。
在本次设计中我们只需实现简单的通信,因此选用HC-06模块。
HC-06模块只记忆最后一次配对过的从机,并只与该从机配对,直到KEY(26脚)高电平触发时放弃记忆,26脚默认应该为低电平。
1.2方案描述
通过查找资料进行方案论证和选择,可以确定出该系统的整体构成。
本设
计是以STC90c51单片机为核心,以设置手机界面来设置前进、后退、左转、右转、停止等功能。
单片机控制电机驱动来控制电机的正反转以实现小车的前进、后退、左转、右转、停止。
HC-06为蓝牙接收模块,通过与手机端的蓝牙进行连接配对,从而接收从手机端发送过来的动作指令。
接收到的指令再传递给单片机,单片机通过分析传递过来的指令不同,而跳转到不同的子程序来控制电机驱动,从而实现小车的前进、后退、左转、右转、停止等不同的动作。
电源提供给单片机5V直流电,L298需要从外部接两个电压,一个是给电机的,另一个给L298芯片的。
汽车防撞装置可在任何天气、任何车速状态下探测出将要发生的危险情况并及时提醒司机及早采取措施或自动紧急制动,避免严重事故发生。
汽车防撞装置是借助于检测测技术监视汽车前方和后方的车辆、障碍物,并根据当时的距离自动判断是否达到危险距离,及时向司机发出警告。
二、理论分析及计算
2.1超声波传感器的分析与计算
假设S为被测物体到测距仪之间的距离,测的时间为t,超声波传播的速度为v表示。
则有关系式:
S=v*(t/2)
在精度的要求较高的情况下,需要考虑温度对超声波传播速度的影响,按式v=331.4+0.607T对超声波传播速度加以修正,以减少误差。
式中T为实际温度单位摄氏度,v为超声波在介质中的传播速度,单位为m/s
一些温度下的声速
温度
-30
-20
-10
0
10
20
30
声速
313
319
322
331
337
344
350
2.2蓝牙通信模块的分析处理
(1)原理既然使用手机蓝牙控制,那小车上必须要有一个蓝牙模块与手机蓝牙通信。
在这里选用了HC06蓝牙转串口模块。
HC06蓝牙转串口模块的作用是将从手机蓝牙发送过来的指令接收到后转换成串口的形式通过单片机的串口传给单片机。
只需将该模块的RXD接上51单片机的TXD引脚,TXD接51的RXD,然后接单片机的VCC供电,因为我们只用它接收手机蓝牙信号,不发送数据。
它出厂默认设置的波特率9600,不重新设置它的波特率的话,在写单片机串口程序时,也要将波特率设置为9600。
三、电路及程序设计
3.1系统总体框图
3.1.1各模块原理图及电路
a.超声波传感器
超声波传感器时序图
超声波传感器原理图
超声波发射电路超声波接受电路
b.L298N电机驱动模块
c.LCD
d.蜂鸣器
E.蓝牙模块
接线方式
调试过程
蓝牙模块应用电路
3.2程序设计
主程序流程图
Y
N
N
Y
N
YY
a.超声波传感器
//启动超声波测量
voidStart_HCSR04()
{
//生成20us的脉冲宽度的触发信号
Trig=1;
delay_20us();
Trig=0;
//等待回响信号变高电平
while(!
Echo);
TR0=1;//启动定时器0
//等待回响信号变低电平
While(Echo);
TR0=0;//关闭定时器0
}
b.Lcd1602
//检查LCD忙状态
bitLCD_Busy_Check()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
Delay4us();
result=(bit)(P0&0x80);
LCD_EN=0;
returnresult;
}
//写数据
voidWrite_data(uchardat)
{
while(LCD_Busy_Check());
LCD_RS=1;
LCD_RW=0;
P0=dat;
delay_ms(5);
LCD_EN=1;
delay_ms(5);
LCD_EN=0;
}
//写指令
voidWrite_cmd(ucharcmd)
{
while(LCD_Busy_Check());
LCD_RS=0;
LCD_RW=0;
P0=cmd;
delay_ms(5);
LCD_EN=1;
delay_ms(5);
LCD_EN=0;
}
//1602液晶初始化
voidLCD_Initialize()
{
Write_cmd(0x38);//三次显示模式设置
delay_ms(5);
Write_cmd(0x38);
delay_ms(5);
Write_cmd(0x38);
delay_ms(5);
Write_cmd(0x38);//显示模式设置
Write_cmd(0x08);//关闭显示
Write_cmd(0x01);//显示清屏
Write_cmd(0x06);//显示光标移动设置
Write_cmd(0x0F);//显示开及光标设置
}
//按指定位置显示一个字符:
X=列位置(0-15)Y=行位置(0,1)
voidWrite_position(ucharX,ucharY,ucharDData)
{
Y&=0x1;//限制Y不能大于1(2行,0-1)
X&=0xF;//限制X不能大于15(16个字符,0-15)
if(Y)X|=0x40;//当要显示第二行时地址码+0x40;
X|=0x80;//算出指令码
Write_cmd(X);//发命令字
Write_data(DData);//发数据
}
//按指定位置显示一串字符
voidWrite_str(ucharX,ucharY,ucharcode*DData)
{
ucharListLength;
ListLength=0;
Y&=0x1;
X&=0xF;//限制X不能大于15,Y不能大于1
while(DData[ListLength]>0x19){//若到达字串尾则退出
if(X<=0xF){//X坐标应小于0xF
Write_position(X,Y,DData[ListLength]);//显示单个字符
ListLength++;
X++;
}
}
}
c.电机驱动
//小车启动时初始化
voidCar_Init()
{
//暂时处于停车待机状态
EN_A=1;
EN_B=1;
Moto_LA=0;
Moto_LB=0;
Moto_RA=0;
Moto_RB=0;
}
//停止
voidstop()
{
Moto_RA=0;
Moto_RB=0;
Moto_LA=0;
Moto_LB=0;
}
//前进
voidahead()
{
Moto_LA=1;
Moto_LB=0;
Moto_RA=1;
Moto_RB=0;
}
//后退
voidback()
{
Moto_LA=0;
Moto_LB=1;
Moto_RA=0;
Moto_RB=1;
}
//左转
voidleft()
{
Moto_LA=0;
Moto_LB=1;
Moto_RA=1;
Moto_RB=0;
}
//右转
voidright()
{
Moto_LA=1;
Moto_LB=0;
Moto_RA=0;
Moto_RB=1;
}
d.蓝牙模块
//数据接受处理
if(flag1==1){
ES=0;//关闭串口
if(a==0x00){
ahead();
}
if(a==0x01){
back();
}
if(a==0x02){
left();
}
if(a==0x03){
right();
}
if(a==0x04){
stop();
}
flag1=0;//清除标志位
ES=1;//打开串口中断
}
//设置串口中断的工作方式
voidcommunication()interrupt4
{
RI=0;//取消本次串口的响应
a=SBUF;//接受缓冲区的数据
flag1=1;//标记位
}
//初始化子程序
voidtimer0_init()
{
TMOD=0x21;//设定时器0定时
TH0=0;
TL0=0;
ET0=1;
TH1=0xfd;//对定时器赋值,高8位与低低8位相同
TL1=0xfd;//波特率设为9600
TR1=1;//打开定时器1
SM0=0;//设置串口的工作方式1
SM1=1;
REN=1;//允许串口
EA=1;//开总中断
ES=1;//打开串口中断
}
4、测试方案与测试结果
4.1硬件测试
第一步,通电观察。
将电路通电观察有无异常现象,例如有无器件冒烟现象,有无异常气味,手摸集成电路外封装,是否发烫等。
如果出现异常现象,应立即关断电源,待排除故障后再通电。
第二步,静态调试。
将信号输入端加固定的电平信号后进行的直流测试,可用万用表测出电路中各点的电位,通过和理论估算值比较,结合电路原理的分析,判断电路直流工作状态是否正常,及时发现电路中已损坏或处于临界工作状态的元器件。
通过更换器件或调整电路参数,使电路直流工作状态符合设计要求。
第三步,动态调试。
动态调试是在静态调试的基础上进行的,在电路的输入
端加入合适的信号,按信号的流向,用示波器顺序检测各测试点的输出信号,若
发现不正常现象,应分析其原因,并排除故障,再进行调试,直到满足要求。
4.2软件测试
所谓软件调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。
这是保证单片机正确运行的必不可少的步骤。
编完单片机程序,必须送入单片机中测试。
我把软件调试过程分为两步:
第一步,使用软件调试程序。
将编辑好的汇编语言程序进行编译连接,消除基本的语法错误,再通过软件自带的调试工具进行必要的程序调试。
第二步,联系程序的实际运行情况调试程序。
此步主要是消除程序中的逻辑错误,因为在编辑程序时在逻辑思维上可能会出现漏洞导致操作时出错。
我们将编辑好的汇编语言程序编译连接并生成hex文件,并将hex文件下载到单片机中。
通过实际操作寻找逻辑上的错误,不断的修改程序,最终达到了预先设定的操作步骤及显示格式等多方面的要求。
4.3测试结果
为了保证实际制作出来的汽车防撞报警系统能够稳定可靠地运行,我们对各个功能模块和程序运用仿真软件protus进行了仿真测试。
但实际制作出的电路和理论又会有一定的差距,为此我们还使用实验仪器对该汽车防撞报警系统进行了相关测试。
在本电路的调试中,如果一直发射超声波,在7脚将会有周期的低电平产生。
不会像通常认为的那样,即一直发射信号时,7脚一直为低电平。
这是刚用CX20106时的一个常见错误。
只要通过单片机来来计算发射信号时到收到信号是产生下降沿这段时间的长度,再通过数学计算,转化为距离,然后在显示器上显示。
在测试过程中的总结:
1、定时器T1之所以是65ms溢出是因为它是16位定时/计数器。
在使用12MHZ的晶振时,一个机器周期是1us,计数器65ms技术器溢出。
2、本设计中40KHZ方波的产生采用软件方式实现:
控制p1.0口输出12us的高电平,再输出13us的低电平,这样得到一个周期的40KHZ的脉冲。
再循环发送8次。
3、在cpu停止发送脉冲后,由于阻尼换能器不能立即停止发送超声波。
在一段时间内仍然会发送,故这段时间内不可立即开启INT0接收回波,要等待一段时间后,这样就避免发送端的部分直射波未经被测物就直接绕射到接收端。
4、最大测试距离将取决于:
两次脉冲发送之间的最小时间间隔和脉冲的能量。
一般来说发射端脉冲个数越多,能量越大,所能测的距离也越远。
但也不是无限制的。
本设计中读取定时器T0的计数值。
测试结果如图5-1所示
5、
5、总结
利用STC90C51单片机设计的超声波防撞报警系统便于操作、读数直观。
该系统工作稳定,能满足一般近距离测距的要求,且成本较低、有良好的性价比、设计中在超声波接收电路中使用了CX20106集成芯片,减少了电路之间的相互干扰,减少了电噪声。
本设计系统可广泛应用于小距离测量。
通过试验验证该设计系统灵活方便,工作稳定可靠,抗干扰能力强,精确度高,能够有效的防止小车碰撞前面的障碍物。
超声波换向器能很好的接收和发射信号,很大程度上降低了小车周围实物的干扰性,提高抗干扰性。
得到了预期的效果。
在本设计中,出现一个问题就是蜂鸣器一直响。
原因是:
(1)蜂鸣器是由程序控制的,只要检测到距离小于30cm,程序执行中断来处理蜂鸣器响这条指令。
(2)检查电池没有有电。
通过本设计我学到了很多在实际操作中的知识:
(1)STC90C51各个管脚的功能。
(2)LCD显示段选和位选的控制。
(3)每个模块的电路图的功能。
附录:
源程序
/*包含头文件*/
#include
#include
#defineDelay4us(){_nop_();_nop_();_nop_();_nop_();}
/*宏定义*/
#defineucharunsignedchar//无符号8位
#defineuintunsignedint//无符号16位
#defineulongunsignedlong//无符号32位
/*1602液晶显示器控制端口分配,数据使用P0端口*/
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
/*状态指示灯*/
sbitled1=P2^7;
sbitled2=P2^6;
sbitLEDBlue=P1^7;//测距指示灯,亮表示正在测距,灭表示测距完成
sbitBEEP=P2^5;
/*HC-SR04接口定义*/
sbitTrig=P2^4;//HC-SR04触发信号输入
sbitEcho=P2^3;//HC-SR04回响信号输出
/*电机驱动管脚定义*/
sbitEN_A=P1^0;
sbitEN_B=P1^1;
sbitMoto_LA=P1^2;//左电机
sbitMoto_LB=P1^3;
sbitMoto_RA=P1^4;//右电机
sbitMoto_RB=P1^5;
/*全局变量*/
ucharcodetable0[]={"Distance:
"};
ucharcodeASCII[]={'0','1','2','3','4','5','6','7','8','9','.','-','c','m'};
ucharcodetable1[]={"Safe!
"};
ucharcodetable2[]={"-OutofRange-"};
ucharcodeCls[]={""};
////////////////////////////////////////////////////////
uchardisbuff[]={0,0,0,0};//数据缓冲区
ulongdistancevalue;//测量距离
floattime=0;//测距时间
bitflag=0;//标志位
uinti=0;
///////////////////////////////////////////////////////
charflag1=0;//设置标志位,通过该标志位判断单片机是否接受到外部中断信号。
chara;//缓冲接受字符
/*函数声明*/
voiddelay_ms(uintms);
voiddelay_20us();
voidBeep(uchartime);
bitLCD_Busy_Check();
voidLCD_Display(ulongdiatance);
voidWrite_data(uchardat);
voidWrite_cmd(ucharcmd);
voidLCD_Initialize();
voidWrite_position(ucharX,uch