汽车电子课程设计有关超速报警系统.docx
《汽车电子课程设计有关超速报警系统.docx》由会员分享,可在线阅读,更多相关《汽车电子课程设计有关超速报警系统.docx(30页珍藏版)》请在冰豆网上搜索。
汽车电子课程设计有关超速报警系统
一、课程设计的内容
随着汽车技术的发展,汽车电子设备的应用日益增多。
本课程设计在学生已全面系统掌握汽车电子控制技术的基础上展开,目的是掌握汽车电子设备线路设计的方法、规则与应用,以满足教学、科研和生产实际的要求,培养学生的分析解决问题的能力。
本次课程设计四人一组,总学时2周,设计内容可在下列三个模块中任选一个:
1、汽车转向信号系统控制电路的设计与分析,当汽车转弯、刹车、停靠时,转向信号系统可控制转向灯发出不同的信号;2、发动机转速测量系统的设计与分析,采用传感器测量发动机各工作状态的转速,并对转速信号进行处理;3、汽车超速报警器控制电路的设计与分析,在没有超速行驶的时候能把即时汽车行驶速度显示出来,当超过设定行驶速度值时,系统能发出报警信号。
五、应收集的资料及主要参考文献
[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).
一、绪论……………………………………………………………………………………5
二、方案设计与论证………………………………………………………………………5
1、设计思路………………………………………………………………………………5
2、方案论证………………………………………………………………………………6
三、系统主要部件结构和工作原理………………………………………………………6
1、MCS-51……………………………………………………………………………………6
2、lcd………………………………………………………………………………………10
四、硬件设计…………………………………………………………………………………11
1、电路protel原理图及pcb图…………………………………………………………11
2、protues仿真图…………………………………………………………………………12
五、软件设计…………………………………………………………………………………13
1、软件流程图……………………………………………………………………………13
2、程序清单………………………………………………………………………………14
六、仿真结果………………………………………………………………………………27
七、总结……………………………………………………………………………………28
一、绪论
本设计一个单片机控制的车速报警系统。
近年来随着科技的飞速本设计是发展,为了克服传统模拟车速显示仪表显示数不准确及没有超速提示的缺点,数字化仪表迅速的进入汽车仪表行业,成为一种趋势,本文从驾驶员自身安全角度出发,设计了一种检测车辆超速的报警系统。
该报警系统允许驾驶员通过自带键盘设置本车辆安全行驶的最高速度当车辆处于行驶状态中,该系统通过速度传感器时刻监测机动车辆。
并通过LED显示车辆的实际车速和用户设置的安全参数.当发现车辆速度超过驾驶员设置的最高值时,蜂鸣器开始报警,警告灯不断闪烁,提醒驾驶员减速。
达到防患于未然的目的。
单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用。
此设计就是一种利用8051单片机对机动车超速行驶情况进行蜂鸣报警和灯光报警的系统。
该系统结构简单,可靠性高,操作方便,可广泛应用于摩托车、汽车等机动车辆。
该设计详细介绍了系统的总体设计方案,给出了界面模块与8051接口电路,系统硬件电路及外围设计电路,最后介绍了软件设计方法度程序流程图。
二、方案设计与论证
1、设计思路
本文要求设计一个具有数字显示功能的单片机系统,实现车辆当前速度输出,当达到所设定的速度上限时并报警,以保证驾驶人员的人身安全。
首先要进行系统的总体方案设计,在设计中一般应考虑以下几点:
(1)遵循从整体到局部的设计原则。
在过程中,应遵循从整体到局部的设计原则,把复杂难处理的问题分为若干个较为简单的、容易处理的问题,分别加以解决。
(2)经济性要求。
为了获得较高的性能价格比,设计时不应盲目追求复杂高级的方案。
在满足性能指针的前提下,应尽可能采用简单的方案,因为方案简单意味着所用的元器件少,可靠性高,而且比较经济。
(3)可靠性要求。
所谓可靠性是指产品在规定的条件下和规定的时间内完成规定功能的能力。
可靠性指针除了可用完成功能的概率表示外,还可以用平均无故障时间、故障率、失效率或平均寿命等来表示。
(4)操作和维护要求。
在车速报警系统的硬件和软件设计时,应当考虑操作方便,尽量降低对操作人员的专业知识的要求,以便产品的推广应用。
系统的输入—输出方式,操作程序应尽量简单明了,无须专门训练就能掌握其使用方法
2、方案论证
方案一:
在protues中用方波发生器代替传感器,将输入的一定值的脉冲转换为对应的速度值,并在lcd上显示出来。
脉冲与速度的换算关系由程序决定。
当速度在设置的正常速度范围内,在lcd上显示“normal”;当速度超过预定的值时,由蜂鸣器发出提示声,提示超速。
方案二:
采用模拟电路的方法,通过积分器得到电压,然后用比较器来控制报警输出,这种方法会比较粗,不能精确设置速度。
方案一主要就是用到单片机,方案二是模拟电路,特别是运放和比较器。
最后我们组确定采用方案一。
三、系统主要部件结构及其工作原理:
1、MCS-51
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,
2、LCD
LCD的横截面很像是很多层三明治叠在一起。
每面最外一层是透明的玻璃基体,玻璃基体中间就是薄膜电晶体。
颜色过滤器和液晶层可以显示出红、蓝和绿三种最基本的颜色。
通常,LCD后面都有照明灯以显示画面。
一般只要电流不变动,液晶都在非结晶状态。
这时液晶允许任何光线通过。
液晶层受到电压变化的影响后,液晶只允许一定数量的光线通过。
光线的反射角度按照液晶控制。
当液晶的供应电压变动时,液晶就会产生变形,因而光线的折射角度就会不同,从而产生色彩的变化。
一个完整的TFT显示屏由很多像素构成,每个像素象一个可以开关的晶体管。
这样就可以控制TFT显示屏的分辨率。
如果一台LCD的分辨率可以达到1024x768像素(SVGA),它就有那么多像素可以显示。
四、硬件设计
1、电路protel原理图
Pcb图
2、protues仿真图
五、软件设计
1、程序流程图
主程序
自检程序
正常(中断)程序
2、程序清单
/**********************************************************
//文件名:
qichedianzi.c
//作者:
Evens
//日期:
2009-6-30
//文件描述:
模拟汽车测速
MCU:
使用AT89C52单片机,12MHz
***********************************************************/
/*****************************相关定义和声明***********************************/
#include//调用头文件(单片机内部的寄存器定义)
/******本段为硬件I/O口定义********/
sbitLCD_RS=P1^0;
sbitLCD_RW=P1^1;
sbitLCD_E=P1^2;
#defineLCD_DATAP2//LCDDATA
#defineLCD_BUSY0x80//用于检测LCD的BUSY标识(本程序中用的延时,未检测)
#defineucharunsignedchar
#defineuintunsignedint
//全局变量声明
uintspeed;
uchartest=1;//自检模式
ucharnormal=0;//正常模式
ucharnor_speed;//不超速
ucharexc_speed;//超速
ucharcnt_ovtime;//单位时间内计数器溢出次数
//
uintdatadis[5]={0x00,0x00,0x00,0x00,0x00};//存放速度个,十,百,还有小数点后一位,还有个中间变量
//函数声明
voidlcd_init(void);
voiddisplay_string(ucharx,uchary,uchar*s);
voiddisp_selec(ucharbit_selec,ucharseg);
voidinit_timer0();//初始化计数器T0
voidinit_timer1();//初始化定时器T1
/**********************************定义声明结束***********************************/
/*************************************相关函数************************************/
/**************************************************
**函数名:
delay_ms
**输入:
无
**输出:
无
**描述:
1ms延时,使用12MHz晶体
/*************************************************/
voiddelay_ms(uinti)
{
uintj;
while(i--)
{
for(j=0;j<125;j++);
}
}
/**************************************************
**函数名称:
dellay
**入口参数:
h(unsignedint型)
**出口参数:
无
**功能描述:
短暂延时,使用11.0592晶体,约0.01MS
****************************************************/
voiddellay(uinth)
{
while(h--);//0.01MS
}
/***************************************************
**函数名:
cont_buzz_led
**输入:
灯和蜂鸣器的编码
**输出:
灯和蜂鸣器的状态
**描述:
控制灯和蜂鸣器的状态
****************************************************/
/*************************************相关函数结束**************************************/
/**************************************定时计数器设置************************************/
//初始化定时器T0
voidinit_timer0()//定时10毫秒
{
TMOD=0x51;//GATE0=0;C/T0#=0;M10=0;M00=1;
TH0=0xD8;//初始值
TL0=0xF0;
ET0=1;//允许T0中断
EA=1;//开总中断
TR0=1;//启动T0
}
//初始化定时器T1
voidinit_timer1()
{
TMOD=0x51;//GATE0=0;C/T0#=0;M10=0;M00=1;
TH1=0x00;//初始值
TL1=0x00;
ET1=1;//允许T1中断
EA=1;//开总中断
TR1=1;//启动T1
}
voidit_timer0()interrupt1//中断地址0x000b
{
ucharcounter;
TF0=0;
TH0=0xD8;//初始值,10ms中断一次
TL0=0xF0;
counter++;
if(counter==100)//中断100次就是1秒
{
speed=(TH1*256+TL1+65536*cnt_ovtime)/100;//提取脉冲数以KHz为单位,即相当于模拟一个速度
if(speed>=1200)//判断是否超速
{
exc_speed=1;//速度大于120,标志为超速
nor_speed=0;
}
else
{
nor_speed=1;
exc_speed=0;
}
TH1=TL1=0x00;//THx清0
counter=0;//中断次数清0
cnt_ovtime=0;
}
}
voidit_timer1()interrupt3//中断地址0x001b
{
TF1=0;//定时器T1用于单位时间内收到的脉冲数
cnt_ovtime++;
}
/**************************************定时计数器设置结束***********************************/
/***************************************LCD1602驱动程序**************************************/
/**************************************************
**函数名称:
WriteDataLcd
**入口参数:
wdata(unsignedchar型)
**出口参数:
无
**功能描述:
写数据到LCD
****************************************************/
voidWriteDataLcd(ucharwdata)
{
LCD_DATA=wdata;
LCD_RS=1;
LCD_RW=0;
LCD_E=0;
dellay(100);//短暂延时,代替检测忙状态
LCD_E=1;
}
/**************************************************
**函数名称:
WriteCommandLcd
**入口参数:
wdata(unsignedchar型)
**出口参数:
无
**功能描述:
写命令到LCD
****************************************************/
voidWriteCommandLcd(ucharwdata)
{
LCD_DATA=wdata;
LCD_RS=0;
LCD_RW=0;
LCD_E=0;
dellay(100);//短暂延时,代替检测忙状态
LCD_E=1;
}
//LCD初始化
voidlcd_init(void)
{
LCD_DATA=0;
WriteCommandLcd(0x38);
dellay(1000);
WriteCommandLcd(0x38);//显示模式设置
WriteCommandLcd(0x08);//关闭显示
WriteCommandLcd(0x01);//显示清屏
WriteCommandLcd(0x06);//显示光标移动设置
WriteCommandLcd(0x0c);//显示开及光标移动设置
}
/**************************************************
**函数名称:
display_xy
**入口参数:
x(unsignedchar型),y(unsignedchar型)
**出口参数:
无
**功能描述:
设置光标位置,x是列号,y是行号
****************************************************/
voiddisplay_xy(ucharx,uchary)
{
if(y==1)
x+=0x40;
x+=0x80;
WriteCommandLcd(x);
}
/********************************************************************
**函数名称:
display_char
**入口参数:
x(unsignedchar型),y(unsignedchar型),dat(unsignedchar型)
**出口参数:
无
**功能描述:
在具体位置显示单个字符,x是列号,y是行号
*********************************************************************/
voiddisplay_char(ucharx,uchary,uchardat)
{
display_xy(x,y);
WriteDataLcd(dat);
}
/*********************************************************************
**函数名称:
display_string
**入口参数:
x(unsignedchar型),y(unsignedchar型),s(指针型)
**出口参数:
无
**功能描述:
在具体位置显示字符串,以/0结束,x是列号,y是行号
**********************************************************************/
voiddisplay_string(ucharx,uchary,uchar*s)
{
display_xy(x,y);
while(*s)
{
WriteDataLcd(*s);
s++;
}
}
/**************************************LCD1602程序结束********************************************/
/*******************************************主程序*************************************************/
voidmain()
{
lcd_init();//初始化LCD
init_timer0();//初始化定时器,计数器
init_timer1();
if(test)//检试模式
{
P3|=0x07;//绿灯亮,红灯亮,蜂鸣器响
display_string(0,0,"Life'sprecious!
");
display_string(0,1,"*SafeDriving!
*");
delay_ms(2000);//延时
P3&=~0x07;//绿灯灭,红灯灭,蜂鸣器灭
lcd_init();//初始化LCD
test=0;
normal=1;
delay_ms(2000);
}
if(normal)//正常模式
{
while
(1)
{
if(nor_speed)//不超速
{
P3|=0x01;//绿灯亮
P3&=~0x06;//红灯灭,蜂鸣器灭
display_string(0,0,"Speed:
");
dis[3]=speed/1000;//百位
dis[4]=speed%1000;
dis[2]=dis[4]/100;//十位
dis[4]=dis[4]%100;
dis[1]=dis[4]/10;//个位
dis[0]=dis[4]%10;//小数点后一位
if(dis[3]!
=0)//如果百位为0,屏蔽
{
display_char(6,0,dis[3]+0x30);
}
else
{
display_char(6,0,0xA0);
}
display_char(7,0,dis[2]+0x30);
display_char(8,0,dis[1]+0x30);
display_char(10,0,dis[0]+0x30);
display_string(9,0,".");//显示小数点
display_string(11,0,"km/h");//显示速度单位
display_string(0,1,"Status:
Normal");
}
if(exc_speed)//超速
{
display_string(0,0,"Speed:
");//显示速度值
dis[3]=speed/1000;//百位
dis[4]=speed%1000;
dis[2]=dis[4]/100;//十位
dis[4]=dis[4]%100;
dis[1]=dis[4]/10;//个位
dis[0]=dis[4]%10;//小数点后一位
if(dis[3]!
=0)//如果百位为0,屏蔽
{
display_char(6,0,dis[3]+0x30);
}
else
{
display_char(6,0,0xA0);
}
display_char(7,0,dis[2]+0x30);
display_char(8,0,dis[1]+0x30);
display_char(10,0,dis[0]+0x30);
display_string(9,0,".");//显示小数点
display_string(11,0,"km/h");//显示速度单位
display_stri