基于单片机的交通灯控制系统设计说明书Word文档下载推荐.docx
《基于单片机的交通灯控制系统设计说明书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯控制系统设计说明书Word文档下载推荐.docx(22页珍藏版)》请在冰豆网上搜索。
从而造就了道路的通行能力远低于设计时候所预期的要求并且波动性比较大,交通事故发生率高等问题。
城市交通的解决方法
城市交通拥挤有人说是因为道路狭窄引起的,所以有些人建议加宽道路或者架设高架桥来缓解交通压力。
但是,过不了多久加宽的道路又陷入了拥挤。
一般来说新加宽的道路不会改变原来的拥挤状况,很快新的交通量占据新增的道路设施,这部分潜在的交通量受制于以前道路供给而未能得到实现的。
由于加宽道路不能从根本上解决拥挤的城市交通问题,所以就开始寻求新的解决方法。
随着人们对控制理论的深入研究与探索以及科技的不断发展,利用微计算机的控制系统对解决交通问题越来越重要。
现如今国内外开发了许多交通控制系统为缓解交通压力做出了突出贡献。
伴随着人工智能的兴起,人们开始将人工智能引入到交通灯控制系统当中。
经过这么多年的实践研究和探索,人们相信智能控制是缓解城市交通问题的强力工具。
课题研究范围及意义
本文利用单片机自动控制交通灯及时间倒计时显示的方法,将整个系统集成在单片机上,使产品具有成本低和轻便性的特点。
设计过程包括硬件电路和程序两大部分。
硬件电路其结构比较简单,主要包括核心器件ATC89C51单片机,12只二极管组成的模拟交通灯、复位电路、振荡电路、数码管显示模块。
单片机开发中不仅仅有硬件设计同样需要软件编程,我设计的系统用软件Keil来进行程序的编程。
相比硬件设计,软件部分设计较为复杂,需要同时考虑模拟红绿黄三色灯的控制、倒计时时间的显示、紧急情况下的紧急开关等问题。
并且还需要自己具有基本的C基础和应有的思维能力以及比较强的逻辑能力。
基于单片机的交通灯控制系统设计凸显了它的意义。
通过交通灯控制系统的设计,使我对C语言的编程有更深层次的认识,同时将理论同社会实践有效的结合一起,提高了自己的动手能力和思考能力。
1系统设计方案论证
1.1设计方案
方案一:
控制系统主要控制东西方向和南北方向交通状况,系统以单片机芯片STC89C51为主控单元,通过控制三种颜色LED的亮灭来来指导各车道的通行,上电时复位电路使系统进入运行状态。
总体设计框图如图1-1所示:
STC89C51
单片机
两段数码管倒计时显示电路
复位电路
图1-1方案一设计框图
方案二:
采用STC89C51单片机为控制器,采用2段数码管作为倒计时显示;
车道指示灯采用三色发光二极管,LED显示采用动态扫描,用来节省端口[2]。
用手动按键通过中断完成紧急情况下车辆的通行。
本方案中芯片端口刚好满足要求。
本方案电路设计简单,显示亮度高,耗电少,可靠性高,但是占用单片机资源太多,整个框图设计如图1-2所示:
图1-2方案二设计框图
方案三:
采用STC89C51单片机为主控单元,用单块LCD对东西方向和南北方向车道通行进行倒计时显示。
这种方案设计端口和硬件的需求最少,但是亮度太暗,所以较少采用。
对上述三种方案的优缺点分析可知,方案一最好。
1.2功能概述
在东西方向和南北方向的十字路口分别设立红黄绿交通指示灯,用数码管倒计时显示。
正常情况下两个主干线上的红黄绿灯进行转换。
红灯亮表示禁止通行,绿灯亮表示可以通行,每次绿灯变红灯前,黄灯亮5秒,方便那些未能及时通过十字路口的车辆能继续通过。
十字路口设立数码管具有倒计时功能,方便人们直观的把握通过时间。
本设计也考虑到紧急情况,当按下紧急模式按键后,四个方向红灯都会常亮。
对于夜晚车流量比较少,本设计设计了夜晚模式,按下按键后四个方向黄灯会常亮。
2系统硬件设计
2.1交通灯控制系统组成
2.1.1ATC89C51芯片
选用的ATC89C51与同系列的AT89C51在功能上有明显的提高,最突出是的可以实现在线的编程。
用于实现系统的总的控制。
其主要功能列举如下:
(1)为一般控制应用的8位单片机
(2)内部具有时钟振荡器
(3)内部程式存储器(ROM)为4KB
(4)内部数据存储器(RAM)为128B
(5)外部程序存储器可扩充至64KB
(6)外部数据存储器可扩充至64KB
(7)32条双向输入输出线,且每条均可以单独做I/O的控制
(8)5个中断向量源
(9)2组独立的16位定时器
(10)1个全双工串行通信端口
(11)单芯片提供位逻辑运算指令
ATC89C51各引脚功能介绍:
如图2-1
图2-1ATC89C51芯片
VCC:
ATC89C51电源正端输入,接+5V。
VSS:
电源地端。
XTAL1:
单芯片系统时钟的反向放大器输入端。
XTAL2:
系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英振荡晶体系统就可以动作了,此外可以在两个引脚与地之间加入一个20PF的小电容,可以使系统更稳定,避免噪声干扰而死机。
RESET:
AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
EA/Vpp:
"
EA"
为英文"
ExternalAccess"
的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。
因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。
如果是使用8751内部程序空间时,此引脚要接成高电平。
此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。
ALE/PROG:
ALE是英文"
AddressLatchEnable"
的缩写,表示地址锁存器启用信号。
ATAT89S51可以利用这个引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为ATAT89S51是以多工的方式送出地址及数据。
平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。
此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。
PSEN:
此为"
ProgramStoreEnable"
的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。
ATAT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。
PORT0(P0.0~P0.7):
端口0是一个8位宽的开路电极(OpenDrain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。
其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当作I/O用时可以推动8个LS的TTL负载。
如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。
设计者必须外加一个锁存器将端口0送出的地址锁住成为A0~A7,再配合端口2所送出的A8~A15合成一组完整的16位地址总线,而定位地址到64K的外部存储器空间。
PORT2(P2.0~P2.7):
端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。
P2除了当作一般I/O端口使用外,若是在ATAT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当作I/O来使用了。
PORT1(P1.0~P1.7):
端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LSTTL负载,同样地,若将端口1的输出设为高电平,便是由此端口来输入数据。
如果是使用8052或是8032的话,P1.0又当作定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发引脚。
PORT3(P3.0~P3.7):
端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。
其引脚分配如下:
P3.0:
RXD,串行通信输入。
P3.1:
TXD,串行通信输出。
P3.2:
INT0,外部中断0输入。
P3.3:
INT1,外部中断1输入。
P3.4:
T0,计时计数器0输入。
P3.5:
T1,计时计数器1输入。
P3.6:
WR:
外部数据存储器的写入信号。
P3.7:
RD,外部数据存储器的读取信号。
2.1.2交通灯控制系统构成
电路板一块,芯片ATC89C51一片,2段共阴极数码显示管四个,红黄绿发光二极管各四个,电阻若干,晶振一个,电容若干,按键若干。
交通灯控制系统结构框图2-2:
图2-2原理框图
系统各部分工作原理:
采用单片机的I/O口P0口通过上拉电阻和交通灯相连接,P3.0、P3.1口接到数码管控制位上,控制数码管的显示,程序放在ATC89C51单片机的ROM中来设置初始时间,在十字路口的四组红、黄、绿交通灯中,由单片机的P1.5-P1.7、P1.0-P1.2、P2.5-P2.7、P2.0-P2.2分别控制东西南北方向的三色灯。
由于交通灯为发光二极管并且阳极通过限流电阻和电源正极相连,因此I/O口输出低电平时,与之相连的指示灯才会点亮,然后通过数码管倒计时时间。
I/O口输出高电平时,相应指示灯会灭。
由于ATC89C51本身集成了看门狗指令,当系统出现异常的时候看门狗会发出溢出中断。
通过专用端口输出,引起RESET复位信号复位系统。
2.2各单元电路模块功能
2.2.1时钟电路模块
本时钟电路由一个晶体振荡器12MHZ和两个30pF的瓷片电容组成。
时钟电路用于产生单片机工作所需的时钟信号,而时序所研究的是指令执行中各信号之间的相互关系。
单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地工作[3]。
其电路如图2-3所示:
图2-3时钟电路模块
2.2.2复位电路模块
电容在上接高电平,电阻在下接地,中间为RST。
这种复位电路为高电平复位。
其工作原理是:
通电时,电容两端相当于是短路,于是RST引脚上为高电平,然后电源通过电阻对电容充电,RST端电压慢慢下降,降到一定程度,即为低电平,单片机开始正常工作[4]。
其电路如图2-4所示:
图2-4复位电路模块
2.2.3主控制系统模块
主控制器STC89C51单片机是推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
[5]主控制系统模块电路如图2-5:
图2-5主控置系统模块电路
2.2.4信号灯输出控制模块
道口交通灯指示采用红、黄、绿发光二极管进行提示。
其图如图2-6所示:
图2-6LED显示模块电路
2.2.5时间显示电路模块
本系统使用数码管完成倒计时显示功能。
以方向东西为为例,数码管显示的数值从绿灯的设置时间最大值往下减,每秒钟减1,一直减到0。
然后又从红灯的设置时间最大值往下减,一直减到0。
接下来又显示绿灯时间,如此循环。
系统共有4个二位的LED数码管,分别放置在模拟交通灯上方。
道口通行剩余时间采用红色7段数码管显示,采用共阴数码管,如用单片机P0口加上拉电阻驱动,P3.0/P3.1来控制数码管的位。
其显示电路如图2-7所示:
图2-7数码管显示模块电路
2.2.6系统电源模块电路
由于该系统中51单片机及二极管工作电压均为5V电压,所以要保证系统稳定可靠的工作,需要设计一个可以稳定提供5V电压的供电系统。
本设计采用外置3节5号电池作为系统的供电电源,该系统电源电路设计如图2-8所示:
图2-8系统电源电路
2.2.7按键输入模块
由于该系统具有夜间模式,紧急模式和交通灯倒计时时间设定功能,所有需要加上这些功能键,如下图2-9所示:
图2-9按键输入
夜间模式:
按下夜间模式按键进入,四方向红灯长亮,再次按下按键退出。
紧急模式:
按下紧急模式按键进入,四方向黄灯闪烁,再次按下按键退出。
设定倒计时时间:
按下设定键后,进入设定状态,先设定南北方向,再次按下按键设定东西方向,设定好后,按下按键退出,正常运行。
3系统软件设计
3.1软件总体流程图
软件总体设计及流程图见图3-1,主要完成各部分的软件控制和协调。
图3-1流程图
3.2延时的设定
3.2.1计数器初值计算
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。
他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。
因此,我可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC可得到如下计算通式:
TC=M-C
式中,M为计数器模值,该值和计数器工作方式有关。
在方式0时M为213;
在方式1时M的值为216;
在方式2和3为28;
算法公式:
T=(M-TC)T计数或TC=M-T/T计数
T计数是单片机时钟周期TCLK的12倍;
TC为定时初值
如单片机的主脉冲频率为TCLK12MHZ ,经过12分频
方式0 TMAX=213 ×
1微秒=8.192毫秒
方式1 TMAX=216 ×
1微秒=65.536毫秒
显然1秒钟已经超过了计数器的最大定时间,所以只有采用定时器和软件相结合的办法才能解决这个问题.
实现1秒的方法:
我采用在主程序中设定一个初值为20的软件计数器和使T1定时50毫秒。
这样每当T1到50毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程序。
在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。
为0表示1秒已到可以返回到输出时间显示程序。
3.2.2相应程序代码
(1)定时器的设置
定时器需定时50毫秒,故T1工作于方式1。
初值计算:
TC=M-T/T计数 =216-50ms/1us=15536=3CBOH
START:
MOVTMOD,#10H;
令TO为定时器方式1
MOVTH0,#3CH;
装入定时器初值
MOVTL0,#0BOH
SETBEA ;
打开总中断
SETBET1 ;
开T1中断
SETBER ;
启动T1计数器
CLRFLAG1
CLRFLAG2
CLRFLAG3
MOV R3, #20H ;
软件计数器赋初值
(2)相应中断服务子程序
ORG 001BH
LJMP DSD
ORG0030H
DSD:
INC R3
MOVTH0,#3CH;
重装入定时器初值
MOVTL0,#BOH
CJNER3,#20,FH
DECR0
DECR1
MOVR3,#00H
FH:
RETI
程序的软件延时:
我选单片机的工作频率为12MHZ。
机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12M)=1us。
可以知道具体每条指令的周期数,这样就可以通过指令的执行条数来确定1秒的时间。
具体的延时程序分析:
DELAY:
MOVR4,#08H延时1秒主程序
DE2:
LCALLDELAY1
DJNZR4,DE2
RET
DELAY1:
MOVR4,#00H;
延时125us子程序
D1:
MOVR5,#00H
D2:
DJNER5,DL2
DJNER4,D1
RET
DELAY1为一个双重循坏循环次数为256*256=65536所以延时时间=65536*2=131072us约为125us
DELAYR4设置的初值为8主延时程序循环8次,所以125us*8=1秒
(3)数码管动态显示
用于四个数码管的倒计时显示,代码如下:
sbitsmg1=P3^0;
//定义南北方向数码管低位
sbitsmg2=P3^1;
//定义南北方向数码管高位
sbitsmg3=P3^2;
//定义东西方向数码管低位
sbitsmg4=P3^3;
//定义东西方向数码管高位
voiddjsxs22()/4个数码管动态显示
{intb1,b2;
b1=djs1/10;
//将倒计时时间的高位赋予b1
b2=djs1%10;
//将倒计时时间的低位赋予b2
P0=table[b1];
smg1=0;
delayms(3);
smg1=1;
//显示b1
P0=table[b2];
smg2=0;
smg2=1;
//显示b2
smg3=0;
smg3=1;
smg4=0;
smg4=1;
}
voiddjsxs11()/4个数码管动态显示
b1=djs/10;
b2=djs%10;
//显示b1
//显示b2
利用对数字的拆分使数字分为十位和个位,比如31,利用程序inta=3