交通信号灯设计报告含程序.docx
《交通信号灯设计报告含程序.docx》由会员分享,可在线阅读,更多相关《交通信号灯设计报告含程序.docx(24页珍藏版)》请在冰豆网上搜索。
交通信号灯设计报告含程序
武汉纺织大学
电子设计竞赛
——交通信号灯自动控制系统设计报告
学院:
电子与电气工程学院
班级:
电子093班
成员:
2011年5月1日
交通信号灯自动控制系统设计概要……………………………………………1
第一部分:
系统方案…………………………………………………1
第二部分:
电路与程序设计…………………………………………4
第三部分:
测试方案与测试结果……………………………………6
参考文献………………………………………………………………6
附录一主程序流程图………………………………………………7
附录二元器件清单……………………………………………………8
附录三程序清单……………………………………………………9
附录四仿真电路图………………………………………………
交通信号灯自动控制系统设计概要
一、设计要求要求
1.系统基本功能要求
(1)以秒为计时单位,两位数码管以十进制递减计数形式作定时显示,在递减计数回零瞬间完成换灯操作。
(2)通过键盘红、黄、绿三色信号灯所亮时间在0~99秒内任意设定。
(3)十字路口的通行起始状态可人工设定,运行中可通过人工干预使十字路口通行状况固定于任何一种工作模式。
(4)具有时间控制功能,交通信号灯工作时间:
05:
00~23:
00;其余时间两个干道上的黄色信号灯闪烁显示;
(4)绿色信号灯倒计时最后3秒和黄色信号灯显示时闪烁显示。
(闪烁频率:
1Hz);
二、设计思路
为了完成本题目的设计要求,即倒计时及时间控制功能,采用单片机内部定时器进行时间的控制,为了实现调整工作倒计时时间、系统工作时间及工作状态,采用5个键盘分别对上面内容进行设置。
交通信号采用发光二极管,排布参照下面布局,数码管显示倒计时时间及系统时间。
第一部分系统方案
一、 总体电路构成
本系统由主控制器STC89c52单片机芯片、基本复位电路、时钟
振荡电路、电源、按键扫描电路、七段数码管驱动及显示电路、发光二极管控制显示电路组成。
二、 各单元电路设计
1.复位电路
复位电路的作用:
在上电或复位过程中,控制CPU的复位状态:
这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。
基本的复位方式:
单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。
89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。
单片机系统的复位方式有:
手动按钮复位和上电复位
(1)手动按钮复位
手动按钮复位需要人为在复位输入端RST上加入高电平(图2)。
一般采用的办法是在RST端和正电源Vcc之间接一个按钮。
当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。
手动按钮复位的电路如所示。
由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。
(2)上电复位
AT89C51的上电复位电路如图3所示,只要在RST复位输入引脚上接一电容至Vcc端,下接一个电阻到地即可。
上电复位的工作过程是在加电时,复位电路通过电容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。
为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。
通过以上分析可知手动按键复位要比上电复位方便,所以电路采用手动按键复位。
图2
图3
通过以上分析在此次交通信号灯设计时由于其可操作性和灵活性,我们选择的是按键复位方式.,这样可以及时的控制单片机,使其CPU及系统各部件处于确定的初始状态,并从初态开始工作。
2.时钟振荡电路
由于AT89C52单片机内部有一个用于构成振荡器的高增益反向放大器,此放大器的输入和输出端分别是引脚XTAL1和XTAL2,在XTAL1和XTAL2上外接时钟源即可构成时钟电路,该电路采用的是内部方式,如图4所示:
图4
在XTAL1和XTAL2的两端接石英晶体振荡器,与内部反向器构成稳定的自激振荡器,发出的时钟脉冲直接进入片内定时定时控制部件。
用以提供交通灯时钟信号。
3.电源
单片机及其他芯片所需要的电源电压为5V,可以采用直流稳压电源给该系统供电。
4.数码管驱动及显示电路
电路采用4个两位的共阳极7段数码管(如图5)动态扫面显示,
为了使数码管显示较亮,采用两个锁存器进行驱动。
图3
5.按键扫描电路
6.发光二极管控制显示电路
采用普通的反光二极管(红、黄、绿)利用单片机p1口进行控制显示。
7.锁存器
锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。
锁存,就是把信号暂存以维持某种电平状态。
锁存器的最主要作用是缓存,其次完成高速的控制其与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个I/O口既能输出也能输入的问题。
第二部分电路与程序设计
1.复位电路
采用手动按键复位电路,实际电路及其参数为电解电容10uf,电阻为10k(图中电源为+5v):
2.时钟振荡电路
采用12MHz晶振,30~33pf电容即可。
在此设计中我们选用30pf的电容。
3.电源
如下图所示,为串联式直流稳压电源
输出电压范围为4V~15V该电源为模电课程设计时制作,在这里可直接用作5V电源。
4.数码管驱动及显示电路
数码管用来显示交通灯倒计时,小时、分钟、秒的显示,以及倒计时与时间的调节。
5.按键扫描电路
电路采用了5个按键k0~k4,k0、k1、k2用来对倒计时总时间的调节,k4、k1、k2用于对系统时间的调节,k3用于对工作状态的调节。
K0每按下一次,con加1,当con=3时,使con=0,重新判断k0是否按下,
如果con=1,k1键实现对倒计时总时间加1,k2键实现对倒计时总时间减1,当con=2时,k1键实现对黄灯显示时间加1,k2键实现对黄灯显示时间减1。
K4每按下一次,对con2加1,当con2=4时,使con2=0,重新判断k4键是否按下,当con2=1时,显示系统时间,当con2=2时,k0、k1实现对小时的加减,当con2=3时,k0、k1实现对分钟的加减。
通过K3按下的次数使电路工作在不同的5个状态。
6.发光二极管控制显示电路
发光二极管由单片机通过p0口进行控制显示。
先对p0口的值进行编码,再将编码按要求赋给p0口。
7.锁存器
我们使用的是两个SN74hC573AN型号的锁存器,由单片机的p1和p3端口通过锁存器来控制数码管的动态显示。
第三部分调试与仿真
1、软件调试:
程序编好以后,先自己检查是否有逻辑错误,保证正确后利用伟福仿真软件对所编写的程序进行编译,检查是否有语法错误,出现错误时伟福系统会自动提示有错误产生,并会指定错误的语句,这时我们需要认真检查程序,修改编译中出现的错误。
程序修改无误后,利用仿真软件,我们可以监视程序PC指针、P0、P1、P2口的变化、以及存储单元的值的变化来检查程序是否运行正常,是否能够实现预定的控制功能。
2、硬件调试:
按照已经设计好的电路设计图,在proteus中进行调试与仿真,确保电路无误,在万能印刷电路板上焊接各个元件。
电路板制作完成以后,利用万用表检查硬件是否焊接正常以及是否出现短路和断路的情况,并修改焊接中的错误,直到硬件电路可以正常工作为止。
在第一次进行检测时发现显示管不会显示数据,经过进一步检查才发现是电源线没有焊接。
如此反复操作,直到硬件可以正常运行。
参考文献
1.谢维成.单片机原理与应用及C51程序设计(第二版).北京:
清华大学出版社.2011
2.阎石.数字电子技术基础(第五版).北京:
高等教育出版社.2010
3.童诗白.模拟电子技术基础(第四版)北京:
高等教育出版社.2010.
附录一主程序软件流程图
开始
给定系统初始时间5:
01:
00
时间是否在5点到23点之间
Y
黄灯闪烁显示,时间显示
N
调用键盘显示程序
判断是否有键按下?
调用key()根据按键情况进行显示
用led(),display(ucharx)进行显示
Y
N
附录二原器件清单
制作交通信号灯所需元件清单
名称
数量
元件说明
单片机(底座)
1
STC89C52型号
电路板
1
单面
两位数码管
4
共阳极
LED灯
12
红黄绿各四个
锁存器
(底座)
2
SN74HC573AN型号
按键开关
6
四个脚
石英晶体振荡器
1
12M振荡频率
电阻
13
1K1个,上拉1K6个,10K5个,200欧1个
电容
3
30Pf2个,10Uf1个
铜柱
4
普通
焊锡导线
若干
普通
制作5V直流电源所需器件
名称
数量
元件说明
整流二极管
4
1n4001
电解电容
2
1000u/25V
三极管
5
9013
大功率三极管
1
3A/50V
红色发光二极管
1
普通
大电阻
1
2.7Ω/1W
1/4W电阻
6
510Ω,1.5K,2K,5.6K,10K,12K
瓷片电容
2
0.01μ
变压器
1
15V/220V5W
电路板
1
80×100mm2
二芯带插头电源线
1
普通
开关
1
普通
导线焊锡
若干
普通
附件三程序清单
#include
#defineucharunsignedchar
charcodedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xff,0xbf};//数码管位选
charcodescan_con[8]={0x40,0x80,0x10,0x20,0x04,0x08,0x01,0x02};//数码管段选
chardatadis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};//显示缓冲区,时、分、秒
uchartime=30,timedata=60,timedata1=30,timeo=5,
flagkey3=0,flagkey0,flagkey4=0,tt=0,a,con=0,con1=0,con2=0;
uchartimeclk[3]={0x00,0x01,0x05};//时间初始值
sbitkey0=P2^0;
sbitkey1=P2^1;
sbitkey2=P2^2;
sbitkey3=P2^3;
sbitkey4=P2^4;
delay1ms(intt)//延时一秒函数
{inti,j;
for(i=0;ifor(j=0;j<120;j++);
}
display(ucharx)//数码管倒计时函数
{
P1=dis_7[x/10];
P3=0xaa;
delay1ms
(1);
P3=0x00;
P1=dis_7[x%10];
P3=0x55;
delay1ms
(1);
P3=0x00;
}
displayt()//时间显示函数
{
chark;
dis[0]=timeclk[0]%10;dis[1]=timeclk[0]/10;
dis[3]=timeclk[1]%10;dis[4]=timeclk[1]/10;
dis[6]=timeclk[2]%10;dis[7]=timeclk[2]/10;
for(k=0;k<8;k++)
{P1=dis_7[dis[k]];P3=scan_con[k];
delay1ms
(1);P3=0x00;}
}
key()//键盘扫面函数
{
if(key0==0&&flagkey3==0)//用于对倒计时时间调节
{
display(time);
delay1ms(10);
while(key0==0);
flagkey0=1;
++con;}
if(con==1)//调整倒计时总时间
{display(time);
if(key1==0)//加一操作
{delay1ms(10);
while(key1==0);
time++;
if(time==100)
{
time=0;
}
}
if(key2==0)//减一操作
{
delay1ms(10);
while(key2==0);
time--;
if(time==0)
{
time=99;
}
}
}
if(con==2)//用于调整黄灯显示时间
{display(timeo);
if(key1==0)
{delay1ms(10);
while(key1==0);
++timeo;
if(timeo==100)
{
timeo=0;
}
}
if(key2==0)
{
delay1ms(10);
while(key2==0);
--timeo;
if(timeo==0)
{
timeo=99;
}
}
}
if(con==3)//退出调节
{
con=0;
EA=1;
flagkey0=0;
timedata1=time;
timedata=2*time;
}
if(key3==0)//用于设定二极管工作于某一状态
{
delay1ms(10);
while(key3==0);
con=0;
flagkey0=0;
flagkey3=1;
++con1;}
if(con1==1)
{
P0=0x84;
displayt();
}
if(con1==2)
{
P0=0x44;
displayt();
}
if(con1==3)
{
P0=0x30;
displayt();
}
if(con1==4)
{
P0=0x28;
displayt();
}
if(con1==5)
{
while(tt>=10&&tt<20)
{P0=0x48;
displayt();
}
displayt();
P0=0x00;
}
if(con1==6)//退出设定
{
con1=0;
flagkey3=0;
timedata1=time;
timedata=2*time;
}
if(key4==0)//用于显示调整系统时间
{
delay1ms(10);
while(key4==0);
flagkey4=1;
con2++;
}
if(con2==1)
{
displayt();
}
if(con2==2)
{display(timeclk[2]);
if(key1==0)
{delay1ms(10);
while(key1==0);
timeclk[2]++;
if(timeclk[2]==24)
{
timeclk[2]=0;
}
}
if(key2==0)
{
delay1ms(10);
while(key2==0);
timeclk[2]--;
if(timeclk[2]==0)
{
timeclk[2]=24;
}
}
}
if(con2==3)
{display(timeclk[1]);
if(key1==0)
{delay1ms(10);
while(key1==0);
++timeclk[1];
if(timeclk[1]==60)
{
timeo=0;
}
}
if(key2==0)
{
delay1ms(10);
while(key2==0);
--timeclk[1];
if(timeclk[1]==0)
{
timeclk[1]=59;
timeclk[2]--;
}
}
}
if(con2==4)//退出时间调整
{
con2=0;
flagkey3=0;
flagkey0=0;
flagkey4=0;
}
}
led()//l二极管显示程序
{
if(timedata<=2*time&&timedata>time+timeo+3)
{
P0=0x84;
}
if(time+timeo{
while(tt>=10&&tt<20)
{
P0=0x84;
display(timedata1);
}
P0=0x04;
}
if(timedata<=timeo+time&&timedata>time)
{
while(tt>=10&&tt<20)
{P0=0x44;
display(timedata1);}
P0=0x04;
}
if(timedata<=time&&timedata>=(timeo+3))
{
P0=0x30;
}
if(timedata<(timeo+3)&&timedata>timeo)
{
while(tt>=10&&tt<20)
{P0=0x30;
display(timedata1);}
P0=0x20;
}
if(timedata<=timeo)
{
while(tt>=10&&tt<20)
{P0=0x28;
display(timedata1);}
P0=0x20;
}
}
voidmain()
{
TMOD=0x01;
TH0=0x3c;TL0=0xb0;
TR0=1;ET0=1;
EA=1;
P0=0x00;
P3=0X00;
P2=0xff;
while
(1)
{
while((timeclk[2]>=23&&timeclk[1]>0)||(timeclk[2]<5&&timeclk[1]<60))
{
while(tt>=10&&tt<20)
{P0=0x48;
key();}
P0=0x00;
key();
}}
if(flagkey3==0&&flagkey0==0&&flagkey4==0){led();}
if(flagkey4==0)
{
if(flagkey0==0&&flagkey3==0){display(timedata1);}
else{
}
}
else{displayt();}
key();
}
}
voidtime0()interrupt1//定时器T0中断
{ET0=0;
TH0=0x3c;
TL0=0xb0;
tt++;
if(tt==20)
{tt=0;
timedata--;
timedata1--;
timeclk[0]++;
if(timedata1==0)
{
timedata1=time;
}
if(timedata==0)
{
timedata=2*time;
}
if(timeclk[0]==60)
{
timeclk[0]=0;
timeclk[1]++;
if(timeclk[1]==60)
{timeclk[1]=0;
timeclk[2]++;
if(timeclk[2]==24)
{timeclk[2]=0;}
}
}
}
ET0=1;
}
附录四仿真电路图