交通灯控制器设计报告

大学

课程名称 __单片机原理课程设计_

题目名称 _    交通灯控制器     

学生学院 ___  学院_____

专业班级 ___          

学    号           

学生姓名 __         _____

指导教师 __              __

2014  年 6 月 5 日


课程设计任务书

(指导教师填写)

课程设计名称  单片机原理     学生姓名         专业班级  自动化    

设计题目                        交通灯控制器设计                        

一、课程设计目的

1.   培养学生文献检索的能力,如何利用Internet检索需要的文献资料。

2.   培养学生综合分析问题、发现问题和解决问题的能力。

3.   培养学生综合运用知识的能力和工程设计的能力。

4.   培养学生理论联系实际的能力。

5.   提高学生课程设计报告撰写水平。

二、设计内容、技术条件和要求

1设计内容

    交通灯控制器设计主要功能是用单片机控制LED灯模拟指示。模拟东西南北方向的十字路口交通灯信号控制情况。以89C51单片机为核心芯片,采用中断方式实现控制。

(1)数码管选用2位共阴极显示的数码管,共4个;

(2)东西通行时间为80s,南北通行时间为60s,缓冲时间为3s;

2 设计要求

? 设计单片机最小系统(包括复位按钮、晶振电路等);

? 绘制实现本设计内容的硬件电路(原理图),系统的组成框图。

? 相应的控制状态表;

? 编写本课程设计内容的软件设计(包含程序流程图和对程序注释)。

? 硬件实验部分可选用实验箱测试或Proteus仿真软件实现。

3 总体设计思想(供参考)

? 利用定时器T0产生每10ms一次的中断,每100次中断为1s;

? 对两个方向分别显示红、绿、黄灯的剩余时间即可;

? 用MAX7219芯片实现共阴极显示驱动;

? A方向的红灯时间=方向的绿灯时间+黄灯缓冲时间。

4  设计参考

    交通灯控制器设计有电源电路、单片机主控电路、显示电路、信号灯电路等组成,如图1所示:

5 知识点准备:

? +5V电源原理及设计;

? MAX7219工作原理;

? 单片机复位电路工作原理及设计(元件选择的依据);

? 单片机晶振电路工作原理及设计(元件选择的依据);

? 数码管显示特性、驱动设计及应用;

? LM1602液晶显示屏特性、驱动设计及应用;

? 89C51单片机引脚资源、引脚分配等;

? 单片机汇编语言及程序设计(中断、延时子程序的设计)。

图1  交通灯控制器设计框图

三  时间进度安排

按教学计划规定,单片机原理课程设计总学时为1周,其进度安排和时间大致分配如下:

1.      十五周周一至周二  查阅资料、进行软、硬件初步设计;

2.      十五周周三至周四  上机调试,发现问题,解决问题,完善课程设计;

3.      十五周周五       总结设计过程,编写课程设计报告书。

四  主要参考文献

1、何立民. 单片机高级教程. 第1版.北京:北京航空航天大学出版社,2001

2、徐爱钧  KEIL Cx V7.0单片机高级语言编程与uVision2应用实践,北京,电子工业出版社,2004

3、李全利、仲伟峰、徐军,单片机原理及应用,北京:清华大学出版社,2006

五、设计分组及选题安排

    自动化班所有学生。

指导教师签字:                   

 20##年05月30日


单片机课程设计报告

一、设计项目简介

功能:交通灯控制器,通过单片机控制交通灯和数码管,实现4路口交通灯的正确亮灭,并能显示发亮交通灯发亮状态的剩余时间。东西通行时间为80s,南北通行时间为60s,缓冲时间为3s。

类似产品简介:

基于数字电子技术设计的交通灯控制器:元器件多而复杂,连线复杂易出错,设计困难,且功耗较大,不经济,不利于节约环保。

基于PLC技术设计的交通灯控制器:设计程序简单易懂,但价格较贵,不经济。

