MCS-51 单片机课程设计报告
MCS-51 单片机课程设计报告
——交通灯控制系统
姓名:朱正威
学号:110901418
指导老师:潘 峰
东华大学信息学院自动化系
2014.6.22
1
MCS-51 单片机课程设计报告
目录
一、 项目概述......................................................................................................... 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
2
MCS-51 单片机课程设计报告
一、 项目概述
项目所要设计的是交通灯控制系统,十字路口交通灯由红、绿两色 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 为核心的控制电路,并编写相关的系统软件。
该模拟交通灯控制系统采用模块化结构,主要分为定时器中断控制、按键扫
描、LED 数码管显示三个部分。在设计完成一个方向上的红绿灯数码管计时后,
再进行两个方向红绿灯的切换显示以及特殊情况下的处理。
采用 AT89C51 作为系统主控芯片,其包含两个定时器中断 T0 和 T1、两个外
部中断,以及 4 个 I/O 端口 P0 到 P3 端口。本系统采用其定时器 T1 进行定时,
每隔一定时间定时中断一次,在中断程序内进行变量自加,以此可以设置任意长
的定时时间。如设置 1s 的定时改变红绿灯 LED 数码管显示值,设置 0.2m 的按键
扫描周期进行按键定时扫描。为了节省 I/O 口资源以及硬件连接上的方便,采用
串口显示芯片 MAX7219 进行 LED 数码管显示部分的设计。
整个方案设计结构清晰明了,硬件连接简洁,软件编程模块清晰,经实践验
二、 系统设计
1. 设计思想
2. 方案可行性分析
证,此方案可行。
3. 总体方案
在 Proteus 环境中进行硬件电路的设计和搭建,具体硬件电路设计如图 1、2
所示。在 Keil 环境下进行软件设计 51 单片机编程,为定时器中断和 MAX7219 串
口显示和主函数部分分别建立相应的源文件和头文件,进行模块化编程。
3
MCS-51 单片机课程设计报告
图 1、硬件连接图
图 2、整体系统图
4
MCS-51 单片机课程设计报告
三、 硬件设计
系统硬件设计主要分为三个部分,即单片机最小系统部分、LED 数码管串行
显示部分和独立按键部分。
1. 单片机最小系统部分
2. LED 数码管串行显示部分
按要求选用 AT89C51 型号单片机,晶振频率 12MHz,使用内部 RAM 和
ROM。由于 Proteus 环境下默认无需晶振电路和复位电路等,所以并未画出。
MAX7219 是一种集成化的串行输入/输出共阴极显示驱动器,与单片机只
需三根信号进行通信,可以连接 8 位数字的 7 段 LED 数码管。其内部集成了
数据保持、BCD 译码器、多路扫描器、段驱动器和位驱动器。每片 MAX7219
最多可同时驱动 8 个 LED 数码管,而交通灯控制系统正好需要 8 个 LED 数码
管。同时,利用其内部 BCD 译码功能,可以省去额外的软件或硬件译码操作。
具体连接如图 3 所示。
图 3、MAX7219 连接图
3. 独立按键部分
该系统需要根据外部按键 K1、K2 和 K3 进行人工干预,按键较少,可以
采用三个独立按键接在三个单片机 I/O 引脚上,在定时中断内进行按键的扫
描。按键连接部分如图 4 所示。
5
MCS-51 单片机课程设计报告
图 4、按键连接图
四、 软件设计
1. 软件设计思想
在 Keil 环境下进行软件设计 51 单片机编程,软件部分主要分为定时器中断、
MAX7219 串口显示和主函数部分,进行模块化编程,为各个部分分别建立相应
的.h 头文件和.c 源文件。
定时器中断部分:选用定时器 T1,方式 2,8 位自动重装初值。250us 产生
一次定时器中断,由于单片机晶振为 12MHz,经计算,计数初值为 6。在中断服
务程序内进行变量 counter 的自加,当 counter 自加 40 次之后即为一次 10ms 中
断,以此为基本时间单位可以进行进一步的定时。
MAX7219 串口显示部分:首先定义串口数据发送函数 MAX7219_write,然后
按照命令控制字,初始化 MAX7219 工作模式。主要需要初始化的几个寄存器为:
寄存器地址
0x0A
0x0B
0x0C
0x09
功能
亮度控制,0x00~0x0F,0x0F 最亮
设置扫描 LED 个数
工作模式 0x00ShutDown 0x01:Normal
编码模式 对应 bit 为 1 则支持编码
2. 程序流程图
整个程序的流程图如图 5 所示。
6
MCS-51 单片机课程设计报告
图 5、程序流程图
3. 程序清单
1) MAX7219 串口显示程序
//串行数据输入 DIN
#include
#include "MAX7219.h"
#define uchar unsigned char
sbit MAX7219_DIN = P1^0;
sbit MAX7219_CLK = P1^1;
sbit MAX7219_LOAD = P1^2; //数据锁存脉冲信号 LOAD
/************MAX7219 写寄存器函数**************/
// addr: 寄存器地址
// dat: 写入寄存器的值
//说明: D12~D15 为无关位,D8~D11 为寄存器地址,D0~D7 为命令或待显数据
void MAX7219_write(uchar addr, uchar dat)
{
//时钟信号 CLK
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;
//时钟上升沿写入
}
7
MCS-51 单片机课程设计报告
for(i=0;i<8;i++)
{
//再写数据
MAX7219_CLK = 0;
MAX7219_DIN = (dat&(0x80>>i))? 1:0;
i++;
i--;
MAX7219_CLK = 1;
}
MAX7219_LOAD=1;
}
/*********************************************/
/*************MAX7219 初始化函数***************/
void MAX7219_init()
{
MAX7219_write(0x0A,0x07); //亮度地址 0AH,0x00~0x0F,0x0F 最亮
MAX7219_write(0x0B,0x07); //设置扫描 LED 个数地址 0BH,扫描 8 个
MAX7219_write(0x0C,0x01); // 工 作 模 式 地 址 0x0C.
0x00:ShutDown;0x01:Normal
MAX7219_write(0x09,0xFF); //编码模式地址 0x09. 0x00~0xFF:哪一位为 1,
哪一位就支持译码
}
/*********************************************/
2) 按键扫描函数
/******************按键扫描函数******************/
uchar key_scan()
{
uchar key,valid_key,delay=125;
key=P1&0x70;
while(delay--);
valid_key=P1&0x70;
if(key!=valid_key)
//按键消抖
return 0;
switch(key)
{
case 0x60:
//按下 K1 按键
return 1;
case 0x50:
//按下 K2 按键
return 2;
case 0x30:
//按下 K3 按键
return 3;
default:
//其它情况不考虑
8