1、 课程设计(论文) 设计课题: 基于单片机汽车尾灯控制 学校院系: 海南师范大学物电学院 专 业: 10电子一班 学生姓名: 学 号: 指引教师: 摘 要 本次课题是基于单片机汽车尾灯
2、控制器,该设计课题重要由STC89C52RC单片机为核心展开汽车尾灯控制电路设计办法,用发光二极管模仿汽车尾灯,可以用VB上位机界面和按键开关作为转弯等控制信号,,并且把信息显示在LCD1602上。在VB6.0环境下,上位机运用MSCOMM通信控件与单片机之间串口通信实现上位机控制汽车尾灯。设计电路能较好综合运用咱们所学习到单片机、C语言、VB上位机编程,熟悉电子电路设计基本办法。 核心词:STC89C52RC;发光二极管;单片机;C语言; VB上位机; MSCOMM控件 引言 3 一· 设计任务 3 1.1 任务阐明 3 1.2 任务分析 3 二· 设计方案选
3、取及论证 4 2.1 方案一:采用555定期器等构成汽车尾灯电路 4 2.2 方案二:由STC89C52RC及其外围电路构成汽车尾灯控制器 4 2.3 方案比较和选取 4 2.4 系统框图 5 三· 系统硬件原理简介 7 3.1 单片机STC89C52RC简介 7 3.2 LCD1602液晶屏简介 8 3.3 系统构造原理图、器件选取 9 3.4 硬件电路总原理图 14 3.5 硬件设计原理及状态图 14 四.程序流程 15 4.1下位机软件程序 15 4.1.1 键盘扫程序设计流程图 15 4.2.1 显示程序设计流程图 17 4.2 VB上位机界面设计 1
4、8 4.2.1设计方案原理与设计特点分析 18 五·仿真图实物调试 20 5.1仿真图 20 5.2实物图 21 六·课设总结 21 参照文献 22 附录一 23 引言 汽车作为当代交通工具已经大量进入人们生活,随着电子技术发展,对于汽车控制电路也已经从过去全人工开关控制发展到了智能化控制。汽车尾灯控制器是随着汽车智能化技术发展而迅速发展起来,汽车尾灯普通基于微解决器硬件电路构造构成,而正由于硬件电路局限性,不能随意更改电路功能和性能,且可靠性得不到保证,因而对汽车尾灯控制系统发展带来局限性,难以满足当代智能化规定。 本次设计是基于单片机汽车尾灯控制器,
5、用发光二极管模仿汽车尾灯,用VB上位机和按键开关作为汽车转弯等控制信号,实现汽车尾灯智能化控制。 一· 设计任务 1.1 任务阐明 本次课题重要是以STC89C52RC为核心单片机控制电路,它重要模仿了汽车尾灯系统正常行驶、转弯、刹车、倒车、夜间行驶等状态下发光状况,实现了汽车尾灯控制智能化。 1.2 任务分析 设计一种基于单片机汽车尾灯控制器,其详细设计规定如下: 1)汽车白天正常行驶时批示灯全灭; 2)汽车右(左)转弯时,先后最右(左)边和右(左)侧那个批示灯亮并闪烁; 3)汽车暂时刹车时车尾灯所有亮; 4)汽车倒车时尾灯中间4个批示灯亮; 5)汽车夜间行驶时,车前灯
6、全亮,尾灯两边各中间灯亮; 6)可通过串口连接PC控制车尾灯(自己发挥某些); 二· 设计方案选取及论证 2.1 方案一:采用555定期器等构成汽车尾灯电路 采用译码器74LS138、计数器74LS161、脉冲产生器555、开光控制电路、显示驱动电路、发光二极管以及各种逻辑元件等构成汽车尾灯控制电路。由于汽车左右转弯时,四个批示灯循环点亮,因此用四进制计数器控制译码器电路顺序输出低电平,从而控制尾灯按规定点亮,达到模仿汽车转弯、刹车、正常行驶等状态。由于行车时都是开关控制,因此每一种开关都应当有一种消除机械振动装置,可以用基本SR触发器来实现。 2.2 方案二:由STC89C52RC
7、及其外围电路构成汽车尾灯控制器 STC89C52RC 是一种低功耗、高性能CMOS8位微控制器,具备 8K 在系统可编程Flash 存储器。 本次单片机控制系统以STC89C52RC为控制器,键盘为输入信号,由于STC89C52RC自身功能强大,汽车转弯灯驱动用单片机驱动功能来完毕。使得单片机功能得到了充分运用;并且显示电路从并行I/O口输出,由限流电阻和发光二极管构成,低电平使发光二极管导通,显示
8、出相应信号灯亮灭状况,实现了左转、右转、刹车、应急灯各种状态下控制效果。 2.3 方案比较和选取 方案一中,要使用各种控制电路,实现办法繁杂且不灵活,成本高,搭建好电路后调试起来不以便,不可以任意定义各种状态,电路可靠性以及可扩展性不高,且与本次课题所规定运用知识相悖,因而不适当使用此方案。 方案二中,以单片机为核心,而单片机编程比较直接,且可重复擦除修改,硬件电路搭建以便简朴。搭建好电路后通过STC89C52RC来编写程序,控制LED亮灭,大大简化了系统构造,减少材料成本,提高系统先进性和可靠性,能实现控制器智能化。由于采用此种办法开发系统其升级和改进较为以便,因而本次课题选用方案二。
9、 采用串口连接笔记本电脑,通过VB上位机控制LED亮灭,实现真正意义上智能化控制。 发 光 二 极管 显 示 电路 STC89C 52RC 2.4 系统框图 时钟电路 1602液 晶 屏 显示 电 路 复位电路 PC电脑上位机 按键电路 串口电路MAX232 图2.4.1 系统构造框图 整个系统涉及电源电路、时钟电路、复位电路、按键电路、发光二极管显示电路、液晶屏显示电路、串口电路、单片机、PC上位机等。其中重要由按键电路和PC上位机发出控制信号,由显示电路显示信号详细状态。 三· 系统硬件原理简介
10、 3.1 单片机STC89C52RC简介 图3.1.1STC89C52RC引脚图 (1)STC89C52RC某些引脚功能简介: 1、VCC: STC89C52RC电源正端输入,接+5V。 2、VSS: 电源地端。 3、XTAL1: 单芯片系统时钟反相放大器输入端。 4、XTAL2: 系统时钟反相放大器输出端,普通在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 小电容,可以使系统更稳定,避免噪声干扰而死机。 5、RESET: STC89C52RC重置引脚,高电平动作,当要
11、对晶片重置时,只要对此引脚电平提高至高电平并保持两个机器周期以上时间,AT89S51便能完毕系统重置各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。 3.2 LCD1602液晶屏简介 1602LCD重要技术参数: 显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V 字符尺寸:2.95×4.35(W×H)mm 引脚功能阐明: 1602LCD采用原则14脚(无背光)或16脚(带背光)接口,各引脚接口阐明如表10-13所示: 编号 符号 引脚阐明 编
12、号 符号 引脚阐明 1 VSS 电源地 9 D2 数据 2 VDD 电源正极 10 D3 数据 3 VL 液晶显示偏压 11 D4 数据 4 RS 数据/命令选取 12 D5 数据 5 R/W 读/写选取 13 D6 数据 6 E 使能信号 14 D7 数据 7 D0 数据 15 BLA 背光源正极 8 D1 数据 16 BLK 背光源负极 表10-13:引脚接口阐明表 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示屏对比度调节端,接正电源时对比度最弱,接
13、地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一种10K电位器调节对比度。 第4脚:RS为寄存器选取,高电平时选取数据寄存器、低电平时选取指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光源正极。 第16脚:背光源负极。 3.3 系统构造原理图、器件选取 (
14、1)电源电路 图3.3.1 电源电路 电源电路可以给单片机提供工作所需电源,有批示灯提示,灯亮时表达提供正常工作电压。 (2)时钟电路 图3.3.2 时钟电路 时钟电路中使用12M晶振,为单片机提供系统时钟。 (3)复位电路 图3.3.3 复位电路 复位电路是单片机能上电复位,当程序混乱跑飞时可以通过按键手动复位。 (4)按键电路 图3.3.4 按键电路 按键电路可以通过按键来模仿汽车转弯、刹车、应急等各种状态,控制LED和液晶屏
15、显示。 (5)发光二极管显示电路 图3.3.5 发光二极管显示电路 发光二极管可以模仿汽车车灯,显示各种控制信号效果。 (6)液晶屏显示电路 图3.3.6 液晶屏显示电路 液晶屏显示电路可以直观显示出汽车行进状态,增长尾灯系统可视性。 (7) 串口电路 为了使单片机内电平与计算机电平同样需要运用电平转换,MAX232芯片是专为RS232原则串口设计单电源点平转换芯片。其特点如下: 1)符合所有RS232技术原则; 2)只需要单一 +5V电源供电; 3)片载电
16、荷泵具备升压、电压极性反转能力,可以产生+10V和-10V电压; 4)功耗低,典型供电电流5mA; 5)内部集成2个RS-232C驱动器; 6)高集成度,片外最低只需4个电容即可工作; 7)连接方式如图5所示。 图5串口连接 3.4 硬件电路总原理图 图3.4.1 总原理图 硬件总原理分解如3.3.1~3.3.6各图所示,完整实现了汽车尾灯控制,用按键模仿控制信号,用发光二极管和液晶屏显示状态,达到所有指标。 3.5 硬件设计原理及状态图 本次由按键作为控制信号,发光二极管模仿汽车尾灯,状态表如下所示:
17、 驾驶操作 输出信号 LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8 左转 灭 灭 闪烁 灭 灭 灭 灭 灭 右转 灭 灭 灭 闪烁 灭 灭 灭 灭 刹车 亮 亮 亮 亮 亮 亮 亮 亮 正常行驶 亮 亮 灭 灭 亮 亮 灭 灭 夜间行驶 亮 亮 灭 灭 灭 灭 亮 亮 倒车行驶 灭 灭 灭 灭 亮 亮 亮 亮 本次课题重要以STC89C52RC为核心展开汽车尾灯控制器,通过原理仿真以及实物制作,完整实现了汽车尾灯智能
18、化控制效果,相比此前用数字逻辑电路原理打成汽车尾灯更以便、更简朴。制作出实物板有6个控制状态按键,可以搭配起来控制6种汽车行驶状态,完美模仿了汽车尾灯控制系统,完毕本次课题所有指标。 四.程序流程 4.1下位机软件程序 4.1.1 键盘扫程序设计流程图 键扫程序过程为:开始时,先判断与否有键闭合,无键闭合时,返回继续判断,有键闭合时,先去抖动,然后拟定与否有键按下,若无键按下,则返回继续判断与否有键闭合,若有键按下,则判断键号,然后释放,若释放按键完毕,则返回,若没有释放按键,则返回继续释放。其流程图如图所示。 软件设计思路,程序开始后进入初始化,然后扫描键盘等待有键按下。如果没有键
19、按下则始终扫描,如果有键按下,则判断是哪个键,如果为1键,则正常行驶;为2键,则右转;为3键,则左车;为4键,则应急状态;为5键,则倒车行驶;为6键,则夜间行驶。 Y N 开始 有键闭合否? 去抖动 确有键按下 判断按键 释放 LED状态 返回 Y N Y N 图4.3.1 软件流程图 4.2.1 显示程序设计流程图 N Y N 与否 返回 LCD 初始化 显示汉ACSII码 显示开始 显示字符 相应功能设立
20、 送地址 送数据 N N 相应功能设立 送行地址和列地址 送数据 与否 Y Y 图 4.2.1 显示程序流程图 显示程序过程为:显示开始时,先进行LCD初始化,判断与否显示中文或ACSII码或图形,若不显示,则返回,若显示是中文或ACSII码,则进行相应功能设立,然后送地址和数据,再判断与否显示完,显示完则返回,没有显示完则继续送地址,若显示是图形,则先进行相应功能设立,再送行地址和列地址,然后送数据,最后判断与否显示完,显示完则返回,没有显示完则继续送行地址和列地址。其流程图
21、如图7所示。 (1)在编写液晶屏显示程序时,发现液晶屏只能瞬间显示状态,而不能保持,因而在液晶显示程序后要加上一种延时,使液晶屏可以保持状态; (2)要使发光二极管闪烁可以通过指令让其取反,但是在编写程序时,只能取反一次,一次可以使用一种while函数,当没有按键时候发光二极管始终取反,且在程序里加上恰当延时; (3)在使发光二极管闪烁时,如果前一种状态中正在使用改二极管,则切换状态后,每个灯管闪烁时间不同步,因而在让其闪烁之前先令所有二极管保持同一种状态; 4.2 VB上位机界面设计 4.2.1设计方案原理与设计特点分析 (1)IO控制系统原理框图: 单
22、片机 上位机控制软件 发送数据 将PC机和单片机通过RS232连接,通过上位机软件可以向单片机发送数据来测试两者通讯状态,同步单片机也可以向上位机软件返回数据,以显示当前通信状态与否正常。以及用上位机软件控制单片机上批示灯工作。从而实现简朴IO控制系统。 (2)上位机软件 (3)通信合同 本通信系统使用了一种简朴通信合同,就是每当向单片机发送一种特定字符串时,单片机在接受到字符串时会向上位机软件反馈一条信息,来表白上位机软件和硬件与否正常通信,制定通信合同时需要指定端标语,核心代码如下: MSComm1.CommPo
23、rt = “ ” MSComm1.InputMode = “ ” MSComm1.RThreshold = “ ” MSComm1.SThreshold = “ ” MSComm1.Settings = " " MSComm1.PortOpen = “ ” VB上位机界面通过合同控制车灯智能开关。 五·仿真图实物调试 5.1仿真图 5.2实物图 6 课设总结 本次课设作品重要元件为STC89C52RC,在其控制下保证了系统正常工作,达到模仿汽车尾灯控制效果
24、实现汽车尾灯智能化控制。 两周课程设计,相较于之前所选修各种实验课程,本次更增长了自己动手实践能力。理论与实践还是有一定差距,在理论上不论多精准数据,一旦用于实际中,就不得不考虑其仪器,器件误差,以及自己操作上能力。 并且,在课设过程中添加了自己思考,该选取如何电阻、电容,想要修改最后输出,应当在什么地方做变化。虽然是某些很基本东西,但仅仅是书上理论学习,会让人对知识遗忘得比较快,相反,通过自己动手实践过东西,会更加记忆深刻。看着自己成功制作出来电路板觉得很有成就感。 通过这次课设教我还学会诸多关于电子产品知识。进一步结识了咱们现实生活电子产品,理解和掌握了某些简朴电子元件运用,大大扩
25、展了咱们知识面。提高了自己后来在学习 生活中自己动手能力。给咱们很大启发,很有助于咱们将来学习生活和工作。在查阅资料中,获得了许多额外知识,开拓视野。在原理图设计、使用proteus仿真、使用Altium绘制、实物制作、板子调试等整个过程中加强了咱们分析问题和解决问题能力,深刻体味到实践是检查真理唯一原则这一道理。综上所述,这次课设,让咱们受益匪浅。 参照文献 [1]李广弟,朱月秀,王秀山.单片机基本[M].北京:航空航天大学出版社,. [2]康华光,陈大钦.电子技术基本模仿某些[M].武汉:高等教诲出版社,1998. [3]谢自美.电子线路设计·实验·测试(第二版).武汉:华中理工
26、出版社,.
[4]戴佳.51单片机C 语言应用程序设计实例精讲[M].电子工业出版社,.
[5]徐爱钧,彭秀华。Keil Cx51 V7.0单片机高档语言编程与μVision2应用实践[M].北京:电子工业出版社,.
附录一
单片机源程序:
#include
27、EY5=P1^4; sbit KEY6=P1^5; sbit LED1=P2^0; sbit LED2=P2^1; sbit LED3=P2^2; sbit LED4=P2^3; sbit LED5=P2^4; sbit LED6=P2^5; sbit LED7=P2^6; sbit LED8=P2^7; sbit LCD_RS = P3^4; sbit LCD_RW = P3^5; sbit LCD_EN = P3^6; void delay(unit t); void delay1(int ms); #define de
28、layNOP();{_nop_();_nop_();_nop_();_nop_();};
void delay(unit t) //延时程序;
{
unit i,j;
for(i=0;i 29、nop_();
_nop_();
_nop_();
_nop_();
}
}
}
uchar code cdis1[ ] = {"-----Day time---"};
uchar code cdis2[ ] = {"------stop------"};
uchar code cdis3[ ] = {"------left------"};
uchar code cdis4[ ] = {"------right-----"};
uchar code cdis5[ ] = {"------Astern----"};
uchar 30、code cdis6[ ] = {"------night-----"};
uchar code cdis7[ ] = {" happy every day"};
//uchar code cdis11[ ] = {"-----Day time---"};
//uchar code cdis21[ ] = {"------stop------"};
//uchar code cdis31[ ] = {"------left------"};
//uchar code cdis41[ ] = {"------right-----"};
//uchar code cd 31、is51[ ] = {"------Astern----"};
//uchar code cdis61[ ] = {"------night-----"};
uchar code cdis71[ ] = {" My Control "};
/*******************************************************************/
/* */
/*检查LCD忙状态 32、 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
33、LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD 34、 */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{ 35、
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* 36、 */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/************************************************************* 37、/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/ 38、 */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
39、
delay1(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x38);
delay1(5);
lcd_wcmd(0x0c); //显示开,关光标
delay1(5);
lcd_wcmd(0x06); //移动光标
delay1(5);
lcd_wcmd 40、0x01); //清除LCD显示内容
delay1(5);
}
/*******************************************************************/
/* */
/* 设定显示位置 */
/* 41、 */
/*******************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/*******************************************************************/
void initUART(void) //串口必要作 42、如下初始化,才干正常工作。
{
TMOD=0x20; //M1=1,M0=0 定期器1工作方式2(定期常数重装,8 位)
SCON=0x50; //SM0=0,SM1=1,REN=1 串口工作方式1,容许接受
TH1=0xfd; //晶振11.0592时,波特率9600
TL1=0xfd; //TL1计数,溢出后,TH1值送入TL1
EA=1; //开总中断
ES=1; //容许串口中断
TR1=1; //启动定期器1
}
void main(void)
{
uchar m;
P1=0x00 43、
P2=0xff;
P0=0;
delay1(10);
//延时
lcd_init(); //初始化LCD
lcd_pos(0); //设立显示位置为第一行第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis7[m]);
initUART();
// lcd_pos(0x40); //设立显示位置为第二行第1个字符
// for(m=0;m<16; 44、m++)
// lcd_wdat(cdis2[m]);
while(1)
{ lcd_pos(0); //设立显示位置为第一行第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis7[m]);
//白天正常行驶批示灯全灭
if(KEY1==1)
{
delay(10);
if(KEY1==1)
{
P2=0xff;
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(cdis1[m]);
}
}
//汽车右转 ;亮 45、并且闪
if(KEY2==1)
{
delay(10);
if(KEY2==1)
{
P2=0xff;
while(1)
{
LED3=~LED3;
delay(100);
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(cdis4[m]);
if(KEY4==1||KEY3==1||KEY1==1||KEY5==1||KEY6==1)
break;
}
}
}
//汽车左转 ;亮并且闪
if(KEY3==1)
{
delay(10); 46、
if(KEY3==1)
{
P2=0xff;
while(1)
{
LED4=~LED4;
delay(100);
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(cdis3[m]);
if(KEY4==1||KEY2==1||KEY1==1||KEY5==1||KEY6==1)
break;
}
}
}
//汽车暂时刹车所有亮
if(KEY4==1)
{ delay(10);
if(KEY4==1)
{
P2=0x00;
47、 lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]);
}
}
//汽车倒车;中间四个灯亮
if(KEY5==1)
{
delay(10);
if(KEY5==1)
{
P2=0xff;
delay(1);
LED5=0;
LED6=0;
LED7=0;
LED8=0;
LED1=0;
LED2=0;
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(cdis5[m]);
}
}
48、
//汽车夜间行驶车前灯全亮。尾灯两边中间 灯亮
if(KEY6==1)
{
delay(10);
if(KEY6==1)
{
P2=0xff;
delay(1);
LED1=0;
LED2=0;
LED5=0;
LED6=0;
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(cdis6[m]);
}
}
}
}
void UARTinterrupt(void) interrup 49、t 4
{
uchar m;
lcd_pos(0); //设立显示位置为第一行第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis71[m]);
if(RI)
{
RI=0;
while(1)
{
if (SBUF=='1') //单引号内表达ASCII码 //白天正常行驶批示灯全灭
{
P2=0xff;
lcd_pos(0x40);
for(m=0;m<16;m++)
lcd_wdat(cdis1[m] 50、);
if(SBUF=='2'||SBUF=='3'||SBUF=='4'||SBUF=='5'||SBUF=='6' ||KEY4==1||KEY3==1||KEY1==1||KEY5==1||KEY6==1||KEY2==1 )
break;
}
else if(SBUF =='2') //汽车右转 ;亮并且闪
{
if(SBUF=='1'||SBUF=='3'||SBUF=='4'||SBUF=='5'||SBUF=='6'||KEY4==1||KEY3==1||KEY1==1||KEY5==1||KEY6==1||KEY