项目特色:通过单片机控制,进行模块化处理,体积小,功耗低,元器件少且简单,价格实惠,功能齐全,能够实现正常显示,而不会出现4路口交通灯混乱的情况,时间显示正常。

二、总体设计

总体设计模式图:

用一片AT89C51单片机控制4路口交通灯的亮灭。单片机发送地址、数据信息给MAX7219,通过MAX7219控制数码管的时间显示。

三、硬件设计

硬件原理图:

电路图:

硬件选型及相关依据:

AT89C51:4组8位I/O输入/输出端口,可满足控制所需I/O口数目要求。可外接时钟电路,有复位管脚,接复位电路可实现复位功能。接5V高电平,功耗小,价格低。

MAX7219:串行输入,16位并行输出,可控制8位八段数码管显示。满足设计中的四位控制要求。

4组2位共阴数码管:4路口两位数显示,满足所需,易实现控制。

4个LED-GREEN:10mA额定电流,2.2V额定电压,用于模拟十字路口绿灯亮灭显示。

4个LED-YELLOW:10mA额定电流,2.0V额定电压,用于模拟十字路口黄灯亮灭显示。

4个LED-RED:10mA额定电流,2.0V额定电压,用于模拟十字路口红灯亮灭显示。

4个280Ω电阻、8个300Ω电阻:由VCC=V+IR,(VCC:5V;I:LED灯额定电流;V:LED灯额定电压)计算出电阻大小。

9KΩ电阻1个:MAX7219的18管脚接高电平时串联电阻。

12MHZ晶振1个、30pf电容2个:根据经验,12M晶振与2个30p电容并联构成外部时钟振荡电路。

10KΩ电阻1个、1KΩ电阻1个、10uf电解电容1个、1个按键:构成单片机复位电路。电容放电时间τ=RC=10K10uf=0.1s>21/12M=s(2个时钟周期),即电容放电时间大于2倍的时钟周期,即可实现复位。

AT89C51简介:

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

http://www.hificat.com/dpj_basic/pic/89c51/1.gif

主要特性:

与MCS-51 兼容 ;4K字节可编程闪烁存储器 ;寿命:1000写/擦循环;数据保留时间:10年;全静态工作:0Hz-24Hz;;三级程序存储器锁定;128*8位内部RAM;32可编程I/O线;两个16位定时器/计数器;5个中断源;可编程串行通道;低功耗的闲置和掉电模式;片内振荡器和时钟电路。

MAX7219芯片简介:

MAX7219 是MAXIM 公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219 可驱动8 个7 段(包括小数点共8 段)数字LED、LED 条线图形显示器、或64 个分立的LED 发光二级管。该芯片具有10MHz 传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED 的段电流。它的操作很简单,MCU 只需通过模拟SPI 三线接口就可以将相关的指令写入MAX7219 的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片7219 串联方式,这样MCU 就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。MAX7219 的外部引脚分配如图1 所示及内部结构如图所示。

各引脚的功能为:

DIN:串行数据输入端

DOUT:串行数据输出端,用于级连扩展

LOAD:装载数据输入

CLK:串行时钟输入

DIG0~DIG7:8 位LED 位选线,从共阴极LED 中吸入电流

SEG A~SEG G DP 7 段驱动和小数点驱动

ISET: 通过一个10k 电阻和Vcc 相连,设置段电流

MAX7219 有下列几组寄存器: 译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。编程时只有正确操作这些寄存器,MAX7219 才可工作。

MAX7219读写时序说明:

MAX7129 是SPI 总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。

要想与MAX7129 通信,首先要先了解MAX7129 的控制字。MAX7129 的控制字格式如下图。

如图,工作时,MAX7219 规定一次接收16 位数据,在接收的16 位数据中:D15~D12 可以与操作无关,可以任意写入,D11~D8 决定所选通的内部寄存器地址,D7~D0 为待显示数据或是初始化控制字。在CLK 脉冲作用下,DIN 的数据以串行方式依次移入内部16 位寄存器,然后在一个LOAD 上升沿作用下,锁存到内部的寄存器中。注意在接收时,先接收最高位D16,最后是D0,因此,在程序发送时必须先送高位数据,在循环移位。工作时序图见下图。

