交通灯控制系统设计.docx
《交通灯控制系统设计.docx》由会员分享,可在线阅读,更多相关《交通灯控制系统设计.docx(17页珍藏版)》请在冰豆网上搜索。
交通灯控制系统设计
第1章绪论
1.1设计背景
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的就是交通信号灯的自动指挥系统。
1.2设计要求
本系统采用8051系列单片机AT89C52为中心器件来设计交通灯控制器,实现了通过8051芯片的P1口设置红、绿灯燃亮时间显示的功能;P0口连接交通灯循环点亮,本系统操作简单、扩展功能强。
1.3设计思路
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.1设计总电路图
2.2硬件设计
交通灯控制系统的结构框图如图2-2-1所示。
总体设计方案共有五个部分组成,分别是:
单片机AT89C51、红、绿、黄灯显示电路、LED数显时间电路、晶振及复位控制电路、控制与调时开关电路。
在进行仿真调试过程中,程序运行正确,五个部分就同时工作,从而实现了交通灯的基本功能及调时功能。
图2-2-1硬件设计方案
2.3系统时钟电路
晶振采用了内部时钟信号源的方式。
对于时间要求不是很高的系统,只要按图进行设计就能使系统可靠起振并稳定运行。
但由于图中的C1、C2电容起着系统时钟频率微调和稳定的作用,因此,在本系统的实际应用中一定要注意正确选择参数(30±10PF),并保证对称性(尽可能匹配)。
图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是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。
图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延时函数
延时函数的流程图如图3-4-1。
延时程序如下:
/*--------------------------------
延时函数
------------------------*/
voiddelay(void)
{
uchari,j;
for(i=100;i>0;i--)
{for(j=100;j>0;j--);//循环10000次
}
}
3.4读状态函数
读状态函数的流程图如图3-5-1。
读状态函数如下:
/*--------------------------
读状态函数:
判断是否有紧急灯状况出现图3-4-1延时函数的流程图
---------------------*/
ucharrd_emstate(void)
{
ucharvalue;
value=P3;
value>>=4;
value&=0x07;
if(value!
=statebef){statebef=value;return1;}
//判断是否有紧急灯状况发生,
//保存按键值,置返回标志为1
elsereturn0;
}
图3-4-2读状态函数的流程图
3.5显示函数
显示函数如下:
voiddisplay(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.6定时器0中断函数
定时器0中断函数如下:
voidTime0int(void)interrupt1
{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;
第4章Proteus软件仿真
4.1Proteus软件仿真
Proteus软件用于系统的仿真,编译软件采用keilUV3。
程序的仿真用英国的labcenter公司的ProtensV7.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
[4]李泉溪.单片机原理与应用实例仿真.北京:
北京航空航天大学出版社,2009
[5]江世明.基于proteus的单片机应用技术.北京:
电子工业出版社,2009
致谢
本次课程设计是在刘伟春老师的亲切关怀和精心指导下完成的,在此,对他的关心、指导和教诲表示衷心的感谢!
我的设计自始至终都是在刘老师全面、具体的指导下进行的,刘老师在论文选题方面的远见卓识以及在完成课题和论文期间富有启发性的建议是本次课程设计得以顺利完成的根本保证。
他高尚的品德、严谨的学风、一丝不苟的治学态度和孜孜不倦的工作精神使我终生受益,这将为我今后的学习和工作打下坚实的基础。
感谢我的同学李娣、陈霞等人对我的关心和帮助。
他们的鼓励是我坚持完成本次课程设计的动力,他们提出的宝贵建议是我成功完成设计的保证。
最后,感谢评阅老师评阅本论文并提出宝贵意见!
附录Ⅰ源程序代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitnom=P3^7;
ucharcodeled_table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示数码表
ucharcodelight_state[]={0x21,0x12,0x0c,0x12};//交通灯状态存储表
ucharcodeem_state[3]={0x24,0x21,0x0c};//紧急灯状态显示表
ucharlight_time[][2]={{0,4},{0,1},{0,5},{0,1}};//显示时间存储表
ucharstatebef,time1s=100,state=0;//存储紧急灯状态,定时基数,状态基数
uinttime;//显示时间变量
bitmd_flag,state_flag=1,red;//显示时间更改状态,状态切换标志位,红绿切换标志位
/*--------------------------------
延时函数
------------------------*/
voiddelay(void)
{
uchari,j;
for(i=100;i>0;i--)
{
for(j=100;j>0;j--);
}
}
/*--------------------------
读状态函数:
判断是否有紧急灯状况出现
---------------------*/
ucharrd_emstate(void)
{
ucharvalue;
value=P3;
value>>=4;
value&=0x07;
if(value!
=statebef){statebef=value;return1;}//判断是否有紧急灯状况发生,保存按键值,置返回标志为1
elsereturn0;
}
/*------------------------
显示函数
----------------------*/
voiddisplay(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();//秒的个位
}
}
/*---------------------------
主函数
--------------------*/
voidmain()
{
//初始化定时器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)
{
case0x04:
P1=em_state[0];TR0=0;break;//紧急灯亮
case0x02:
P1=em_state[1];TR0=0;break;//东西应急灯亮
case0x01:
P1=em_state[2];TR0=0;break;//南北应急灯亮
case0x00:
TR0=1;break;
default:
break;
}
}
if(state_flag)//正常状态下时间切换,如果状态标志为1,进行如下处理,进行状态间切换
{
switch(state)
{
case0:
time=light_time[0][0]*60+light_time[0][1];
P1=light_state[0];break;//南北红灯亮时间
case1:
time=light_time[1][0]*60+light_time[1][1];
P1=light_state[1];break;//黄灯亮时间
case2:
time=light_time[2][0]*60+light_time[2][1];
P1=light_state[2];break;//南北绿灯亮时间
case3:
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
--------------------*/
voidTime0int(void)interrupt1
{
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
----------------------*/
voidExint1(void)interrupt2
{
EA=0;
md_flag=1;//置更改时间标志位
if(red)
{
switch(P3&0X07)
{
case6:
light_time[0][1]++;
if(light_time[0][1]==60)light_time[0][1]=0;break;//南北方向绿灯时间秒加小于60s
case5:
light_time[0][0]++;
if(light_time[0][0]==10)light_time[0][0]=0;break;//分加小于10m
case3:
red=0;break;//红绿灯切换
}
}
else
switch(P3&0X07)
{
case6:
light_time[2][1]++;
if(light_time[2][1]==60)light_time[2][1]=0;break;
//南北方向红灯时间秒加小于60
case5:
light_time[2][0]++;
if(light_time[2][0]==10)light_time[2][0]=0;break;//分加小于10
case3:
red=1;break;//红绿灯切换
}
EA=1;
}