资源描述
景德镇高等专科学校
毕
业
设
计
报
告
作品名称:单片机的智能交通灯控制系统设计
学校名称:景德镇高等专科学校
专业名称:电子信息工程技术
指导老师:谢恩
制 作 人:黄安平 黄华 钟学友 黄文文
完成日期: 2010年12月24日
摘 要
交通灯是现代交通非常重要的一个组成部分,一套好的交通灯系统往往对提升城市交通运输效率,降低事故发生率有至关重要的影响。
本系统由单片机系统、供电系统、交通灯演示系统、中断系统组成。
选用单片机作为此次设计的控制系统主要是考虑到单片机的通用性和廉价性。通用性是指单片机的电路以及编程语言相对比其他控制模块来说更加简单和通用,这个对于往后功能的添加以及系统的维护来说更加简便和易行。廉价性是单片机相对于其他的控制模块来说成本更低,一块成熟的STC89C52的成本不过10元,加上其他的外围电路成本也不超过100元,无论是开发成本和维护成本都能够得到很好的控制。本设计选用STC89C52主要也就是基于上述的两个原因。
本交通灯系统选用了LED灯和双位数码管来模拟显示的交通灯切换状态。中断系统所实现的功能是在有特定需要的情况下实现对交通灯状态的控制。这些状态包括全红灯和高低峰即时切换。
本系统除了实现最基本的交通灯功能以外,还可实现高低峰分时段控制方案以应对不同时段的不同交通状况,城市的交通早晚时段的流量往往能够达到最大,分时控制对于提高城市交通效率有非常重要的作用。
关键词: 单片机 STC89C52 交通灯 分时系统
目 录
1前言.....................................................................1
1.1 课题意义...............................................................1
2课题内容.................................................................1
3方案比较、设计和论证......................................................2
3.1 供电方案...............................................................2
3.2 显示界面方案...........................................................3
3.3 输入方案...............................................................3
4 系统设计.................................................................4
4.1 交通灯规则方案.........................................................4
4.1.1交通灯状态...........................................................4
4.1.2高低峰分时管理机制..................................................6
4.2 软件编程..............................................................7
4.3 硬件设计部分..........................................................8
4.3.1 单片机系统..........................................................8
4.3.2 交通灯演示系统......................................................9
4.3.3 电源供电电路......................................................9
4.3.4 中断系统............................................................9
5 系统调试................................................................9
5.1 断电调试..............................................................9
5.2 通电调试..............................................................10
5.3 基本要求部分的测试与分析..............................................10
6 结论................................................................10
参 考 文 献...............................................................11附录一 系统主板电路.......................................................12
附录二 程序清单...........................................................13
附录三 系统实物图........................................................21
1. 前言
1.1 课题意义
使用单片机作为本设计的控制方案主要是考虑到其低廉的成本和易学易用的特性,相较于类似ARM这类性能更为强大的控制方案,单片机的性能并非其优势所在。但是如何充分利用单片机已有的功能进行最大化的开发才是本设计的重点。
总的来说,本设计意义有如下4个方面:
(a). 对单片机这一成熟的解决方案在交通灯领域的应用进行研究和开发;
(b). 探究分时管理系统在交通灯系统中的应用,对分时管理系统的C语言算法进行开发。举一反三,延伸到其他类似领域的应用。
(c). 探究全新的交通灯管理系统;
(d). 建立不间断电源在实际应用领域的具体模型和电路结构。
2.课题内容
本课题的主要内容包括如下几个方面:
(a). 设计交通灯状态的管理方案;
(b). 设计单片机最小系统和周边电路;
(c). 设计交通灯系统、不间断供电系统以及中断系统的电路结构;
(d). 设计整个系统的电路分布和接线;
(d). 使用C语言编写整个系统运行所需要的程序,重点是分时管理系统和紧急中断系统的程序。
3 方案比较、设计和论证
3.1 供电方案
为使模块稳定工作,须有可靠电源。本设计考虑了两种电源方案:
方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。
方案二:采用单片机控制模块提供电源。本方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
3.2 显示界面方案
本设计涉及到倒计时、状态灯等功能。基于功能需求,本设计考虑如下三个方案:
方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字符,无法胜任功能需求。
方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。
方案三:采用数码管与点阵LED 相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能要求,又减少了系统实现的复杂度。
3.3 输入方案
考虑到紧急情况和具体现场的情况,本设计考虑两种方案:
方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是:使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。
方案二: 直接在I/O口线上接上按键开关。该方案优点是:编程更加简洁,使用更加简单,且成本更低。缺点就是功能有限
综合考虑本设计的实际需要,在使用输入的时候不需要过于复杂的功能,故采用方案二。
4 系统设计
4.1 交通灯规则方案
本设计的交通灯以十字路口为模型,在实现基本的功能前提下增加了高低峰分时管理机制和人工干预机制。
4.1.1交通灯状态
为方便说明交通灯状态,交通灯系统的示意图如图2所示。
如图2,交通道路系统是由常见的双车道组成,由南向北行驶的车辆所看的交通灯是北路口的车行道交通灯,由北向南的车辆所看的交通灯是南路口的车行道交通灯,由西向东行驶的车辆所看的交通灯是东路口的车行道交通灯,由东向西行驶的车辆所看的交通灯是西路口的车行道交通灯。
现规定如下状态:
S1:南北方向车辆通行,东西方向、南左转到西、北左转到东、西左转北、东左转南禁行,东西方向人行道通行、南北方向人行道禁行。S1状态如图3所示。
图2 交通灯示意图
图3 S1状态示意图
S2:东西方向车辆通行,南北方向、南左转到西、北左转到东、西左转北、东左转南禁行,南北方向人行道通行、东西方向人行道禁行。S2状态如图4所示。
S3:南左转西、北左转东车辆通行,南北方向、东西方向、西左转北、东左转南车辆禁行,南北方向、东西方向人行道禁行。S3状态如图5所示。
S4:西左转北、东左转南车辆通行,南北方向、东西方向、南左转西、北左转东车辆禁行,南北方向、东西方向人行道禁行。S4状态如图6所示。
图4 S2状态示意图
图5 S3状态示意图
S5:全红灯,紧急事件状态。S5状态如图7所示。
4.1.3 高低峰分时管理机制
本设计为提升交通灯系统效率,设置了高低峰分时管理机制。高低峰分时定义如下:
高峰时段:8点到10点,一般为上班上学出行的高峰期,18点到20点,一般为下班放学出行高峰期,此时主干道车流量高于次干道的车流量;
图6 S4状态示意图
图7 S5状态示意图
低峰时段:除高峰时段的其他时段。
在高峰时段,采取增加主干道绿灯通行时间,减少次干道绿灯通行时间以最大限度的通过车辆。
在低峰时段,采取减少主干道绿灯通行时间,增加次干道绿灯通行时间以平衡通过车辆。
高低峰时段状态如表1所示。
表1 高低峰时段状态表
S1
S2
S3
S4
低峰时段
高峰时段
南北向车行道绿灯时长60s
南北向车行道绿灯时长90s
东西向车行道绿灯时长60s
东西向车行道绿灯时长60s
南左转西,北转东绿灯时长30s
南左转西,北转东绿灯时长30s
东左转南,西左转北绿灯时长30s
东左转南,西左转北绿灯时长30s
在发生突发事件的时候启动紧急状态S5,全部红灯亮。这种状态主要适用于例如救护车,军车执行任务时候使用。
4.2 软件设计
在本次设计中,采用了C语言作为程序编程的语言。
本设计在编程环境上也选择了Keil μVision 2.0。这款软件支持众多不同公司的MCS51架构芯片,它集编辑、编译、仿真为一体,同时还支持PLM、汇编和C语言的程序设计,界面友好、简单易学,在调试程序。软件仿真方面都有很强大的功能。在初期的软件调试阶段,Keil μVision会提供非常便利的环境。
4.3 硬件设计部分
根据本设计交通灯的模型和实现的功能,硬件部分可以分为以下两个大的系统:单片机系统、交通灯演示系统、电源供电系统、中断系统。
4.3.1 单片机系统
本设计单片机主要是用于控制交通灯的演示系统,故只需要单片机最小系统即可完成。
单片机的最小系统是指能够驱动单片机工作的最小电路。此电路由单片机、时钟电路、电源、复位电路4个组成部分组成。图8为单片机最小电路的电路图。
其中,复位电路如图9。单片机复位电路原理是在单片机的复位引脚rst 上外接电阻和电容,实现上电复位,而复位时间是(时钟周期=12×振荡周期,振荡周期=1/f),这个时间只能大不能小,具体数值可以由rc电路计算出时间常数。
1
2
3
4
5
6
7
8
9
P1
10K
VCC
VCC
VCC
1
2
Y1
12MHz
30pF
C4
30pF
C5
P00
39
P01
38
P02
37
P03
36
P04
35
P05
34
P06
33
P07
32
P20
21
P21
22
P22
23
P23
24
P24
25
P25
26
P26
27
P27
28
RXD
10
TXD
11
ALE/P
30
PSEN
29
P10/T
1
P17
8
P16
7
P15
6
P14
5
P12
3
P13
4
P11/T
2
RESET
9
RD
17
X1
19
X2
18
EA/VP
31
T0
14
T1
15
WR
16
INT0
12
INT1
13
GND
20
VCC
40
89C52
¸´Î»
R17
1K
R18
10K
+
CJ4
10UF
VCC
D1
D2
D3
D4
D5
D6
D7
D0
WELA
DULA
DB2
DB3
DB4
DB5
DB6
DB7
DB1
DB0
½ô¼±
·Öʱ¶Î
图8 STC89C52最小系统图
图9 复位电路图
时钟电路如图10所示。
时钟电路中最为重要的就是晶振,晶振的作用是为系统提供基本的时钟信号。晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。
图10时钟电路图
4.3.2 交通灯演示系统
根据功能,交通灯的演示系统从功能上则分为:倒计时电路、红绿灯功能电路。交通灯演示系统电路图如图12所示。
倒计时电路主要是由双位共阴数码管和74HC573N驱动模块组成,控制信号通过单片机的端口P1口进行信号的传输。倒计时电路负责的是显示红绿灯持续显示的时间。当绿灯或者红灯持续显示时,数码管显示该状态的持续时间,在黄灯闪烁显示时,起到倒计时秒数的作用。
红绿灯功能电路主要是由各色的发光二极管和74HC573N驱动模块组成,控制信号跟数码管一样都是通过P1口进行传输。红绿灯电路负责的是各个车行道和人行道通行状态的显示。
4.3.3 供电电路
供电电路由稳压电源组成。主电源主要是由变压器、6A整流桥、2颗1000μF电容以及7805三端稳压管组成。这个部分为系统提供主要的供电,输出电压为5V
图11主电源和备用电源切换功能电路
图12交通灯演示系统电路图
4.3.4 中断系统
中断系统主要是负责高低峰方案和紧急方案的切换。电路图如图17所示。
图17 中断系统
5 系统调试
5.1 断电调试
为安全起见,防止硬件烧坏,首先进行断电调试,用万用表检测系统是否有短路现象,再检查严原理是否正确,各个线路的电平是否正常。经检测,未出现短路现象以及各个电平都正常。
5.2 通电调试
(a). 关掉交流电源开关,用万用表直流电压档测量稳压输出电压,测量结果只有0.9V,用12V电源直接接入7805输入端,测量输出电压达到4.99V。经检查分析为稳压芯片7805输入端电容没有接入,输入电压变化太大,造成7805无法稳压。经处理问题解决。
(b). 检查系统时钟是否正常工作,用万用表直流电压档测量XTAL1与AXTAL2两端间的电压,检测到电压若为2.5V左右,则视为正常工作。
(c). 检查复位电路是否正常工作。
(d). 检查数码管显示和LED灯是否正常。
5.3 基本要求部分的测试与分析
(a). 系统上电后,显示交通灯基本状态,按中断按键,中断正常,直接进入S5状态,按复位按键,整个系统复位成功。
(b). 按高低峰切换按键,系统即时切换到高峰时段方案,再按下高低峰切换按键,系统即时切换到低峰时段方案,最后按下高低峰按键,系统重新进入预定流程。
(c). 在未进行任何的中断和复位操作时,交通灯按照预定流程进行,在高低峰两个设定时段内变化。
6结论
本文探究了单片机在当今智能交通方面的应用。相对于其他解决方案来说,单片机具有成本低廉,通用性高,维护简单,软件灵活,成熟度高等优势。但是,单片机发展到现在也有存储空间较小、下游方案较少等局限性。
本设计在实现相应功能的时候主要是考虑到现有的条件,采用成熟度高的STC89C52作为CPU的解决方案,同时用LED灯和双位数码管作为显示模块,软件则使用了移植性好的C语言。从功能需求上来看,已经能够满足实际需要。高低峰分时管理方案作为灵活的交通灯状态方案,对提高交通运输系统的运行效率也有很大的帮助。
单片机作为已经发展了30年的成熟产品,很多优势正在逐渐失去,让位于更加先进的芯片解决方案。但是作为成熟方案还是在很多领域能够发挥作用。
参 考 文 献
谭浩强.2005.C程序设计(第三版).北京:清华大学出版社.95-104
肖金球.2004.单片机原理与接口技术.北京:清华大学出版社.210-230
彭冬明,韦友春.2007.单片机实验教程.北京:北京理工大学出版社.58-65
范立南.1996.单片微机接口与控制技术.沈阳:辽宁大学出版社.110-135
李华.1993.MCS-51系列单片机实用接口技术.北京:北京航空航天大学出版社.36-56
温欣玲,张玉叶.1999.基于单片机交通灯智能控制系统研究. 微计算机信息,23(10):90-91
胡汉才. 1996.单片机原理及接口技术.北京:清华大学出版社.
周美珍,江志华.2005.单片机控制交通灯的硬件与软件设计.家庭电子,9(20):20-21
蒋汝根,钱丹浩.2006.基于AT89C51单片机的交通灯模拟控制系统.无锡商业职业技术学院学报,6(6):8-12
康华光,陈大钦.2005.电子技术基础(模拟部分).北京:高等教育出版社
康华光,邹寿彬.2005.电子技术基础(数字部分).北京:高等教育出版社
李朝青.2005.单片机原理及接口技术(第三版).北京:北京航空航天大学出版社.88-109
张伟,王丽,赵晶.2003.电路设计与制作Protel DXP入门与提高.北京:人民邮电出版社.300-320
附录一 系统主板电路图
附录二 程序清单
/******************************************************
本交通灯实现的功能:
1、正常时可以分时段车流高峰与低峰进行控制
2、可以紧急控制,让某些车通过
3、可以人为设置为车流高峰区状态
******************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar t,b,s,s1,s2,s3,s4,yellowtime,yellowflag,half_sec,sec,a;
uint time;
sbit dula=P2^7;
sbit wela=P2^6;
bit g; //中断标志位
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z) //延时函数
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函数
{
half_sec = 0;
s = 1;
sec = 60;
t = 0;
g = 0;
time = 5;
yellowtime = 5;
yellowflag = 0;
s1 = 60;
s2 =60;
s3 = 30;
s4 = 30;
IT1 = 0; //设置外部中断1为低电平触发
IT0 = 0; //设置外部中断0为低电平触发
EX0 = 1; //允许外部中断0
EX1 = 1;
TMOD = 0x01; //设置定时器为十六位工作方式
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256; //设置定时时间为50MS
EA = 1; //总中断使能
ET0 = 1; //定时器0中断开
TR0 = 1; //定时器0
}
void main()
{
init();
/****************状态S1,绿灯亮********************/
while(1)
{
if((s == 1) && (yellowflag == 0))
{
P1 = 0xd7; //设置车道灯
dula = 1; //打开段锁存器
P0 = table[sec /10]; //存入段码,显示绿灯十位
dula = 0; //锁住段码
P0 = 0xff; //消影
wela = 1; //打开位锁存器
P0 = 0xfe; //存入位选,设置某位数码管显示
wela = 0;
P0 = 0; //消影
delay(3);
dula = 1;
P0 = table[sec%10]; //显示绿灯的个位
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
P0 = 0;
delay(3);
}
/****************状态S1,黄灯亮********************/
if((s == 1)&& (yellowflag == 1))
{
if(half_sec % 2)
{
P1 = 0xb7; //车道黄灯关
}
else
{
P1 = 0xf7; //车道黄灯开
} //前面十行实现黄灯闪烁
dula = 1;
P0 = table[sec/10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xee;
wela = 0;
P0 = 0;
delay(3);
dula = 1;
P0 = table[sec%10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xdd;
wela = 0;
P0 = 0;
delay(3);
}
/****************状态S2,绿灯亮********************/
if((s == 2)&& (yellowflag == 0))
{
P1 = 0x7d; //设
dula = 1;
P0 = table[(sec / 10)]; //显示绿灯的十位
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
P0 = 0;
delay(3);
dula = 1;
P0 = table[(sec % 10)]; //显示绿灯的个位
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
P0 = 0;
delay(3);
}
/****************状态S2,黄灯亮********************/
if((s == 2)&& (yellowflag == 1))
{
if(half_sec % 2)
{
P1 = 0x7b;
}
else
{
P1 = 0x7f; //前面四行实现黄灯闪烁
}
dula = 1;
P0 = table[sec/10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xee;
wela = 0;
P0 = 0;
delay(3);
dula = 1;
P0 = table[sec%10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xdd;
wela = 0;
P0 = 0;
delay(3);
}
/****************状态S3,绿灯亮********************/
if((s == 3)&& (yellowflag == 0))
{
P1 = 0xe7; //设置灯
dula = 1;
P0 = table[sec/10]; //显示绿灯的十位
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
P0 = 0;
delay(3);
dula = 1;
P0 = table[sec %10]; //显示绿灯的个位
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
P0 = 0;
delay(3);
}
/****************状态S3,黄灯亮********************/
if((s == 3)&& (yellowflag == 1))
{
if(half_sec % 2)
P1 = 0xb7;
else
P1 = 0xf7; //前面四行实现黄灯闪烁
dula = 1;
P0 = table[sec/10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xee;
wela = 0;
P0 = 0;
delay(3);
dula = 1;
P0 = table[sec%10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xdd;
wela = 0;
P0 = 0;
delay(3);
}
/****************状态S4,绿灯亮********************/
if((s == 4) && (yellowflag == 0))
{
P1 = 0x7e; //设置灯
dula = 1;
P0 = table[(sec / 10)]; //显示绿灯的十位
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
P0 = 0;
delay(3);
dula = 1;
P0 = table[(sec % 10)]; //显示绿灯的个位
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
P0 = 0;
delay(3);
}
/****************状态S4,黄灯亮********************/
if((s == 4)&& (yellowflag == 1))
{
if(half_sec % 2)
P1 = 0x7b;
else
P1 = 0x7f; //前面四行实现黄灯闪烁
dula = 1;
P0 = table[sec/10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xee;
wela = 0;
P0 = 0;
delay(3);
dula = 1;
P0 = table[sec%10];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xdd;
wela = 0;
P0 = 0;
delay(3);
}
}
}
void Time0 () interrupt 1
{
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256; //设置定时时间为50MS
t ++ ;
if( t == 10) //0.5秒
{
half_sec ++;
t = 0;
}
if(half_sec == 2) //一秒
{
half_sec = 0; //清零
sec -- ; //倒计时
a ++;
if(a > 53) //T=3599时表示一个小时,设为53为缩短时间,显示效果
{
time ++;
a = 0;
if(time == 24)
time = 0;
if(g == 0) //没有人工设为高峰区
{
if((time >= 8) && (time < 9))
{
s1 = 60;
s2 = 60;
s3 = 30;
s4 =30;
}
if((time >= 9) && (time < 17))
{
s1 = 60;
s2 = 60;
s3 = 30;
s4 = 30;
}
if((time >= 17) && (time < 20))
{
s1 =60;
s2 = 60;
s3 = 30;
s4 = 30;
}
if((time >= 20) || (time < 8))
{
s1 = 60;
s2 =60;
s3 = 30;
s4 = 30;
}
}
}
if(sec == yellowtime) //倒计时到了黄灯时间
{
yellowflag = 1;//黄灯闪烁标志
}
if(sec == 0) //倒计时到了0秒,此时要切换下个状态
{
yellowflag = 0;//黄灯闪烁关闭
if(s == 1) //换向设置通行时间,为换状态准备
{
sec = s1;
}
if(s == 2) //换向设置通行时间
{
sec = s2;
}
if(s == 3) //换向设置通行时间
{
sec = s3;
}
if(s == 4) //换向设置通行时间
{
sec = s4;
s = 0;
}
s++;
}
}
}
void waibu0() interrupt 0 //紧急状态
{
P1 = 0x77; //设置所有车道灯为红灯
dula = 1; //下面几行把所有数码管关掉
P0 = 0;
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0;
wela = 0;
P0 = 0;
}
void w
展开阅读全文