由于51 是8 位单片机故需要分两次来送数据。

数据读写时序图

单片机复位电路:

上电自动复位原理:

在电路图中,电容的的大小是10uF,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。

也就是说在启动的0.1S内,电容两端的电压时在0~3.5V增加。这个时候10K电阻两端的电压为从5~1.5V减少(串联电路各处电压之和为总电压)。所以在0.1S内,RST引脚所接收到的电压是5V~1.5V。在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。

按键按下的时候复位原理:

在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。

数码管简介:

数码管也称LED数码管,数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管。

按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。

                 

驱动方式:分静态显示驱动和动态显示驱动两种方式。

静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。

数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。

四、软件设计

首先对程序进行模块化处理,根据要求的4路口交通灯的具体功能,对程序进行模块化处理。

根据不同功能的分配可以将程序划分为以下几个模块:

主模块、MAX7219初始化模块、初始化模块(主函数初始化)、定时器模块、MAX7219地址和数据发送模块、数字变化处理模块。

由子模块的功能,可以设计绘制出各模块的程序流程图。各子模块之间可能会有联系,也可能没有联系,最后由主模块对其进行必要的汇总处理,实现要求的功能。流程图绘制完毕后,可以将流程图作为编程的依据,进行编程操作。如此,可使程序简化处理,减少错误,提高程序的编写效率。给自己带来不少的方便之处。

程序流程图:

本着简洁清晰明了易懂的目的,对程序模块化处理,不同模块执行不同的功能。就如同多元化的大家庭一样,进行不同的分工,个分工之间也可能存在联系。最后,由主模块进行总的调用处理,从而将零散的分工汇聚一起,共同实现最终的目的。

模块说明:

主模块:采用顺序循环程序设计,进行汇总处理,实现最终的目的。即实现交通等控制器功能,东西通行时间为80s,南北通行时间为60s,缓冲时间为3s。

MAX7219初始化模块:顺序调用MAX7219地址、数据发送模块,对MAX7219进行初始化处理。

初始化模块:采用顺序程序对定时器中断初始化,开中断定时器进行计时。并对相应变量和交通灯做初始化出处理。

数码管数字显示处理模块:调用数字变化处理模块,得到正确的跳变时间,根据时间的变化做出相应变化,并作出相应的处理。调用MAX7219地址和数据发送模块使数字信息在数码管上正确地显示出来。

MAX7219地址和数据发送模块:根据MAX7219地址、数据发送时序图,对MAX7219做相应处理,使其能够发送一位地址和数据。

数字变化处理函数:当数字变量变为0时,相应方向的数字变化标志增1,并根据数字变化标志当前值,使数字变量做出相应的变化,并使相应方向上相应的灯发亮。以实现数字变量从0的正确跳转和交通灯的正确发亮。

定时器模块:对定时器重新赋初值,并使时间标志t加1计时。



五、程序清单

#include<reg51.h>

#define  unint unsigned int

#define  unchar unsigned char

//管脚定义

sbit DIN=P3^0;

//MAX7219 串行数据 1 脚

sbit LOAD=P3^1;

//MAX7219 片选 12

sbit CLK=P3^2;

//MAX7219 串行时钟 13 脚

//寄存器宏定义

#define DECODE_MODE  0x09

//译码控制寄存器

#define INTENSITY      0x0A  

/亮度控制寄存器

#define SCAN_LIMIT    0x0B 

//扫描界限寄存器

#define SHUT_DOWN   0x0C

//关断模式寄存器

#define DISPLAY_TEST 0x0F

//测试控制寄存器

//定义全局变量

unchar t,dte,dts;

//t为1ms脉冲产生标志,dte、dts分别为东西方向、南北方向数字变化标志

unchar Easw,Soun;              

//东西、南北方数码管数字变量

//函数声明

void Write7219(unchar address,unchar dat);

