1、科技开放与实践创新项目结题验收报告项目名称:基于单片机的汽车防撞报警系统 指导老师: 项目组员: 参赛学院:电子与信息工程学院 日 期: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 软件测试
2、 4.3 测试结果第五部分 总结附录1:电路原理图附录2:源程序摘要 本设计是以 STC90C51 单片机配合 HC-06 蓝牙模块控制的汽车防撞报警系统。该装置将单片机的实时控制及数据处理功能与超声波的测距技术相结合,通过蓝牙模块控制小车的运行状态并检测汽车运行中与前方障碍物的距离,通过LCD显示装置显示距离,由蜂鸣器根据距离远近发出警告声。关键词:STC90C51 、蓝牙、超声波传感器测距、 报警、LCD一、 系统方案本系统主要由超声波检测模块、 蓝牙模块、LED显示模块、电源模块、声光报警模块(蜂鸣器、LED),下面分别论证这几个模块的选择。1.1 比较与选择 1.1.1 单片机的比较选
3、择 单片机芯片选型时,总的原则是: (1)芯片含有功能或数量略大于设计需求,设计需求尽可能用芯片完成,少用外围器件。 (2)技术性:要从单片机的技术指标角度,对单片机芯片进行选择,以保证单片机应用系统在一定的技术指标下可靠运行; (3)实用性:要从单片机的供货渠道、信誉程序等角度,对单片机的生产厂家进行选择以保证单片机应用系统在能长期、可靠运行; (4)可开发性:选用的单片机要有可靠的可以开发手段,如程序开发工具、仿真调试手段等。 STC90C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含有4KB的可反复擦写的只读程序存储器和128字节的随机存储器。该器件采用ATMEL
4、高密度非易失存储器制造技术制造,与工业标准的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 超声波测距法的论证与选择 方案一:强度
5、法是利用声波在空气中的传输损耗值来测量被测物的距离,被测物越远其反射信号越弱,根据反射信号的强弱就可以知道被测物的远近,但在使用这种方法时由于换能器之间的直接耦合信号很难消除,在放大器增益较高时这一直接耦合信号就使放大器饱和从而使整套系统失效,由于直接耦合信号的影响强度法测距只使用与较短距离的且精度要求不高的场合。 方案二: 往返时间检测法其原理是超声波传感器发射一定频率的超声波借助空气媒介传播,到达测量目标或障碍物后反射回来,经反射后由超声波接收器接收脉冲,其所经历的时间即往返时间。往返时间与超声波传播的路程的远近有关。根据测试传输时间可以得出距离。 这种方法不受声波强度的影响,直接耦合信号
6、的影响也可以通过设置“时间门 ”来加以克服,因此这种方法非常适合较远距离的测距,在精度的要求较高的情况下,需要考虑温度对超声波的传播速度的影响。按式v=331.4+0.607T(T为实际温度单位为摄氏度,v为超声波在介质中的传播速度,单位为m/s)对超声波传播速度加以修正,以减小误差。 因此,本设计中采用第二种方法,即往返时间检测法。 1.1.3 显示器的选择 方案一:使用多个数码管显示。LED数码管是利用二极管发光显示数字和字母,具有亮度大,接口设计业比较容易,价格相对较便宜等优点。但是由于它工作时电流较大,显示的信息量有限。 方案二:采用液晶显示。液晶特别是具有字符显示功能的液晶显示器,来
7、实现显示功能,不仅可以实现基本的显示信息,而且可以显示丰富的符号指示信息,信息量丰富且直观易懂。而且液晶显示功耗低,体积小。综上考虑,本设计采用方案二。 1.1.4 蓝牙模块的选择本模块分主机和从机,主机能和从机配对通信,从机与从机之间或主机与主机之间不能通信,从机能和电脑、手机等的蓝牙配对通信,购买时默认为从机。我们在做智能小车控制时,蓝牙模块主要是实现接收从手机端发送过来的指令,所以我们需要的是从机模块。蓝牙串口在模块功能上,偶数命名的互相兼容,从机命名的也互相兼容,也就是说,HC-04与HC-06,HC-03与HC-05在功能上是兼容的。HC-04与HC-06是比较早的版本,用户不可以自
8、己切换主机或者从机,AT指令集很少,包括修改蓝牙名(限于从机),修改密码,修改波特率,询问版本号等几个基本功能。在本次设计中我们只需实现简单的通信,因此选用HC-06模块。HC-06模块只记忆最后一次配对过的从机,并只与该从机配对,直到KEY(26脚)高电平触发时放弃记忆,26脚默认应该为低电平。1.2 方案描述通过查找资料进行方案论证和选择,可以确定出该系统的整体构成。本设计是以STC90c51单片机为核心,以设置手机界面来设置前进、后退、左转、右转、停止等功能。单片机控制电机驱动来控制电机的正反转以实现小车的前进、后退、左转、右转、停止。HC-06为蓝牙接收模块,通过与手机端的蓝牙进行连接
9、配对,从而接收从手机端发送过来的动作指令。接收到的指令再传递给单片机,单片机通过分析传递过来的指令不同,而跳转到不同的子程序来控制电机驱动,从而实现小车的前进、后退、左转、右转、停止等不同的动作。电源提供给单片机5V直流电,L298需要从外部接两个电压,一个是给电机的,另一个给L298芯片的。 汽车防撞装置可在任何天气、任何车速状态下探测出将要发生的危险情况并及时提醒司机及早采取措施或自动紧急制动,避免严重事故发生。汽车防撞装置是借助于检测测技术监视汽车前方和后方的车辆、障碍物,并根据当时的距离自动判断是否达到危险距离,及时向司机发出警告。二、理论分析及计算 2.1 超声波传感器的分析与计算
10、假设S为被测物体到测距仪之间的距离,测的时间为t,超声波传播的速度为v表示。则有关系式: S=v*(t/2)在精度的要求较高的情况下,需要考虑温度对超声波传播速度的影响,按式v=331.4+0.607T对超声波传播速度加以修正,以减少误差。式中T为实际温度单位摄氏度,v为超声波在介质中的传播速度,单位为m/s一些温度下的声速温度-30-20-100102030声速3133193223313373443502.2 蓝牙通信模块的分析处理 (1)原理 既然使用手机蓝牙控制,那小车上必须要有一个蓝牙模块与手机蓝牙通信。在这里选用了HC06蓝牙转串口模块。 HC06蓝牙转串口模块的作用是将从手机蓝牙发
11、送过来的指令接收到后转换成串口的形式通过单片机的串口传给单片机。只需将该模块的RXD接上51单片机的TXD引脚,TXD接51的RXD,然后接单片机的VCC供电,因为我们只用它接收手机蓝牙信号,不发送数据。它出厂默认设置的波特率9600 ,不重新设置它的波特率的话,在写单片机串口程序时,也要将波特率设置为9600。三、电路及程序设计3. 1系统总体框图 STC90C51超声波监测模块超声波监测模块超声波传感 器超声波传感 器液晶屏液晶屏显模块报警模块 蜂鸣器 LED 蓝牙模块小车 3. 1.1 各模块原理图及电路 a.超声波传感器超声波传感器时序图超声波传感器原理图 超声波发射电路 超声波接受电
12、路 b.L298N电机驱动模块 c.LCD d.蜂鸣器 E.蓝牙模块 接线方式 调试过程 蓝牙模块应用电路 3.2 程序设计主程序流程图 开始 系统初始化 启动T1定时65秒,开T1中断 T1定时器65ms定时到 进入T1中断服务子程序计时发 射超声波脉冲 YN回波接收成功 NT0溢出 关总中断允许EA Y 调用距离计算子程序调用子程序距离小于预设值 N 调用扬声器报警子程序 Y Y 调用子程序显示距离并延时 清回波接收成功标志位 a.超声波传感器 /启动超声波测量void Start_HCSR04()/生成20us的脉冲宽度的触发信号 Trig=1; delay_20us(); Trig=0
13、/等待回响信号变高电平 while(!Echo); TR0=1; /启动定时器0 /等待回响信号变低电平 While(Echo); TR0=0; /关闭定时器0 b.Lcd1602/检查LCD忙状态bit LCD_Busy_Check()bit result; LCD_RS=0; LCD_RW=1; LCD_EN=1; Delay4us(); result=(bit)(P0&0x80); LCD_EN=0; return result;/写数据void Write_data(uchar dat)while(LCD_Busy_Check();LCD_RS=1;LCD_RW=0;P0=dat;d
14、elay_ms(5);LCD_EN=1;delay_ms(5);LCD_EN=0;/写指令void Write_cmd(uchar cmd)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液晶初始化void LCD_Initialize() Write_cmd(0x38); /三次显示模式设置delay_ms(5); Write_cmd(0x38);delay_ms(5); Write_cmd(0x38);delay_ms(5); Write_cmd(0
15、x38); /显示模式设置Write_cmd(0x08); /关闭显示Write_cmd(0x01); /显示清屏Write_cmd(0x06); /显示光标移动设置Write_cmd(0x0F); /显示开及光标设置/按指定位置显示一个字符:X=列位置(0-15) Y=行位置(0,1)void Write_position(uchar X, uchar Y,uchar DData)Y &= 0x1; /限制Y不能大于1(2行,0-1)X &= 0xF; /限制X不能大于15(16个字符,0-15)if (Y) X |= 0x40; /当要显示第二行时地址码+0x40;X |= 0x80; /
16、算出指令码Write_cmd(X); /发命令字Write_data(DData); /发数据/按指定位置显示一串字符void Write_str(uchar X, uchar Y, uchar code *DData)uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; /限制X不能大于15,Y不能大于1while (DDataListLength0x19) /若到达字串尾则退出if (X = 0xF) /X坐标应小于0xFWrite_position(X, Y, DDataListLength); /显示单个字符ListLength+;X+;
17、 c.电机驱动/小车启动时初始化void Car_Init() /暂时处于停车待机状态EN_A = 1;EN_B = 1;Moto_LA = 0;Moto_LB = 0;Moto_RA = 0;Moto_RB = 0;/停止void stop()Moto_RA=0;Moto_RB=0;Moto_LA=0;Moto_LB=0;/前进void ahead()Moto_LA = 1;Moto_LB = 0;Moto_RA = 1;Moto_RB = 0;/后退void back()Moto_LA = 0;Moto_LB = 1;Moto_RA = 0;Moto_RB = 1;/左转void left
18、)Moto_LA = 0;Moto_LB = 1;Moto_RA = 1;Moto_RB = 0;/右转void right()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;/打开串口中断 /
19、设置串口中断的工作方式void communication() interrupt 4 RI = 0;/取消本次串口的响应 a = SBUF;/接受缓冲区的数据 flag1 = 1;/标记位 /初始化子程序void timer0_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;/打开串口中断四、
20、测试方案与测试结果4.1 硬件测试 第一步,通电观察。将电路通电观察有无异常现象,例如有无器件冒烟现象,有无异常气味,手摸集成电路外封装,是否发烫等。如果出现异常现象,应立即关断电源,待排除故障后再通电。 第二步,静态调试。将信号输入端加固定的电平信号后进行的直流测试,可用万用表测出电路中各点的电位,通过和理论估算值比较,结合电路原理的分析,判断电路直流工作状态是否正常,及时发现电路中已损坏或处于临界工作状态的元器件。通过更换器件或调整电路参数,使电路直流工作状态符合设计要求。 第三步,动态调试。动态调试是在静态调试的基础上进行的,在电路的输入端加入合适的信号,按信号的流向,用示波器顺序检测各
21、测试点的输出信号,若发现不正常现象,应分析其原因,并排除故障,再进行调试,直到满足要求。4.2 软件测试所谓软件调试,是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证单片机正确运行的必不可少的步骤。编完单片机程序,必须送入单片机中测试。 我把软件调试过程分为两步: 第一步,使用软件调试程序。将编辑好的汇编语言程序进行编译连接,消除基本的语法错误,再通过软件自带的调试工具进行必要的程序调试。 第二步,联系程序的实际运行情况调试程序。此步主要是消除程序中的逻辑错误,因为在编辑程序时在逻辑思维上可能会出现漏洞导致操作时出错。我们将编辑好的汇编语言程
22、序编译连接并生成hex文件,并将hex文件下载到单片机中。通过实际操作寻找逻辑上的错误,不断的修改程序,最终达到了预先设定的操作步骤及显示格式等多方面的要求。4.3 测试结果 为了保证实际制作出来的汽车防撞报警系统能够稳定可靠地运行,我们对各个功能模块和程序运用仿真软件protus进行了仿真测试。但实际制作出的电路和理论又会有一定的差距,为此我们还使用实验仪器对该汽车防撞报警系统进行了相关测试。 在本电路的调试中,如果一直发射超声波,在7脚将会有周期的低电平产生。不会像通常认为的那样,即一直发射信号时,7脚一直为低电平。这是刚用CX20106时的一个常见错误。只要通过单片机来来计算发射信号时到
23、收到信号是产生下降沿这段时间的长度,再通过数学计算,转化为距离,然后在显示器上显示。 在测试过程中的总结: 1、 定时器T1之所以是65ms溢出是因为它是16位定时/计数器。在使用12MHZ的晶振时,一个机器周期是1us,计数器65ms技术器溢出。 2、 本设计中40KHZ方波的产生采用软件方式实现:控制p1.0口输出12us的高电平,再输出13us的低电平,这样得到一个周期的40KHZ的脉冲。再循环发送8次。 3、 在cpu停止发送脉冲后,由于阻尼换能器不能立即停止发送超声波。在一 段时间内仍然会发送,故这段时间内不可立即开启INT0接收回波,要等待一段时间后,这样就避免发送端的部分直射波未
24、经被测物就直接绕射到接收端。4、 最大测试距离将取决于:两次脉冲发送之间的最小时间间隔和脉冲的能量。一般来说 发射端脉冲个数越多,能量越大,所能测的距离也越远。但也不是无限制的。本设计中读取定时器T0的计数值。测试结果如图 5-1所示5、五、 总结利用STC90C51单片机设计的超声波防撞报警系统便于操作、读数直观。该系统工作稳定,能满足一般近距离测距的要求,且成本较低、有良好的性价比、设计中在超声波接收电路中使用了CX20106集成芯片,减少了电路之间的相互干扰,减少了电噪声。本设计系统可广泛应用于小距离测量。 通过试验验证该设计系统灵活方便,工作稳定可靠,抗干扰能力强,精确度高,能够有效的
25、防止小车碰撞前面的障碍物。超声波换向器能很好的接收和发射信号,很大程度上降低了小车周围实物的干扰性,提高抗干扰性。得到了预期的效果。 在本设计中,出现一个问题就是蜂鸣器一直响。原因是:(1) 蜂鸣器是由程序控制的,只要检测到距离小于30cm,程序执行中断来处理 蜂鸣器响这条指令。(2) 检查电池没有有电。 通过本设计我学到了很多在实际操作中的知识: (1) STC90C51各个管脚的功能。 (2) LCD显示段选和位选的控制。 (3) 每个模块的电路图的功能。附录: 源程序/*包含头文件*/#include #include #define Delay4us()_nop_();_nop_();
26、nop_();_nop_();/*宏定义*/#define uchar unsigned char /无符号8位#define uint unsigned int /无符号16位#define ulong unsigned long /无符号32位/*1602液晶显示器控制端口分配,数据使用P0端口*/ sbit LCD_RS=P20; sbit LCD_RW=P21; sbit LCD_EN=P22;/*状态指示灯*/sbit led1 = P27;sbit led2 = P26;sbit LEDBlue=P17; /测距指示灯,亮表示正在测距,灭表示测距完成sbit BEEP=P25;/
27、HC-SR04接口定义*/ sbit Trig=P24; /HC-SR04触发信号输入sbit Echo=P23; /HC-SR04回响信号输出/*电机驱动管脚定义*/sbit EN_A = P10;sbit EN_B = P11;sbit Moto_LA = P12; /左电机sbit Moto_LB = P13;sbit Moto_RA = P14; /右电机sbit Moto_RB = P15;/*全局变量*/uchar code table0 =Distance: ;uchar code ASCII =0,1,2,3,4,5,6,7,8,9,.,-,c,m;uchar code ta
28、ble1 = Safe! ;uchar code table2 = -Out of Range- ;uchar code Cls = ;/uchar disbuff =0,0,0,0; / 数据缓冲区ulong distancevalue; /测量距离float time=0; /测距时间 bit flag=0; /标志位uint i = 0;/char flag1 = 0; /设置标志位,通过该标志位判断单片机是否接受到外部中断信号。char a; /缓冲接受字符/*函数声明*/void delay_ms(uint ms);void delay_20us();void Beep(uchar
29、time);bit LCD_Busy_Check();void LCD_Display(ulong diatance);void Write_data(uchar dat);void Write_cmd(uchar cmd);void LCD_Initialize();void Write_position(uchar X, uchar Y,uchar DData);void Write_str(uchar X, uchar Y, uchar code *DData);void timer0_init();void Start_HCSR04();/void Car_Init();void st
30、op();void ahead();void back();void left();void right();/主函数void main()timer0_init();Car_Init();LCD_Initialize();delay_ms(5); Write_str(0, 0, table0); /显示 Distance:while(1)if (flag1 = 1) ES = 0;/关闭串口 if (a = 0x00) ahead(); if (a = 0x01) back(); if (a = 0x02) left(); if (a = 0x03) right(); if (a = 0x0
31、4) stop(); flag1 = 0;/清除标志位 ES = 1;/打开串口中断 /启动超声波测距LEDBlue=0;Start_HCSR04();/求取距离值time=TH0*256+TL0;distancevalue=time/58; /计算结果为 cm/显示距离if(i != 0)LCD_Display(distancevalue);/报警if(distancevalue80)stop();Beep(1);led1=0;led2=0;elseBEEP=1;led1=1;led2=1; /延时65ms,进入下一次测距LEDBlue=1; delay_ms(65);i+; /设置串口中断
32、的工作方式void communication() interrupt 4 RI = 0;/取消本次串口的响应 a = SBUF;/接受缓冲区的数据 flag1 = 1;/标记位 /初始化子程序void timer0_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;/打开串口中断/定时器0中断服务
33、子程序void timer0() interrupt 1flag=1;/启动超声波测量void Start_HCSR04()/生成20us的脉冲宽度的触发信号 Trig=1; delay_20us(); Trig=0;/等待回响信号变高电平 while(!Echo); TR0=1; /启动定时器0 /等待回响信号变低电平 while(Echo); TR0=0; /关闭定时器0/延时 msvoid delay_ms(uint ms) uchar i, j; while(ms-) _nop_(); i = 2; j = 239; do while (-j); while (-i); /延时函数 2
34、0微秒void delay_20us() uchar i; _nop_(); i = 7; while (-i); /蜂鸣器 void Beep(uchar time) uchar k; for(k=0;k10;k+) BEEP=!BEEP; delay_ms(time); BEEP=0; delay_ms(100); /计算距离并显示到LCDvoid LCD_Display(ulong distance)TH0=0;TL0=0;disbuff0=distance%1000/100;disbuff1=distance%1000%100/10;disbuff2=distance%1000%10
35、10;if(distance 300)/测量超出范围flag=0;Write_position(10, 0, ASCIIdisbuff0); /距离 十位Write_position(11, 0, ASCII10); /距离 个位Write_position(12, 0, ASCIIdisbuff1); /显示 .Write_position(13, 0, ASCIIdisbuff2); /距离 小数位Write_position(14, 0, ASCII13); /显示 m/Write_position(10, 0, ASCII11);/Write_position(11, 0, ASCII11);/Write_position(12, 0, ASCII11);/Write_position(13, 0, ASCII11);/Write_position(14, 0, ASCII11);Write_str(0, 1, table2);else /显示 distance Write_position(10, 0, ASCIIdisbuff0); /距离 十位Write_position(11, 0, ASCII10); /距离 个位Write_position(12, 0, ASCIIdisbuff1); /显示 .Write_