51交通灯控制系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MCS-51单片机课程设计报告
——交通灯控制系统
姓名:朱正威
学号:110901418
指导老师:潘峰
东华大学信息学院自动化系
2014.6.22
目录
一、项目概述 (3)
二、系统设计 (3)
1.设计思想 (3)
2.方案可行性分析 (3)
3.总体方案 (3)
三、硬件设计 (5)
1.单片机最小系统部分 (5)
2.LED数码管串行显示部分 (5)
3.独立按键部分 (5)
四、软件设计 (6)
1.软件设计思想 (6)
2.程序流程图 (6)
3.程序清单 (7)
五、系统仿真及调试 (13)
六、结果与展望 (15)
七、参考文献 (15)
一、项目概述
项目所要设计的是交通灯控制系统,十字路口交通灯由红、绿两色LED显示器(两位8段LED显示器)组成,LED显示器显示切换倒计时,以秒为单位,每秒更新一次;为确保安全,绿LED计数到0转红,经5秒延时(显示红色0)后,另一道开始绿色倒计时。
1)主干道(A道)先通行且通行时间为45s;(加5秒红灯延时,共50秒)
2)支道(B道)通行时间为25 s;(加秒红灯延时,共30秒)
3)主道与支道的车辆交错通行;
4)若遇紧急情况,按开关时,主道与支道都为红灯20 s
5)根据实时交通堵塞情况人为控制时,按K2时,主道延时30 s通行,按K3
时,支道延时30 s通行。
设计以AT89C51为核心的控制电路,并编写相关的系统软件。
二、系统设计
1.设计思想
该模拟交通灯控制系统采用模块化结构,主要分为定时器中断控制、按键扫描、LED数码管显示三个部分。在设计完成一个方向上的红绿灯数码管计时后,再进行两个方向红绿灯的切换显示以及特殊情况下的处理。
2.方案可行性分析
采用AT89C51作为系统主控芯片,其包含两个定时器中断T0和T1、两个外部中断,以及4个I/O端口P0到P3端口。本系统采用其定时器T1进行定时,每隔一定时间定时中断一次,在中断程序内进行变量自加,以此可以设置任意长的定时时间。如设置1s的定时改变红绿灯LED数码管显示值,设置0.2m的按键扫描周期进行按键定时扫描。为了节省I/O口资源以及硬件连接上的方便,采用串口显示芯片MAX7219进行LED数码管显示部分的设计。
整个方案设计结构清晰明了,硬件连接简洁,软件编程模块清晰,经实践验证,此方案可行。
3.总体方案
在Proteus环境中进行硬件电路的设计和搭建,具体硬件电路设计如图1、2所示。在Keil环境下进行软件设计51单片机编程,为定时器中断和MAX7219串口显示和主函数部分分别建立相应的源文件和头文件,进行模块化编程。
图1、硬件连接图
图2、整体系统图
三、硬件设计
系统硬件设计主要分为三个部分,即单片机最小系统部分、LED数码管串行显示部分和独立按键部分。
1.单片机最小系统部分
按要求选用AT89C51型号单片机,晶振频率12MHz,使用内部RAM和ROM。由于Proteus环境下默认无需晶振电路和复位电路等,所以并未画出。
2.LED数码管串行显示部分
MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,与单片机只需三根信号进行通信,可以连接8位数字的7段LED数码管。其内部集成了数据保持、BCD译码器、多路扫描器、段驱动器和位驱动器。每片MAX7219最多可同时驱动8个LED数码管,而交通灯控制系统正好需要8个LED数码管。同时,利用其内部BCD译码功能,可以省去额外的软件或硬件译码操作。
具体连接如图3所示。
图3
、MAX7219连接图
3.独立按键部分
该系统需要根据外部按键K1、K2和K3进行人工干预,按键较少,可以采用三个独立按键接在三个单片机I/O引脚上,在定时中断内进行按键的扫描。按键连接部分如图4所示。
图4、按键连接图
四、软件设计
1.软件设计思想
在Keil环境下进行软件设计51单片机编程,软件部分主要分为定时器中断、MAX7219串口显示和主函数部分,进行模块化编程,为各个部分分别建立相应的.h头文件和.c源文件。
定时器中断部分:选用定时器T1,方式2,8位自动重装初值。250us产生一次定时器中断,由于单片机晶振为12MHz,经计算,计数初值为6。在中断服务程序内进行变量counter的自加,当counter自加40次之后即为一次10ms中断,以此为基本时间单位可以进行进一步的定时。
MAX7219串口显示部分:首先定义串口数据发送函数MAX7219_write,然后
2.程序流程图
整个程序的流程图如图5所示。
图5、程序流程图
3.程序清单
1)MAX7219串口显示程序
#include
#include "MAX7219.h"
#define uchar unsigned char
sbit MAX7219_DIN = P1^0; //串行数据输入DIN
sbit MAX7219_CLK = P1^1; //时钟信号CLK
sbit MAX7219_LOAD = P1^2; //数据锁存脉冲信号LOAD
/************MAX7219写寄存器函数**************/
// addr:寄存器地址
// dat: 写入寄存器的值
//说明: D12~D15为无关位,D8~D11为寄存器地址,D0~D7为命令或待显数据void MAX7219_write(uchar addr, uchar dat)
{
uchar i=0;
MAX7219_LOAD=0;
for(i=0;i<8;i++) //先写地址
{
MAX7219_CLK = 0;
MAX7219_DIN = (addr&(0x80>>i))? 1:0;
i++;
i--;
MAX7219_CLK = 1; //时钟上升沿写入
}