汽车超速报警系统毕设汇总.docx
《汽车超速报警系统毕设汇总.docx》由会员分享,可在线阅读,更多相关《汽车超速报警系统毕设汇总.docx(20页珍藏版)》请在冰豆网上搜索。
汽车超速报警系统毕设汇总
基于单片机的汽车超速报警系统
目录
1摘要3
1.1设计思路3
1.2方案论证3
1.3方案的提出3
1.4方案的比较及确定4
2硬件设计6
2.1主控模块6
2.2测速传感器6
2.3报警电路的设计7
2.4显示电路的设计7
2.5按键电路的设计8
2.6共阴极LED显示驱动器MAX7219芯片8
3软件设计10
4Proteus软件仿真12
4.1设定当前速度的仿真图:
12
4.2当前速度与设定速度仿真图13
4.3仿真结果与分析14
参考文献15
附1:
源程序代码16
第1章概述
1.1摘要及设计思路
随着汽车工业和高速公路建设的发展,每年由各种交通事故造成的人员伤亡数目惊人,造成了巨大的经济损失。
据统计,造成各种交通事故的主要原因是车辆的超载和超速行驶,而后者随机性很大,纠章困难,而且由于中国公路条件复杂,不同等级的公路允许的最高速度不同,现有的限速装置难以适应这种情况。
针对这种状况,开发具有智能决策模块的汽车。
近年来随着科技的飞速本设计是发展,为了克服传统模拟车速显示仪表显示数不准确及没有超速提示的缺点,数字化仪表迅速的进入汽车仪表行业,成为一种趋势,本文从驾驶员自身安全角度出发,设计了一种检测车辆超速的报警系统。
该报警系统允许驾驶员通过自带键盘设置本车辆安全行驶的最高速度当车辆处于行驶状态中,该系统通过速度传感器时刻监测机动车辆。
并通过LED显示车辆的实际车速和用户设置的安全参数.当发现车辆速度超过驾驶员设置的最高值时,蜂鸣器开始报警,警告灯不断闪烁,提醒驾驶员减速。
达到防患于未然的目的。
单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用。
此设计就是一种利用8051单片机对机动车超速行驶情况进行蜂鸣报警和灯光报警的系统。
该系统结构简单,可靠性高,操作方便,可广泛应用于摩托车、汽车等机动车辆。
本文要求设计一个具有数字显示功能的单片机系统,实现车辆当前速度输出,当达到所设定的速度上限时并报警,以保证驾驶人员的人身安全。
首先要进行系统的总体方案设计,在设计中一般应考虑以下几点:
(1)遵循从整体到局部的设计原则。
在过程中,应遵循从整体到局部的设计原则,把复杂难处理的问题分为若干个较为简单的、容易处理的问题,分别加以解决。
(2)经济性要求。
为了获得较高的性能价格比,设计时不应盲目追求复杂高级的方案。
在满足性能指针的前提下,应尽可能采用简单的方案,因为方案简单意味着所用的元器件少,可靠性高,而且比较经济。
(3)可靠性要求。
所谓可靠性是指产品在规定的条件下和规定的时间内完成规定功能的能力。
可靠性指针除了可用完成功能的概率表示外,还可以用平均无故障时间、故障率、失效率或平均寿命等来表示。
1.2方案论证
车速报警系统系统组成主要由单片机控制模块、霍尔传感器、LED数码显示器及声光报警器组成。
针对任务要求,我们发现此项设计在单片机接口芯片以及按键电路上有不同的选择。
因此,设计方案的比较主要对此展开。
1.3方案的提出
方案一:
采取通过带有I/O接口和计时器的静态RAM8155芯片与设定速度的键盘电路,速度显示电路,8155芯片具有256个字节的RAM,两个8位、一个6位的可编程I/O口和一个14为计数器。
系统的硬件电路简图如图1-1所示。
图1-1系统硬件电路简图
霍尔传感器用来产生脉冲方波,键盘输入用来设定限制速度,当车速超过最大速度Vm时,声光报警电路将发出报警信号。
单片机外部中断口接霍尔传感器的输出,车轮每转一圈产生一次INT0中断请求,单片机对INT0中断请求的次数进行计数。
并将在1秒内的计数值转换成机动车的时速,送至显示缓冲区以供显示程序调用。
具体算法如下:
设单片机每秒计数值为n,即nr/s。
设机车车轮的周长为dm,则机车的时速V=d×n×3.6km/h。
硬件电路方框图霍尔传感器的输出信号经AT89C51的INT0口输入并存储在内部R0M中,AT89C51外扩一片8155芯片,其PB口作为LED数码管的段选线,PA4~PA0作为LED的位选线和键盘的列线,PCO和PC1口作为键盘的行线,从而组成10个按键的键盘。
AT89C51的P2.6口外接三极管放大器用来驱动声光报警电路,P2.6不断地输出101010⋯⋯的高低电平,驱动声光报警电路报警。
只要使声光报警电路报警重复输出256Hz及350Hz的叫声各0.73s,便可以模拟警车的叫声,产生警示作用。
机车的上限速度Vm通过键盘设置并存储起来。
单片机检测霍尔传感器输出的信息,计算出机车当前的速度v,并送LED显示。
当V≥Vm时,控制声光报警电路报警发出警示音。
方案二:
利用高集成化的串行输入/输出的共阴极LED驱动显示器MAX7219及按键电路实现。
MAX7219芯片用来显示当前及设定速度,当速度超过最大速度Vm时,声光报警电路发出报警,按键设定用来设定报警速度(最大速度Vm)。
系统的硬件电路简图如图1-2所示。
图1-2系统硬件电路图
1.4方案的比较及确定
方案一和方案二比较,方案一采用8155芯片使用单片机引脚较多,采用键盘电路较复杂,而且只能显示当前速度,驾驶员对速度上限透明度不高,总体电路较复杂;方案二采用的MAX7219是一个高集成化的串行输入/输出的共阴极LED驱动显示器,每片可驱动8位7段加小数点的共阴极数码管,可以数片级联,而与微处理器的连接只需3根线,且速度设定只需通过几个按钮实现即可,并且可以实时实现速度上限的增减,因而硬件电路简单,人眼视觉效果好,可以方便的为驾驶员提供信息,易于实现维护,且MAX7219内部设有扫描电路,除了更新显示数据时从单片机接收数据外,平时独立工作,极大地节省了MCU有限的运行时间和程序资源。
对于本课题所研制的车速报警系统而言,其基本出发点就是利用现有工艺条件,采用现代计算机软件处理技术,提高系统的精度等级和工作的稳定性,拓展其功能,并赋予其智能化特征,使报警器不仅能够及时准确地显示车辆的当前速度信息,同时尽可能地减少不必要的人工操作,使报警能随时随地不间断进行并保证报警的工作效率。
有鉴于此,同时根据系统的要求,确定系统总设计方案如图所示:
图1-4车速报警系统总体设计方案图
第二章硬件设计
硬件设计该系统硬件主要包括以下四大模块:
8051单片机主拄模块、传感器模块、报警模块和显示模块等。
其中8051主要完成外围硬件的控制以及一些运箅功能:
传感器完成信号的采样功能;报警模块丰要负责声音报警和灯光报警:
显示模块完成字符、数字的显示功能。
2.1主控模块
本系统采用MCS一51系列的8051单片机作为控制核心。
8051抗干扰性好,适用于恶劣环境的场合。
8051CPU的工作频率采用12MHZ,方便系统对速度传感器的计数脉冲进行快速的处理。
805l的输入,输出引脚具有32根I/O口线。
可以连接存储器、LED显示器、速度传感器等各种外部器件。
8051具有低功耗和低电压工作模式的特点,可以利用电池对系统供电。
但8051内部只有256B的数据存储器,系统可以外接RAM芯片以满足系统的需求。
8051最小应用系统如下
图2-18051最小应用系统
2.2测速传感器
速度传感器是车辆传感器中的易损器件.所以该系统对测速传感器进行了改进,使它具有灵敏度高、价格低廉、不易损坏等优点。
测速传感器由霍尔开关、磁铁组成.其工作原理足将霍尔开关和磁铁分别安装在车架、车轮的适当位置,车辆行驶时,在磁铁的作用下,霍尔开关产生的开关信号输人到单片机的计数器T1引脚..805l的定时器0定时段时间后。
提取Tl中的脉冲个数.就可计算出车辆的行驶的瞬时速度。
霍尔传感器的外形图和与磁场的作用关系如下图所示。
磁钢用来提供霍尔能感应的磁场,当霍尔元件以切割磁力线的方式相对磁钢运动时在霍尔输出端口就会有电压输出,所以霍尔传感器和磁钢需要配对使用。
霍尔传感器检测转速示意图如下。
在非磁材料的圆盘边上粘贴一块磁钢,霍尔传感器固定在圆盘外缘附近。
圆盘每转动一圈,霍尔传感器便输出一个脉冲。
通过单片机测量产生脉冲的频率,就可以得出圆盘的转速。
同样道理,根据圆盘(车轮)的转速,再结合圆盘的周长就可以计算出物体的位移。
2.3报警电路的设计
报警模块丰要负责声音报警和灯光报警,报警电路均比较简单,声音报警由单片机引脚接上拉电阻,晶体管及扬声器构成,灯光报警由两个发光二极管构成,电路设计简图如下图
图2-2声光式报警电路
2.4显示电路的设计
显示电路由MAX7219芯片完成,MAX7219是一种高集成化的串行输入/输出的共阴极LED显示驱动器。
每片可驱动8位7段加小数点的共阴极数码管。
SEGA~SEGG(图中为A到G)为LED七段显示器段驱动端 ,SEGDP为小数点驱动端;(SEGA~SEGG,DP 驱动显示器7段及小数点的输出电流,一般为40mA左右,可软件调整,关闭状态时,接入GND。
)DIG7~DIG0:
8位数值驱动线。
输出位选信号,从每个LED公共阴极吸入电流,吸收显示器共阴极电流的位驱动线。
其最大值可达500mA,关闭状态时,输出+VCC。
MAX7219与LED数码管连接如下图
图2-3MAX7219与LED数码管连接电路图
2.5按键电路的设计
按键电路由四个开关加上拉电阻构成,使用单片机四个引脚,四个开关分别是速度设置、速度增加、速度减小以及速度确定,通过对开关的操作可以对速度上限值进行设定操作,由于另外有速度增减按键,可以方便的根据驾驶员的实时实地要求进行速度更改以达到报警目的,具有很强的操作灵活性。
其简图如下:
图2-4按键电路的连接图
2.6共阴极LED显示驱动器MAX7219芯片
MAX7219是一种高集成化的串行输入/输出的共阴极LED显示驱动器。
每片可驱动8位7段加小数点的共阴极数码管,可以数片级联,而与微处理器的连接只需3根线。
MAX7219内部设有扫描电路,除了更新显示数据时从单片机接收数据外,平时独立工作,极大地节省了MCU有限的运行时间和程序资源。
MAX7219芯片上包括BCD译码器、多位扫描电路、段驱动器、位驱动器和用于存放每个数据位的8×8静态RAM以及数个工作寄存器。
通过指令设置这些工作寄存器,可以使MAX7219进入不同的工作状态。
MAX7219的时序图(DINCLKLOAD原理)
图2-7MAX7219工作时序图
这个图很简单反映了DIN,CLK和LOAD的工作时序,就是告诉大家三个端口是怎么合作传送数据的。
其中,DIN是串行数据输入端,CLK和LOAD实际上是充当了组织者。
针对单片MAX7219介绍一下数据传送的过程:
首先,在CLK的下降沿,无效,在CLK的上升沿,第一位二进制数据被移入内部移位寄存器,然后CLK再出现下降沿,无效,然后CLK再出现上升沿,第二位二进制数据被移入内部移位寄存器,就这样工作十六个周期,完成十六个二进制(前八个是地址,后八个是数据)的传送,这当中LOAD一直是低电平,当完成十六个二进制的传送后。
把LOAD置成高电平,产生上升沿,把这16位串行数据锁存到数据或控制寄存器中。
完成装载。
然后再把LOAD还原为低。
重复开始的动作。
周而复之……
3系统原理图
第三章软件设计
系统程序流程图如下:
图4-1系统流程图
软件分为主程序、数据处理子程序、按键子程序、中断服务子程序、LED数码显示子程序、声光报警器报警程序等。
主程序主要完成硬件初始化、子程序调用以及显示、报警等功能。
数据处理子程序主要完成监测车辆速度即主要是计算出车辆的时速,为报警子程序提供参考数据;按键中断子程序主要实现合法参数的输入;报警子程序主要实现在车辆超速行驶状态下发出报警信号,包括SPEAKER输出子程序和警报灯的闪烁子程序;显示子程序设计采用数字化显示用户设定的最高时速和车辆实际时速,用MAX7219芯片驱动LED进行动态显示。
参考文献
[1]张俊谟.单片机的发展与应用[J].电子制作,2007,(08):
31.
[2]袁霞.娄云.汽车灯光网络化控制系统的研究[J].河南机电高等专科学校学报,2008,(05):
18-19,32
[3]李新.孙利生.基于DSP的汽车发动机转速测量系统研究[J].汽车科技,2008,(05):
61-64
[4]任国峰.李军伟.张雨.单片机在发动机转速测量中的应用[J].汽车科技,2006,(01):
38-40
[5]周旭艳.彭宣戈.朱兵.8051在车辆超速报警系统中的应用[J].井冈山学院学报.2006.(07).
[6]吴有林.安玉.熊飞桥.吴先绪.智能化汽车速度控制报警系统的设计[J].重庆大学学报(自然科学版).2005年,(12).
[7]魏勋.单片机车速数显及报警系统设刮.电子制作,2007年12期
[8]周旭艳_彭宣戈.8051在车辆超速报警系统中的应用.井冈山学院学报:
综合版-2006年02M期
附1:
源程序代码
#ifndef_Max7219_H_
#define_Max7219_H_
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDECODE_MODE0x09//译码方式
#defineINTENSITY0x0A
#defineSCAN_LIMIT0x0B
#defineSHUT_DOWN0x0C
#defineDISPLAY_TEST0x0D
#definedelay1us_nop_();
#definedelay2us{delay1us;delay1us;}
#definedelay4us{delay2us;delay2us;}
#definedelay5us{delay4us;delay1us;}
#definedelay12us{delay4us;delay4us;delay4us;}
sbitdin=P2^0;
sbitload=P2^1;
sbitclk=P2^2;
voidMax7219_Wr_byte(ucharwrdat);
voidMax7219_Wr_data(ucharaddr,uchardat);
voidInit_Max7219(void);
voidDisp_speed(uintspeed);
voidDisp_set_speed(uintset_speed);
//初始化MAX7219
voidMax7219_Init(void)
{
Max7219_Wr_data(SHUT_DOWN,0x01);
Max7219_Wr_data(DISPLAY_TEST,0x00);
Max7219_Wr_data(DECODE_MODE,0xff);
Max7219_Wr_data(SCAN_LIMIT,0x07);
Max7219_Wr_data(INTENSITY,0x0a);
}
voidMax7219_Wr_byte(ucharwrdat)
{
bitdat;
uchari;
for(i=0;i<8;i++)
{
clk=0;
dat=(bit)(wrdat&0x80);
if(dat)
din=1;
else
din=0;
wrdat<<=1;
clk=1;
}
}
voidMax7219_Wr_data(ucharaddr,uchardat)
{
load=0;
Max7219_Wr_byte(addr);
Max7219_Wr_byte(dat);
load=1;
}
voidDisp_speed(uintspeed)
{
ucharspeed_buf[4];
uchari;
speed_buf[0]=speed%10;
speed_buf[1]=speed/10%10|0x80;
speed_buf[2]=speed/100%10;
speed_buf[3]=speed/1000;
if(0==speed_buf[3])
{
speed_buf[3]=0x0f;
if(0==speed_buf[2])
speed_buf[2]=0x0f;
}
for(i=1;i<=4;i++)
{
Max7219_Wr_data(i,speed_buf[i-1]);
}
}
voidDisp_set_speed(uintset_speed)
{
ucharspeed_buf[4];
uchari;
speed_buf[0]=set_speed%10;
speed_buf[1]=set_speed/10%10|0x80;
speed_buf[2]=set_speed/100%10;
speed_buf[3]=set_speed/1000;
if(0==speed_buf[3])
{
speed_buf[3]=0x0f;
if(0==speed_buf[2])
speed_buf[2]=0x0f;
}
for(i=1;i<=4;i++)
{
Max7219_Wr_data(i+4,speed_buf[i-1]);
}
}
#endif
#include
sbitKEY0=P2^3;
sbitKEY1=P2^4;
sbitKEY2=P2^5;
sbitKEY3=P2^6;
sbitSPK=P2^7;
sbitLED_GREEN=P1^6;
sbitLED=P1^7;
uintset_speed;
uintspeed;
ucharsec_cnt;
voidInit_8051(void);
voidDelay(uchartime);
uintGet_key(void);
voidWarn_ring(void);
voidmain(void)
{
Init_8051();
Max7219_Init();
while
(1)
{
set_speed=Get_key();
Disp_speed(speed);
Disp_set_speed(set_speed);
Warn_ring();
}
}
voidDelay(uchartime)
{
uchart1,t2;
for(t1=time;t1>0;t1--)
for(t2=248;t2>0;t2--);
}
//初始化
voidInit_8051(void)
{
EA=0;
TCON=0x00;
TMOD=0x51;
TL0=0xe0;//定时20ms
TH0=0xb1;//T1计数13个脉冲
TL1=0xf3;
TH1=0xff;
TR0=1;
TR1=1;
IE=0x8a;
SPK=0;
LED=0;
LED_GREEN=1;
}
//定时器0函数,定时50*20ms=1s
voidTimer0_speed(void)interrupt1
{
ET0=0;
TR0=0;
TL0=0xe0;
TH0=0xb1;
TR0=1;
sec_cnt++;
ET0=1;
}
//计数中断计数10次半径d=20cm
//speed=0.2*60*10/sec_cnt*36km/h
voidCounter_speed(void)interrupt3
{floata=6250;
ET1=0;
TR1=0;
TL1=0xf3;
TH1=0xff;
TR1=1;
speed=4.52*a/sec_cnt;
sec_cnt=0;
ET1=1;
}
//键盘处理函数
uintGet_key(void)
{
staticuintkey_value;
if(!
KEY0)
{
Delay(40);
if(!
KEY0)
{
while(KEY3)
{
if(!
KEY1)
{
Delay(40);
if(0==KEY1)
{
while(0==KEY1)
{
Disp_set_speed(key_value);
}
key_value+=10;
if(key_value==9999)
key_value=0;
}
}
if(!
KEY2)
{
Delay(40);
if(0==KEY2)
{
while(0==KEY2)
{
Disp_set_speed(key_value);
}
key_value-=10;
if(key_value==0)
key_value=9999;
}
}
}
}
}
return(key_value);
}
//报警函数
voidWarn_ring(void)
{
if(speed>set_speed)
{
LED=1;
SPK=0;
Delay
(1);
SPK=1;
}
else
LED=0;
}