//MAX7219控制处理函数声明

void Display();                        

//数码管数字显示处理函数声明

void Initial(void);

//MAX7219初始化函数声明

void Init(void);                     

//定时器初始化函数声明

/*主函数:交通等控制器,东西通行时间为80s,南北通行时间为60s,缓冲时间为3s。*/

void main(void)

{

Initial();   

//MAX7219 初始化

Init();                             

//变量初始化

while(1)

{

Display();                       //调用显示函数

}

}

/*MAX7219初始化函数:MAX7219 初始化,设置MAX7219 内部的控制寄存器*/

void Initial(void)

{

Write7219(SHUT_DOWN,0x01);

//开启正常工作模式(0xX1)

Write7219(DISPLAY_TEST,0x00);

//选择工作模式(0xX0)

Write7219(DECODE_MODE,0xff);

//选用全译码模式

Write7219(SCAN_LIMIT,0x03);

//选用前4只LED

Write7219(INTENSITY,0x04);

//设置初始亮度

}

/*初始化函数:设置定时/计数器0工作方式1,设置50ms定时时间,并进行初始化。开总中断、定时/计数器0,初始化所需全局变量 */

void init()                                                  

{

TMOD = 0X01;

//设置定时器0工作方式1

TH0 = 0X4C;

//定时器0高八位初始化

TL0 = 0X00;

//定时器0低八位初始化

ET0 = 1;

//定时器0中断允许

TR0 = 1;

//开定时器0

EA = 1;

//开总中断

t = 0;

dte = 0;

dts = 0;

Easw = 79;

//东西方向数码管初值79

Soun = 82;

//南北方向数码管初值82

P0 = 0XFE;

//初始化东西方向亮绿灯

P1 = 0XFB;

//初始化南北方向亮红灯

}

/*数码管数字显示处理函数:通过定时器精确定时,动态地显示交通灯时间的变化 */

void Display()

{

unchar i;

unchar Ewsn[4]={0};

//定义一个只含四个元素的一位数组

void Digit_deal();

//数字变化处理函数声明

if(t >= 20)

//t=20时,定时1秒,Easw、Soun做自减

{

t= 0;

Easw--;

Soun--;

}

Digit_deal();

//数字变化处理函数

Ewsn[0] = Easw/10;

//东西显示数字十位

Ewsn[1] = Easw%10;

//东西显示数字个位

Ewsn[2] = Soun/10;

//南北显示数字十位

Ewsn[3] = Soun%10;

//南北显示数字个位

for(i=1;i<5;i++)

{

Write7219(i,Ewsn[i-1]);

//4位共阴数码管显示

}

}

/*地址、数据发送子程序:MAX7219地址和数据的发送,以确保数码管的正常显示*/

void Write7219(unchar address,unchar dat)

{

unchar i;

LOAD=0;

//拉低片选线,选中器件

//发送地址

for (i=0;i<8;i++)

//移位循环8 次

{

CLK=0;

//清零时钟总线

DIN=(bit)(address&0x80);

//每次取高字节

address<<=1;

//左移一位

CLK=1;

//时钟上升沿,发送地址

}

//发送数据

for (i=0;i<8;i++)

{

CLK=0;

DIN=(bit)(dat&0x80);

dat<<=1;

CLK=1;

//时钟上升沿,发送数据

}

LOAD=1;

//发送结束,上升沿锁存数据

}

/*数字变化处理函数:对东西南北方向数字变换时值的处理 */

void Digit_deal()

