资源描述
- .
毕 业 论 文
单片机控制交通灯控制系统设计
学 校 经贸职业技术学院
班级 09电子高技1
学生 毛丹丹
学号 9101832028
指导教师 陆斌
目录
引言…………………………………………………………… -5 -
第1章 概述- 5 -
1.1单片机认识- 5 -
1.2 单片机的应用- 5 -
1.3设计任务- 6 -
第2章系统总体方案及硬件设计- 6 -
2.1交通管理的方案-6 -
2.2总体硬件设计- 6 -
2.3系统时钟电路- 7 -
2.4系统复位电路- 7 -
2.5数码管显示电路- 7 -
2.6路灯指示电路- 8 -
2.7按键电路设计- 9 -
第3章软件系统设计- 10 -
3.1设计思路及关键技术- 10 -
3.2 软件流程- 10 -
3.3 交通灯的设计程序说明- 11 -
3.4 延时函数- 11 -
3.5 延时函数- 12 -
3.6 显示函数- 12 -
3.7定时器0中断函数- 13 -
第4章Proteus软件仿真- 14 -
4.1 Proteus软件仿真- 14 -
4.2 南北路灯切换时仿真- 14 -
4.3 紧急情况下的仿真- 15 -
4.4东西紧急情况下的仿真- 15 -
第5章心得体会- 16 -
参考文献- 16 -
附1 源程序代码- 17 -
单片机控制交通灯控制系统设计
摘要
本设计是根据我们所学习的单片机课程,按照大纲要求对我们进展的一次课程检验,是进展单片机课程训练的必要任务,也对我们掌握单片机应用有很大的帮助。掌握单片机技术是一门不可或缺的技术,对我们将来的工作以及生活和学习都有很密切的联系。当今世界的开展是以科学技术为根底的,微控技术在生产中所占的比重也越来越大。单片机的出现是近代计算机技术开展史上的一个重要里程碑。近年来,随着电子技术和微机计算机的迅速开展,单片机的档次不断提高,其应用领域也在不断的扩大,已在工业控制、尖端科学、智能仪器仪表、日用家电、汽车电子系统、办公自动化设备、个人信息终端及通信产品中得到了广泛的应用,成为现代电子系统中最重要的智能化的核心部件。
. word.zl.
- .
引言
我的这次单片机课程设计就是利用单片机的根本特点,使用C语言实现一个简易的交通灯电路,但由于能力的有限,编出的程序只能实现课程设计的最根本的要求,没有对其进展更多的扩展,以后有能力的时候再去完善它。现就我这次课程设计的主要容及主要方法概括一下。本设计设计的是一个交通灯控制系统,以单片机为核心,采用目前比拟流行的AT89S51单片机,对十字路口交通灯电路进展了仿真制作,主要完成十字路口交通灯的红、绿、黄灯的点亮时间控制,并模拟了两道均有车辆要求通过时、一道有车辆要求通过时、以及在紧急情况下三种状态下交通灯的时间控制方式。在模拟系统中,采用了两组红、黄、绿三种发光二极管分别代表两道上的红绿灯,采用了数码管显示每种灯点亮的时间;并采用了三个按钮开关来模拟系统要求的三种状态。在本次设计中,程序并没有采用原来学习书本上的汇编语言,而是采用了C51编写, 程序仿真采用流行的PROTEUS软件,和keil联合仿真,方便调试程序和修改硬件,结果证明方案的硬件设计正确,程序也符合要求。
第1章 概述
1.1单片机认识
MCS-51单片机是Intel公司在1980年继MCS-48系列8位单片机之后推出的高档8位单片机。MCS-51单片机在性能和片功能方面大大优于MCS-48系列单片机。
MCS-51的典型产品有:8051、8031、8751、80C51、80C31、87C51等,8051部有4kB ROM,8751部有4kB EPROM,8031片无ROM。除此之外,三者的部构造及引脚完全一样。
89S51是一种低功耗、高性能CMOS8位微控制器,具有4K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,AT89S51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
1.2 单片机的应用
单片机是应工业测控需要而产生的,最能反映其功能及形态的名称是在一个应用系统中,Single-chip Micro-controller。按照测控系统的特点和要求,单片机的应用可分为单机应用和多机应用两大类。我们这次要完成的单片机课程设计就是它的单机应用,下面在介绍一下单片机在单机应用领域的主要容。
〔1〕智能产品
单片机与传统机械产品相结合,使传统机械产品构造简化,控制智能化,购成新一代机电一体化产品。目前,利用单片机构成的智能产品已广泛应用于家用电器、办公设备、数控机床、纺织机械、工业设备等行业。
〔2〕智能仪表
目前,各种传感器、变送器、控制仪表已普遍采用单片机应用系统。它集测量、处理、控制功能于一体,具有各种智能化功能,如存储、数据处理、查找、判断、联网和语音等功能。
单片机构成的智能仪表,能使仪表具有数字化、智能化、多功能化、综合化、柔性化等优点,赋予测量仪表以崭新的面貌,使传统的仪器、仪表发生根本性的变革,它代表了仪器仪表的开展趋势。
〔3〕测控技术
用单片机构成的各种工业控制系统中的数据采集系统具有工作稳定可靠、抗干扰能力强的优点,如炉温恒温控制系统、电镀生产自动控制系统等。
〔4〕智能接口
在计算机系统,特别是较大型的工业测控系统中,除通用外部设备外,还由许多外部通信、采集、多路分配管理、驱动控制等接口。这些外部设备与接口如果完全由主机进展管理,势必会造成主机负担过重,运行速度降低,接口的管理水平也不可能提高。如果用单片机进展接口的控制与管理,单片机与主机可并行加工处理,可以大量降低接口的通信密度,极大的提高了接口控制管理水平。在一些通用计算机外部设备上,已实现了单片机的键盘管理、打印机控制、绘图仪控制、硬盘驱动控制等。
1.3设计任务
1〕 A道和B道上均有车辆要求通过时,A ,B 道轮流放行。A 道放行5分钟〔调试时改为5秒钟〕,B 道放行4分钟〔调试时改为4秒钟〕。
2〕 一道有车而另一道无车〔实验时用开关K0 和K1 控制〕,交通灯控制系统能立即让有车道放行。
3〕 有紧急车辆要求通过时,系统要能制止普通车辆通行,A ,B 道均为红灯,紧急车由 K2 开关模拟。
4〕绿灯转为红灯时,黄灯亮1秒
第2章 系统总体方案及硬件设计
2.1交通管理的方案
A、B两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,指挥车辆和行人平安通行。红灯亮制止通行,绿灯亮允许通行。黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯燃亮时间为A、B两干道的公共停车时间。设A道比B道的车流量大,指示灯燃亮的方案如表2-1-1。
1
4
1
5
1
4
……
A道
黄灯亮
红灯亮
黄灯亮
绿灯亮
黄灯亮
红灯亮
……
B道
黄灯亮
绿灯亮
黄灯亮
红灯亮
黄灯亮
绿灯亮
……
表2-1-1
说明:
〔1〕当为黄灯时 A、B两道同时为黄灯;以提示行人或车辆下一个灯色即将到来 时间 1秒。
〔2〕当A到为红灯,A 道车辆制止通行,A 道行人可通过;B 道为绿灯,B 道车辆通过,行人制止通行。时间为4秒。
〔3〕当A道绿灯,A 道车辆通行;B 道为红灯,B 道车辆制止通过,行人通行。时间为5秒。 A道车流大 通行时间长
〔4〕这样如上表的时间和红、绿、黄出现的顺序依次出现这样行人和车辆就能平安畅通的通行。
〔5〕此表可根据车流量动态设定
在没有特殊情况下,即在两道均有车辆要求通过时,交通灯按常规运行。通过控制开关可以输入要模拟的其它状态,交通灯将按照其输入状态的情况进展运行。
2.2总体硬件设计
交通灯控制系统的构造框图如图2-2-1所示。总体设计方案共有五个局部组成,分别是:单片机AT89C51、红、绿、黄灯显示电路、LED数显时间电路、晶振及复位控制电路、控制与调时开关电路。在进展仿真调试过程中,程序运行正确,五个局部就同时工作,从而实现了交通灯的根本功能及调时功能。系统的总的原理框图如图2-1所示。
图2-2-1 硬件设计方案
2.3系统时钟电路
晶振采用了部时钟信号源的方式。对于时间要求不是很高的系统,只要按图进展设计就能使系统可靠起振并稳定运行。但由于图中的C1、C2电容起着系统时钟频率微调和稳定的作用,因此,在本系统的实际应用中一定要注意正确选择参数〔30±10 PF〕,并保证对称性〔尽可能匹配〕。
图2-3-1 系统时钟电路
2.4系统复位电路
复位电路我采用上电+按钮复位的方式。当开关翻开时,RST通过电阻接地,当有开关闭合时由于电容的作用使电源VCC通过电阻施加在单片机复位端RST上,实现单片机复位。只是可惜,在进展仿真器调试过程中,该复位电路是不起作用的。具体电路如图2-4-1所示。
图2-4-1 系统复位电路
2.5数码管显示电路
数码管工作原理这里我们介绍8段数码管的工作原理。8段数码管又称为8字型数码管,分为8段:A、B、C、D、E、F、G、DP。其中,DP为小数点。数码管常用的有10根管脚,每一段有一根管脚,另外两根管脚为一个数码管的公共段,两根之间相互连通。
发光二极管的发光原理,我们已经介绍过了,同理,8段LED数码管,那么是在一定形状的绝缘材料上,利用不同形状点划的发光二极管组合,排列成“8〞字型的数码管,分别引出它们的电极,点亮相应的点划来显示0-9的数字。
从电路上,按数码管的接法不同又分为共阴和共阳两种。图2-5-1是共阴和共阳极数码管的部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。
在设计时,为了系统图的美观,我采用了6个数码管组成的数码管组,采用共阴极接法。如图2-5-2。
图2-5-2 系统数码管电路
2.6路灯指示电路
在设计路灯时,采用了发光二极管代替路灯。先介绍一下二极管,见图2-6-1。二极管工作原理是单向导通,即只有正极电压高于负极电压某特定值时才会导通,而负极电压高于正极电压是不导通的。
图2-6-1 发光二极管示意图
发光二极管是一种特殊的二极管,导通时会发光〔发光二极管导通压降一般为1.7V~1.9V〕。此外,工作电流要满足该二极管的工作电流。
发光二极管的正负极可以用万用表进展判断,把万用表拨至二极管档或电阻挡,用两个表笔分别接触二极管的两个引出脚。假设发光二极管被点亮,那么与红表笔相接的引出脚为正极。从外观上看,发光二极管的正极引脚的长度也比拟长。
一般发光二极管与I/O端口之间都会再连接一个电阻,其作用在于限制通过二极管的电流,从而到达减少功耗或者满足端口对最大电流的限制。一般发光二极管的点亮电流为5mA至10mA。
路灯设计时我采用了红、黄、绿三种发光二级管。如图2-6-2所示。
图2-6-2 路灯设计电路
2.7按键电路设计
按键工作方式可以是中断方式也可以是扫描方式,对扫描方式来说,扫描是一直调用按键扫描程序,也可以用定时调用按键扫描程序,不管哪一种,都需要占用系统珍贵的时间资源,相比拟而言中断就有优势,中断键盘只有在有按键按下时才去执行键盘程序,在没有按键按下的情况下,可以处理其他的事务,使资源得到充分的利用,故中断键盘有占用资源少,响应速度快的优点,但在有按键按下时有数码管闪烁的缺点,这是因为处理中断时,数码管停顿了扫描,对显示要求不高的场合下,这也是完全可以满足要求的。但实际应用中,为了保证平安查询键值和响应,通常还要进展按键去抖和等待键释放〔查询按键是否抬起〕的动作,由于按键本身是机械开关,所以在触点闭合或断开的瞬间会出现电压抖动的现象。按键设计如图2-7-1所示。
图2-7-1 按键电路
第3章 软件系统设计
3.1设计思路及关键技术
一个完整的交通灯相当于一个简单的单片机系统,该系统有交通灯设置电路、单片机、显示电路等构成。单片机是集成的IC芯片,只需根据实际设计要求选型。其他局部都需要根据应用要求和性能指标自行设计。首先了解实际交通灯的变化规律。假设一个十字路口为东西南北走向。初始状态0为东西红灯,南北红灯。然后转状态1南北绿灯通车,东西红灯。过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,东西仍然红灯。再转状态3,东西绿灯通车,南北红灯。过一段时间转状态4,东西绿灯闪几次转亮黄灯,延时几秒,南北仍然红灯。最后循环至状态1。
3.2 软件流程
系统总体流程图如图3-2-1所示:
图3-2-1整体软件设计流程图
3.3 交通灯的设计程序说明
这局部中定义了一些全局变量的数组和变量以及位标志,只是些定义的东西不需要画流程图了。这局部程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit nom=P3^7;
uchar code led_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//显示数码表
uchar code light_state[]={0x21,0x12,0x0c,0x12};//交通灯状态存储表
uchar code em_state[3]={0x24,0x21,0x0c};//紧急灯状态显示表
uchar light_time[][2]={{0,4},{0,1},{0,5},{0,1}};//显示时间存储表
uchar statebef,time1s=100,state=0;//存储紧急灯状态,定时基数,状态基数
uint time;//显示时间变量
bit md_flag,state_flag=1,red;//显示时间更改状态,状态切换标志位,红绿切换标志位
定义局部变量i,j
i--
j--
j<100
i==100
j==100
i<100
y
y
N
N
3.4 延时函数
延时函数的流程图如图3-4-1。
延时程序如下:
/*--------------------------------
延时函数
------------------------*/
void delay(void)
{
uchar i,j;
for(i=100;i>0;i--)
{ for(j=100;j>0;j--); //循环10000次
}
}
图3-4-1 延时函数的流程图
3.5 延时函数
读状态函数的流程图如图3-5-1。
定义局部变量
value
读P3口状态
value右移4位
取value低三位
状态改变?
return 0
return 1
Y
N
statebef=value
读状态函数如下:
/*--------------------------
读状态函数:判断是否有紧急灯状况出现
---------------------*/
uchar rd_emstate(void)
{
uchar value;
value=P3;
value>>=4;
value&=0x07;
if(value!=statebef){statebef=value;return 1;}
//判断是否有紧急灯状况发生,
//保存按键值,置返回标志为1
else return 0;
}
3.6 显示函数
显示函数如下:
void display(void)
{
if(md_flag==1)//显示更改时间状态
{
if(1==red) {// 南北方向红灯时间显示
P2=0xf6; P0=led_table[light_time[0][0]];delay();//分钟
P2=0xed; P0=led_table[light_time[0][1]/10];delay();//秒的十位
P2=0xdb; P0=led_table[light_time[0][1]%10];delay();//秒的个位
}
……
else //正常状态,显示时间
{
P2=0xf6; P0=led_table[time/100]; delay();//分钟
P2=0xed; P0=led_table[time/10%10];delay();// 秒的十位
P2=0xdb; P0=led_table[time%10]; delay();//秒的个位
} }
3.7定时器0中断函数
定时器0中断函数如下:
void Time0int(void) interrupt 1
{ EA=0;
TH0=-10000/256;
TL0=-10000%256;
time1s--;
if(time1s==0){//一秒中到,重新置数
time1s=100;
time--;//显示时间自减
if(time==0){//显示时间减到0时切换显示时间状态
state++;//四个状态轮流切换
if(state==4) state=0;
state_flag=1;//置状态切换标志位
} } EA=1; }
. word.zl.
- .
第4章Proteus软件仿真
4.1 Proteus软件仿真
Proteus软件用于系统的仿真,编译软件采用keil UV3。程序的仿真用英国的labcenter公司的Protens V7.13。其果如下:加电后的结果如图4-3-1。此时时间已经走过一秒,南北是红灯,东西是绿灯。
图4-3-1 加电后仿真
4.2 南北路灯切换时仿真
切换时,转为黄灯亮,时间为一秒钟。如图4-2-1。
图4-2-1 黄灯亮时
4.3 紧急情况下的仿真
此时,全部为红灯,所用车辆禁行,时间被锁定,此时允许特殊车辆经过。如图4-3-1。
图4-3-1 紧急情况下的路灯显示
4.4东西紧急情况下的仿真
此时,南北为红灯,东西为绿灯,南北车辆禁行,东西可以通过。时间被锁定,此时允许东西车辆经过。如图4-4-1。
图4-4-1 东西紧急情况下的路灯显示
第5章 心得体会
通过此次课程设计让我能够亲身参与电子产品的设计使我更加深深地体会到:现代的社会是信息的社会,很多与人们生活严密相关的产品都是电子产品。要熟练地掌握单片机的根本知识,这样才能对试验中出现的问题进展分析解决。通过这次对交通灯系统的设计,我们掌握了设计一个实用装置电路的根本方法和根本步骤,掌握了实用装置工作的根本原理,实际解决了设计中出现的问题,增强了寻找问题,解决问题的能力。此次电子设计的成功不仅帮助我们更好地掌握书本知识,尤其重要的是增强了我们的自信,培养了我们独立思考的能力!
通过这周紧而充实的课程设计,我学到了很多东西,让我重新认识自己,收益匪浅,并对我以后所要做的毕业设计有了一个初步的了解。做好一个课程设计或毕业设计不仅要具备扎实的书本知识并会善于应用,还要学会查阅资料,对以前学过的知识不清楚的地方还要进展复习,实在搞不明白的地方要向教师或同学请教,这样才可能做出一个比拟不错的课程设计。在这里我要感我们的指导教师,非常感教师的指导和帮助。希望以后还能参加这样的课程设计。我想我会做的更好的。
参考文献
[1]余发山.单片机原理及应用技术.中国矿业大学.2002
[2]朝青.单片机原理及接口技术〔修订版〕.:航空航天大学,1998
[3]广弟.单片机根底.:航空航天大学,1992
. word.zl.
- .
附1 源程序代码
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit nom=P3^7;
uchar code led_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示数码表
uchar code light_state[]={0x21,0x12,0x0c,0x12};//交通灯状态存储表
uchar code em_state[3]={0x24,0x21,0x0c};//紧急灯状态显示表
uchar light_time[][2]={{0,4},{0,1},{0,5},{0,1}};//显示时间存储表
uchar statebef,time1s=100,state=0;//存储紧急灯状态,定时基数,状态基数
uint time;//显示时间变量
bit md_flag,state_flag=1,red;//显示时间更改状态,状态切换标志位,红绿切换标志位
/*--------------------------------
延时函数
------------------------*/
void delay(void)
{
uchar i,j;
for(i=100;i>0;i--)
{
for(j=100;j>0;j--);
}
}
/*--------------------------
读状态函数:判断是否有紧急灯状况出现
---------------------*/
uchar rd_emstate(void)
{
uchar value;
value=P3;
value>>=4;
value&=0x07;
if(value!=statebef){statebef=value;return 1;}//判断是否有紧急灯状况发生,保存按键值,置返回标志为1
else return 0;
}
/*------------------------
显示函数
----------------------*/
void display(void)
{
if(md_flag==1)//显示更改时间状态
{
if(1==red) {// 南北方向红灯时间显示
P2=0xf6; P0=led_table[light_time[0][0]];delay();//分钟
P2=0xed; P0=led_table[light_time[0][1]/10];delay();//秒的十位
P2=0xdb; P0=led_table[light_time[0][1]%10];delay();//秒的个位
}
else {//南北绿灯东西红灯亮时间显示
P2=0xf6;P0=led_table[light_time[2][0]]; delay();//分钟
P2=0xed;P0=led_table[light_time[2][1]/10]; delay();//秒的十位
P2=0xdb;P0=led_table[light_time[2][1]%10]; delay();//秒的个位
}
}
else //正常状态,显示时间
{
P2=0xf6; P0=led_table[time/100]; delay();//分钟
P2=0xed; P0=led_table[time/10%10];delay();// 秒的十位
P2=0xdb; P0=led_table[time%10]; delay();//秒的个位
}
}
/*---------------------------
主函数
--------------------*/
void main()
{
//初始化定时器0,外部中断1
EA=1;
EX1=1;
IT1=1;
ET0=1;
TMOD=0x01;
TH0=-10000/256;
TL0=-10000%256;
TR0=1;
while(1){
if(rd_emstate())//如果有紧急灯按下,进展如下紧急处理
{
switch(statebef)
{
case 0x04:P1=em_state[0];TR0=0;break;//紧急灯亮
case 0x02:P1=em_state[1];TR0=0;break;//东西应急灯亮
case 0x01:P1=em_state[2];TR0=0;break;//南北应急灯亮
case 0x00:TR0=1;break;
default: break;
}
}
if(state_flag)//正常状态下时间切换,如果状态标志为1,进展如下处理,进展状态间切换
{
switch(state)
{
case 0:time=light_time[0][0]*60+light_time[0][1];
P1=light_state[0];break;//南北红灯亮时间
case 1:time=light_time[1][0]*60+light_time[1][1];
P1=light_state[1];break;//黄灯亮时间
case 2:time=light_time[2][0]*60+light_time[2][1];
P1=light_state[2];break;//南北绿灯亮时间
case 3:time=light_time[1][0]*60+light_time[1][1];
P1=light_state[1];break;//黄灯亮时间
default: break;
}
state_flag=0;//清标志位
}
if(nom==0) { md_flag=0;}//恢复时间状态,更改为最近更改的值
display();
}
}
/*-----------------
定时器0
--------------------*/
void Time0int(void) interrupt 1
{
EA=0;
TH0=-10000/256;
TL0=-10000%256;
time1s--;
if(time1s==0){//一秒中到,重新置数
time1s=100;
time--;//显示时间自减
if(time==0){//显示时间减到0时切换显示时间状态
state++;//四个状态轮流切换
if(state==4) state=0;
state_flag=1;//置状态切换标志位
}
}
EA=1;
}
/*---------------------
外部中断1
----------------------*/
void Exint1(void) interrupt 2
{
EA=0;
md_flag=1;//置更改时间标志位
if(red)
{
switch(P3&0X07)
{
case 6: light_time[0][1]++;
if(light_time[0][1]==60) light_time[0][1]=0;break;//南北方向绿灯时间 秒加 小于60s
case 5: light_time[0][0]++;
if(light_time[0][0]==10) light_time[0][0]=0;break;//分加 小于10m
case 3: red=0;break;//红绿灯切换
}
}
else
switch(P3&0X07)
{
case 6: light_time[2][1]++;
if(light_time[2][1]==60) light_time[2][1]=0;break;
//南北方向红灯时间 秒加 小于60
case 5: light_time[2][0]++;
if(light_time[2][0]==10) light_time[2][0]=0;break;//分加 小于10
case 3: red=1;break;//红绿灯切换
}
EA=1;
}
. word.zl.
-
展开阅读全文