基于单片机的交通信号灯控制设计论文.docx
《基于单片机的交通信号灯控制设计论文.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通信号灯控制设计论文.docx(17页珍藏版)》请在冰豆网上搜索。
基于单片机的交通信号灯控制设计论文
湖南工学院
第六届“圆融”杯大学生电子设计竞赛
作品论文
基于单片机的交通信号灯控制设计
参赛队员(电气与信息学院电子1102班):
李霞
覃桂婷
胡迪
2012年11月10日
摘要
随着社会的进步,科技的进步使人们的生活水平逐步提高,各种方便人们生活的自动控制系统进入了人们的生活,以单片机为核心的产品越来越多,这标志了自动控制系统成为了数字化时代的一员。
本次设计为十字路口交通灯控制系统设计,红绿黄灯按指定时序按不同时间循环点亮,并可实现倒计时时间模式的转换,智能、安全、高效的指挥交通秩序。
本交通灯系统硬件部分以89C52单片机为核心控制器,在此基础上,采用开关按键控制,外接LED数码管显示倒计时,发光二级管作为交通信号灯,蜂鸣器用作报警器。
软件部分采用C编程控制单片机的运行。
本系统由单片机系统、按键、LED数码管显示、交通灯演示组成。
系统除基本交通灯功能外,还具有倒计时、时间切换显示以及根据具体情况手动报警等功能。
一、方案设计与论证
1、电源提供方案
为使模块稳定工作,须有可靠电源。
因此考虑了三种电源方案:
方案一:
采用独立的稳压电源。
此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。
方案二:
采用单片机控制模块提供电源。
改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
方案三:
采用USB供电。
单片机使用的电压为5V,而USB输出来的电压正好为5V的电压,直接用USB供电比较方便。
综上所述,我选择第三种方案。
2、显示方案
该系统需完成倒计时功能。
基于上述原因,考虑了两种方案:
方案一:
采用两个两位的数码管显示。
这种方案直观的体现了不同方向的倒计时,只显示有限的符号和数码字符,简单,方便。
方案二:
采用一个四位的数码管显示。
这种方案虽然不用多占用I/O口,但没有直观的体现不同方向。
综上所述,我选择第一种方案。
3、时间切换控制方案
该系统能调节灯亮时间,处理紧急情况,研究了两种方案:
方案一:
采用8155扩展I/O口及键盘,显示等。
该方案的优点是:
使用灵活可编程,
并且有RAM,及计数器。
若用该方案,可提供较多I/O口,但操作起来稍显复杂。
方案二:
直接在I/O口线上接上按键开关,运用编程。
由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O口就可实现,且本
身的计数器及RAM已经够用,故选择方案二。
4、交通灯演示方案
采用在面板上焊接三色发光二极管模拟交通红绿灯,实现简单,清晰明了。
二、系统设计
1、系统总框图:
2、通行方案设计
南北红、东西绿:
南北方向禁行;东西方向通行。
东西红、南北绿:
东西方向禁行;南北方向通行。
3、系统功能
(1)复位功能
本设计装有复位键,当复位键按下之后,两位数码管全部显示0,发光二极管全部回归初始状态。
(2)正常指挥功能
红、黄、绿灯分别以40、5、40秒的时间循环显示,数码管循环显示40、5、40秒。
(3)模式切换
同时按下切换键和复位键,指示灯切换成红、黄、绿灯分别以30、5、30秒的时间循环显示,数码管切换成循环显示30、5、30秒;再次同时按下切换键和复位键,指示灯回复红、黄、绿灯分别以40、5、40秒的时间循环显示,数码管回复循环显示30、5、30秒。
(4)蜂鸣器报警
当有车闯红灯,按下蜂鸣器报警按键,蜂鸣器发出声音报警,此功能替代电子监控拍照。
4、基本构成及原理
(1)89C52的XTAL1和XTAL2接外部时钟电路,用于控制单片机的工作周期。
(2)89C52的RST接按键复位电路,用于单片机的复位控制。
(3)89C52的P2.0接开关S1,用于模式切换。
(4)89C52的P1.7接蜂鸣器用于报警。
(5)89C52的P1.0~P1.5外接六个发光二极管,具体作用通过编程实现。
(6)89C52的P1.0~P1.6接南北道倒计时数码管的段选和上拉电阻,P3.2和P3.3接位选;P0.0~P0.6接东西道倒计时数码管的段选和上拉电阻,P2.7和P2.6接位选动态显示数码管。
(7)发光二极管电路
P2.3~P2.5和P3.4~P3.6接六个发光二极管,外接220欧姆的电阻,发光二极管共阳极接+5V电源。
(8)三极管驱动数码管位选
由于数码管显示需要大一点的电流,而单片机管脚输出的电流不足以驱动它发亮,所以在数码管的位选处接NPN型三极管驱动它。
由于单片机的I/O口输出电流太小,不能驱动蜂鸣器发出声音,所以要接一个电流放大电路,三极管的基极经过限流电阻后由单片机的P1.7控制。
3、调试
根据方案设计的要求,调试过程共分两大部分:
硬件调试和软件调试。
1、硬件检测
(1)交通灯演示电路的调试:
交通灯模块由多个发光二极管组成,接线繁琐,极易出错。
检查二极管无故障、导线无断线、连线接头无互相搭联后可先写一个软件调试程序,依次检查东南西北方向的指示灯(发光二极管)是否点亮;若未点亮,则可能是连线接错。
根据灯的亮灭情况依次查找直到电路正常工作为止。
(2)倒计时电路调试:
倒计时电路主要有数码管组成。
当交通灯程序写好后,倒计时的显示可与最小系统板上两组数码管显示比较(系统板上的这两组数码管用以检查倒计时工作情况)。
若倒计时电路中有数码管不亮,检查数码管是否良好、数码管连线是否良好。
依次检查,直至倒计时电路正常工作。
(3)其它电路的调试主要看接口以及连线是否正确。
依次检查,直到正常工作。
2、软件调试
本系统的软件全部采用C语言编写,除语法与逻辑差错外,当确认程序没问题时,直接用proteus软件仿真调试。
仿真电路图:
程序代码:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbith=P2^1;
ucharcodetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
voiddelay(uintz)
{
uintx,y;
/*延时子程序*/
for(x=z;x>0;x--)
for(y=108;y>0;y--);
}
voidmain()
{
ucharn,N,i,j,q,a,b,k,g,f,m,o,p,l,u,c,d;
i=0;
j=4;
c=0;
d=3;
u=h;
switch(u==1)
{
/*40s倒计时*/
case1:
while
(1)
{
/*东西道红灯亮40s南北道绿灯亮40s*/
n=100;
while(n)
{
n--;
P2=0x9f;
P0=table[i];
delay(3);
P2=0xdf;
P2=0x5f;
P0=table[j];
delay(3);
P2=0xdf;
P3=0xb7;
P1=table[i];
delay(3);
P3=0xbf;
P3=0xbb;
P1=table[j];
delay(3);
P3=0xbf;
}
if(i==0x00)
{
i=0x0a;
j=j-1;
q=j+1;
}
/*东西道南北道黄灯亮5s*/
if(q==0x00)
{
a=5;
while(a+1)
{
n=100;
while(n)
{
b=0;
n--;
P2=0xaf;
P0=table[a];
delay(3);
P2=0xe7;
P2=0x6f;
P0=table[b];
delay(3);
P2=0xaf;
P3=0xd7;
P1=table[a];
delay(3);
P3=0xdf;
P3=0xdb;
P1=table[b];
delay(3);
P3=0xdf;
}
a--;
}
j=4;
i=1;
}
k++;
g=k%41;
/*东西道绿灯亮40s南北道红灯亮40s*/
if(g==0)
{
o=1;
l=1;
p=1;
f=0;
m=4;
while(l!
=0)
{l=o%42;
while(p!
=0)
{
p=o%41;
N=100;
while(N)
{
N--;
P2=0xb7;
P0=table[f];
delay(3);
P2=0xf7;
P2=0x77;
P0=table[m];
delay(3);
P2=0xf7;
P3=0xe7;
P1=table[f];
delay(3);
P3=0xef;
P3=0xeb;
P1=table[m];
delay(3);
P3=0xef;
}
if(f==0x00)
{
f=0x0a;
m=m-1;
}
f=f-1;
o++;
}
}
}
i=i-1;
}
/*30s倒计时*/
case0:
while
(1)
{
/*东西道红灯亮30s南北道绿灯亮30s*/
n=100;
while(n)
{
n--;
P2=0x9f;
P0=table[c];
delay(3);
P2=0xdf;
P2=0x5f;
P0=table[d];
delay(3);
P2=0xdf;
P3=0xb7;
P1=table[c];
delay(3);
P3=0xbf;
P3=0xbb;
P1=table[d];
delay(3);
P3=0xbf;
}
if(c==0x00)
{
c=0x0a;
d=d-1;
q=d+1;
}
/*东西道南北道黄灯亮5s*/
if(q==0x00)
{
a=5;
while(a+1)
{
n=100;
while(n)
{
b=0;
n--;
P2=0xaf;
P0=table[a];
delay(3);
P2=0xe7;
P2=0x6f;
P0=table[b];
delay(3);
P2=0xaf;
P3=0xd7;
P1=table[a];
delay(3);
P3=0xdf;
P3=0xdb;
P1=table[b];
delay(3);
P3=0xdf;
}
a--;
}
d=3;
c=1;
}
k++;
g=k%31;
/*东西道绿灯亮30s南北道红灯亮30s*/
if(g==0)
{
o=1;
l=1;
p=1;
f=0;
m=3;
while(l!
=0)
{l=o%32;
while(p!
=0)
{
p=o%31;
N=100;
while(N)
{
N--;
P2=0xb7;
P0=table[f];
delay(3);
P2=0xf7;
P2=0x77;
P0=table[m];
delay(3);
P2=0xf7;
P3=0xe7;
P1=table[f];
delay(3);
P3=0xef;
P3=0xeb;
P1=table[m];
delay(3);
P3=0xef;
}
if(f==0x00)
{
f=0x0a;m=m-1;}f=f-1;o++;}}}c=c-1;}}}
四、总结
此次的比赛让我们学到了不少东西,这是我们第一次进行电子制作,在没有单片机知识基础的情况下,完全由我们自己操作,从原理设计、方案选择、元器件选择、编写程序、模拟仿真、布线焊接,我们查阅了很多资料。
在大一时所学的C语言这一次就运用了,整个单片机的控制都是采用C语言编程。
把自己所查阅的资料应用到实际设计中是非常有成就感的,这也激励我们以后参加更多的比赛,将自己所学的知识和才能充分的发挥出来。
这次的比赛是做一个交通灯,题目虽然很简单,但是我们也遇到了不少困难,在编程仿真的时候,很多时候都达不到我们想要的效果,一遍一遍的修改程序,最终实现了我们想要的结果。
布线焊接是很关键的一步,怎样布线才能使电路看起来不乱,且电路连接正常,这次比赛,积累了大量经验为以后的比赛做了很好的铺垫。