{

//东西方向数字变换

if(!Easw)

//Easw为0时,dte加1

{

dte ++;

}

if((Easw == 0) && (dte == 1))

//Easw为0且dte为1时,东西方向数字置为3,亮黄灯

{

Easw = 3;

P0 = 0XFD;

}

if((Easw == 0) && (dte == 2))

//Easw为0且dte为2时,东西方向数字置为63,亮红灯

{

Easw = 63;

P0 = 0XFB;

}

if((Easw == 0) && (dte == 3))

//Easw为0且dte为3时,东西方向数字置为79,dte置0,亮绿灯

{

Easw = 79;

dte = 0;

P0 = 0XFE;

}

//南北方向数字变换                                                                                      

if(!Soun)

//Soun为0时,dts加1

{

dts ++;

}

//Soun为0且dts为1时,南北方向数字置为60,亮绿灯

if((Soun == 0) && (dts == 1))

{

Soun = 60;

P1 = 0XFE;

}                                                                                                                

if((Soun == 0) && (dts == 2))

//Soun为0且dts为2时,南北方向数字置为3,亮黄灯

 {

Soun = 3;

P1 = 0XFD;

}

if((Soun == 0) && (dts == 3))

//Soun为0且dts为3时,南北方向数字置为82,dts置0,亮红灯

{

Soun = 82;

dts = 0;

P1 = 0XFB;

}

}                                                                              

/*定时器0中断函数:产生50ms脉冲,实现1s钟时间定时*/

void Time0() interrupt 1

{

TH0 = 0X4C;

TL0 = 0X00;

t++;

}



六、收获及体会

在课程设计中,体验到了单片机在生活中的强大作用。一片小小的单片机竟能有如此之神奇,控制交通灯显示我们想要的结果,给我们的生活带来了极大的便利。

一个学期的理论学习让人深感疲惫,然而一个小小的课程设计,竟能在此调动自己求学上进的内心。理论课上积累的身后的基础,是最后设计成果的巨大财富。虽然设计过程中遇到过些小问题,但总体感觉还是很好的。在进行设计之前,先对MAX7219芯片进行了学习,为设计做好准备。在程序的编写过程中,对MAX7219芯片的地址、数据输入的编写遇到了些小问题,使得最后无法正常输出。认真研究比对MAX7219芯片的读写时序图,对程序加以修改,最终实现自己的目标,达到了要求,幸而解决了设计中的关键一步。

在设计的过程中,遇到问题逐项分析,有时与同学们一起讨论,从中收获颇丰。这次课程设计与上次的设计虽然都有数码管显示,但是我运用控制数码管的芯片确是不同的。上次我运用的是较为熟悉的74HC573,八位数入端口,八位输出端口,有片选段。用了两片的74HC573,共占用单片机10个I/0输入输出端口。虽然程序写起来比较简单易懂。但是用了两片的74HC573,比较起来这次显得有点多,成本也就高了。另外,占用10个I/O输入输出端口,浪费I/O资源。比起运用74HC573控制数码管的显示,运用MAX7219使得成本降低了(用了一片的MAX7219)。同时,占用的I/O资源也少了(只占用了3个I/O输入输出端口),这在以后的项目开发设计中占有巨大的优势。所以在进行项目设计时应当注意芯片的比较选择,给自己带来最大的方便与实惠。

另外,在设计中,模块化显得尤其重要。模块化处理使得项目设计显得清晰明了,也大大简化的设计过程,同时也极大地简化了程序编写过程,降低了程序错误的出现,还给理解程序带来了极大的便利。运用模块化处理,使得电路原理图清晰明了,也是流程图设计清晰易懂。

通过此次的课程设计,不仅又一次验证了对理论知识的掌握,同时也又一次地体验了设计带来的乐趣,感受单片机带给自己对学习的动力。相信在以后的学习中会有更大的收获的。

七、参考文献

《单片机中级教程——原理与应用(第二版)》 张俊谟 主编,北京航空航天大学出版社20##年6月出版

《单片机原理及接口技术(C51编程)》 张毅刚主编,人民邮电出版社出版20##年8月出版

《单片机原理及接口技术第二版》李全利主编,高等教育出版社 20##年1月出版

电子发烧友网:http://www.elecfans.com/yuanqijian/jiekou/200802298085.html

21ic电子网社区:http://www.21icsearch.com/pdf-69956CF62559BF6A/AT89C51.html

中国工控网:http://www.gongkong.com/

中国66电子网:http://www.ec66.com/article/

相关推荐