基于AT89C51的交通灯控制系统
作品设计、发明的目的和基本思路
随着我国经济的高速发展,人们对各种交通车辆的需求量不断增大,城市的交通拥护问题日益严重,目前,大部分城市的十字路口的交通控制灯,通常的做法是:事先经过车辆流量的调查,利用传统的方法设计好红绿灯的延时,然而,实际上的车流量是不断变化的,有的路口在不同的时间段车流量的大小甚至有很大的差异,所以说,统计的方法己不能适应迅速发展的交通现状。
目前,国内的交通灯一般设在十字路门,在醒目位置用红、绿、黄三种颜色的指示灯。加上一个倒计时的显示计时器来控制行车。对于一般情况下的安全行车,车辆分流尚能发挥作用,但根据实际行车过程中出现的情况,还存在以下缺点:1.两车道的车辆轮流放行时间相同且固定, 在十字路口,经常一个车道为主干道,车辆较多,放行时间应该长些;另一车道为副干道,车辆较少,放行时间应该短些。2.没有考虑紧急车通过时,两车道应采取的措施,臂如,消防车执行紧急任务通过时,两车道的车都应停止,让紧急车通过。
本系统是以AT89C51单片机作为控制系统的核心,模拟定周期交通信号灯的工作状态。并采用PROTEUS进行仿真,仿真结果满足预期性能要求。
设计内容和要求:
利用AT89C51单片机设计一十字路口交通灯控制系统。
1:系统由单片机系统、数码管显示、交通灯演示系统组成。
2:具有人行道、左转、右转,以及基本的交通灯的功能。
3:具有数码管倒计时功能。
4:要求甲乙车道的车辆交替运行,每次通行为60秒。为绿灯的车道先显示40秒的直行,再显示20秒的左行。
5:要求黄灯先亮四秒,才能变换车道,黄灯亮时要求闪亮。
硬件设计
控制流程分析:
(1)从十字路口交通灯示意图1分析可知:东西、南北方向信号灯控制是中心对称的,即无论是主干道还是支干道两侧系统对同方向的信号灯控制是同步的。
(2)从示意图分析可知,人行道各个方向,系统对两侧的信号灯的控制也是同步的,且人行道的红绿灯变化和行车道的红绿灯变化应该是一致的。
(3)通过上面的分析,可以采用单片机的p0-p3口及r0到r7寄存器配合来实现控制发光二极管灯和数码管。
系统的硬件设计
本系统选用通过P0到p3口 用做输出显示控制口。P0口用作输出南北方向led数码管字符编码,P1口用作输出东西方向led数码管字符编码。P2 口用于输出东西、南北方
面LED数码管的位选信号,以及各个人行道发光二极管的控制信号的输出。P3口用于输出东西、南北方向信号灯控制信号。
LED数码管采用动态显示方式实现倒计时读秒,并且本系统的了led采用的是LED的共阳极接法,共阳极接法如图2所示:
共阳极7段LED显示字型编码表(表一):
LED动态显示,在多位LED显示时,为了简化电路,降低成本,将段选位并联在一起,由一个八位的I/O口控制,而位选由另一个口控制, 段选码、位选码每次送入后演示1ms,而人的视觉暂留时间为0.1s,所以在人看来数码管一直亮着,从而在应用中通过动态扫描的方法显示。
交通灯的正常显示
交通灯系统的工作状态:
上电后,南北方向数码管显示40,东西方向数码管显示60,南北方向的直行绿灯亮,车辆可以直行可以右行,人行红灯亮行人不能通过;东西方向红灯亮车辆不能通行,人行绿灯亮人可以通行。当南北数码管显示为4时,直行绿灯熄灭,黄灯闪烁4秒,然后南北数码管显示20,左转绿灯亮车辆可以左行,人行灯和东西方向灯同上一状态,当数码管减到四时南北黄灯闪烁4秒,然后红灯亮,数码管显示60,南北车辆禁止通行,人行绿灯亮;南北数码管显示60的同时东西数码管显示40,直行绿灯亮,车辆可以直行可以右行,人行红灯亮,当东西数码管显示为4时,直行绿灯熄灭,黄灯闪烁4秒,然后东西数码管显示20,左转绿灯亮车辆可以左行,人行灯和南北方向灯同上一状态,当数码管减到4时东
西黄灯闪烁4秒,然后红灯亮,东西数码管显示60,南北显示40,随后依次循环……
交通灯原理图:
软件设计:
根据设计要求有汇编语言编写的交通灯源程序如下:
ORG 0000H ;主函数地址
LJMP MAIN
ORG 000BH ;中断定时器0地址
LJMP INTERPUT
ORG 0030H ;表的首地址
LJMP TABLE
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
MAIN:
MOV P2, #00H ;给P2口赋初值,让数码管刚开始都不亮
MOV R2, #60 ;给R2赋60,使东西的数码管显示初值为60
MOV R3, #40 ;给R3赋40,使南北的数码管显示初值为40
MOV P3, #0 ;使人形道的灯初始都不亮
MOV R5, #0 ;给R5,R6赋初值0
MOV R6, #0
MOV TMOD, #01H ;定时器0工作方式1
MOV TH0, #79 ;给定时器赋初值
MOV TL0, #0AEH
SETB EA ;允许总中断
SETB ET0 ;开启定时器0中断
SETB TR0 ;开启定时器计时
L2:
LCALL DISPLAY1 ;显示东西数码管
LCALL DISPLAY2 ;显示南北数码管
LCALL CHOOSE1 ;调用东西判断函数
LCALL CHOOSE2 ;调用南北判断函数
SJMP L2 ;一直循环
INTERPUT:
MOV TH0, #22H ;定时器中断里重现给定时器0赋初值
MOV TL0, #0D8H
MOV A, R4
INC R4 ;定时器中断一次50MS,中断一次R4+1
CJNE A, #20,L3 ;判断是不是加到20了,即定时器定时1S
MOV R4, #0 ;R4加到20,则清0
DEC R3 ;要是定时1S到了,则把R2,和R3的值都减1
DEC R2
L3:
RETI ;中断退出
CHOOSE1: ;东西判断函数
MOV A, R5 ;热是一个标志
CJNE A, #1, K1 ;判断R5是不是等于1,不等于1跳到K1
MOV A, R2 ;要是标志位等于1
CJNE A, #4, K5 ;而且R2等于4,则开启黄灯,关闭车道绿灯
SETB P3.2
CLR P3.3
SJMP K3
K5: JNC K3 ;要是R2小于4则闪烁绿灯
CPL P3.2
MOV A, R2
CJNE A, #0, K3 ;判断R2是不是等于0,
INC R5 ;等于0则让标志位+1
CLR P3.2 ;清黄灯,开车道的左行绿灯,置人行道红灯
SETB P3.0
MOV R2, #20
SETB P2.6
CLR P2.7
SJMP K3
K1: JNC K2 ;CJNE这个指令比较好R5和1的值,要是R5大于1,则C=0,
反之C=1,这里判断C是否等于0,既判断是否小于1,小于1执行下行,大于1则跳转K2
MOV A, R2
CJNE A, #60, K7 ;初值状态R2是60,判断R2是不是60,60的话开车道的红灯,开人行道的绿灯
SETB P3.1
SETB P2.7
CLR P2.6
SJMP K3 ;退出
K7: CJNE A, #0, K3 ;要是R2不等于60,判断R2是不是等于0,等于0则把
标志位R5加1,让车道绿灯亮,红灯灭,人行道红灯亮
INC R5
CLR P3.1
SETB P3.3
MOV R2, #40 CLR P2.7
SETB P2.6
SJMP K3 K2: MOV A, CJNE A, #4, K6 是不等于是,则跳到K6
CLR P3.0
SETB P3.2
SJMP K3
K6: JNC K3 出
;再给数码管赋初值
;退出
R2 ;标志位R5大于1则跳到这里
;判断R2和4的值,等于4则开启黄灯,关闭车道的绿灯,要
;判断R2是不是小于4,小于4则闪烁黄灯,大于4则直接退
CPL P3.2 ;取反
MOV A, R3
CJNE A, #0, K3 ;判断R2是不是等于0
MOV R5, #0 ;等于0则清标志位,因为我们只设置了0.1.2这三个状态,到2了以后要清0,让他重新开始循环
MOV R2, #60 ;给R2赋初值,开车道红灯,关车道左行绿灯,开人行道绿灯,关人行道红灯
SETB P3.1
CLR P3.2
SETB P2.7
CLR P2.6
K3: RET
CHOOSE2: ;南、北判断函数,程序和东、西判断一致,这里就不写注释了
MOV A, R6
CJNE A, #1, H2
MOV A, R3
CJNE A, #4, H6
SETB P3.6
CLR P3.4
SJMP H3
H6: JNC H3
CPL P3.6
CJNE A, #0, H3
INC R6
CLR P3.6
SETB P3.5
MOV R3, #60
SETB P2.4
CLR P2.5
SJMP H3
H2: JNC H4
MOV A, R3
CJNE A, #40,H7
SETB P3.7
SETB P2.5
CLR P2.4
SJMP H3
H7: MOV A, R3
CJNE A, #4, H5
SETB P3.6
CLR P3.7
SJMP H3
H5: JNC H3
CPL P3.6
CJNE A, #0, H3
SETB P3.4
CLR P3.6
INC R6
MOV R3, #20
SETB P2.5
CLR P2.4
SJMP H3
H4:
MOV A, R3
CJNE A, #0, H3
SETB P3.7
CLR P3.5
MOV R6, #0
MOV R3, #40
SETB P2.5
CLR P2.4
H3: RET
DISPLAY1: MOV A, R2 MOV B, #10
DIV AB ;显示东西数码管(动态显示)
;将R2放到A中
;将2位的10进制数的十位和个位分开
MOV DPTR, #TABLE ;取TABLE表的首地址给DPTR
MOVC A, @A+DPTR ;把表的第N个数据给A
MOV P1, A ;把数据送到数码管中
SETB P2.0 ;显示数码管
LCALL DELAY ;延时
CLR P2.0 ;把数码管暗掉
MOV A ,B ;把个位给A
MOVC A, @A+DPTR ;把表的个位个数给A
MOV P1, A ;把数据送到数码管中
SETB P2.1 ;显示数据
LCALL DELAY ;延时
CLR P2.1 ;让数码管暗掉
RET
DISPLAY2: ;显示南北数码管(显示函数和上面一样,这里注释就不写了)
MOV A, R3
MOV B, #10
DIV AB
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV P0, A
SETB P2.2
LCALL DELAY
CLR P2.2
MOV A, B
MOVC A, @A+DPTR
MOV P0, A
SETB P2.3
LCALL DELAY
CLR P2.3
RET
DELAY: ;延时函数
MOV R0, #20
L1: MOV R1, #25
DJNZ R1, $
DJNZ R0, L1
RET
END
电路的仿真:
因篇幅问题不能全部显示,请点此查看更多更全内容