前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于单片机的交通信号灯控制系统设计_交通信号灯程序编程

基于单片机的交通信号灯控制系统设计_交通信号灯程序编程

作者头像
全栈程序员站长
发布2022-11-09 18:10:55
5640
发布2022-11-09 18:10:55
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

1、设计任务

代码语言:javascript
复制
	交通信号灯控制系统:要求能显示剩余时间和控制红、黄、绿三色灯的显示。

2、总体方案设计与方案论证

(1) 总体方案设计

代码语言:javascript
复制
	设计路口交通灯控制系统,使用LED显示单元的两组发光二极管(红黄绿)分别模拟十字路口的两组交通灯。

a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。
b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。
c、南北路口的红灯、东西路口的绿灯同时亮20秒。
d、南北路口的红灯继续亮、同时东西路口的黄灯亮5秒。
e、转(1)重复。(并能在此基础添加一些功能,如紧急开关按下,时间暂停,两组路口都显示红灯)

(2) 方案论证

代码语言:javascript
复制
	将交通灯的显示规律进行观察,发现有“红绿、红黄、绿红、黄红”四种状态,将交通灯的显示抽象为这四种状态的循环切换,如需产生不同的时间,只需将每种状态直接加入一个延时程序即可,为了更加准确的记录时间和显示剩余时间,我们觉得采用8253来控制一秒,循环执行十次就是十秒,二十次就是二十秒。这样便可以完成任务。
	由上论证可知,方案可行,可以进行具体设计和操作。

3、总框图及总体软件设计说明

(1) 总框图

基于单片机的交通信号灯控制系统设计_交通信号灯程序编程
基于单片机的交通信号灯控制系统设计_交通信号灯程序编程

(2) 总体软件设计说明

代码语言:javascript
复制
a、通过8253计数,每1s输出一个脉冲,刷新10次,持续十秒钟,重复减一直至零为止;
b、8255的C口低四位作为输入输出端口,C口高四位控制某个数码管显示,B口控制数码管显示值,A口控制交通灯;
c、交替选中数码管的高低位码,计数的同时数码管显示数字,并且交通灯亮;
d、8253锁存并读数进行;
e、计数至零时状态转换,数码管重新显示下一状态的数字,交通灯转换至下一状态;       
f、重复上述过程,使交通灯的四个状态不断循环秒钟;

4、接口电路逻辑图及硬件设计说明,或系统资源使用说明

(1) 接口电路逻辑图

基于单片机的交通信号灯控制系统设计_交通信号灯程序编程
基于单片机的交通信号灯控制系统设计_交通信号灯程序编程

(2) 硬件设计说明

8253芯片说明

代码语言:javascript
复制
	8253有3个独立的16位计数器,有6种工作方式。
	利用8253的减法计数器原理,每送来一个脉冲就减1,减到0产生一个定时信号输出。
	因为计数频率为2MHz,计数器的最大数值为65536,所以最大的定时时间为0.5us*65536=32.768ms,达不到1S的要求,因此需要用两个计数器级联来解决问题。
	将2MHz的的时钟信号直接加在CLK0输入端,并让计数器0工作在方式2,选择计数初始值为5000,则从out0端可得到2MHz/5000=400Hz的脉冲,周期为0.25ms。再将该信号连到CLK1输入端,并使计数器1工作在方式2下,为了使out1输出周期为20s的波形,所以取时间常数为400.然后由out1输出到8255的PC0上,通过上升下降沿来判断1s是否结束。

8255芯片说明

代码语言:javascript
复制
	 8255A可为外设提供3个8位I/O端口,即A口,B口,C口,每个端口又可分两组编程,能工作于3种操作模式。
	该实验使用8255A来作为输入输出的控制操作,将C口分为上下口,分别由A,B口控制。PC0用来接收8253的out1输出的信号,通过沿来判断是否完成1S计时。PC1用来判断有无紧急键按下,若为高电平则是紧急状态,使四个路口的红灯都亮。
	C口的高四位用来控制数码管的显示位数,测试知数码管为低电平有效,当状态控制字分别为1101,1110时对应的第二位和第一位亮。然后进行循环。
	A口作为输出端连接到发光二极管上,通过接收状态控制字来显示对应的灯。
	B口也是作为输出端按顺序连接到数码管的LA,B,C,D,E,F,G,H上。

5、局部程序框图及其设计说明

基于单片机的交通信号灯控制系统设计_交通信号灯程序编程
基于单片机的交通信号灯控制系统设计_交通信号灯程序编程
代码语言:javascript
复制
    首先,利用8253初始化,使其产生周期为一秒的脉冲,将主程序中规定的循环次数(即、秒数)在子程序中控制产生脉冲的个数,一个脉冲即为一秒。
    判断是否为一个脉冲,采用上升沿判断,出现一个上升沿即产生一个脉冲,循环次数减一,直到有n个脉冲,即已经过了n秒。
    紧急键的按下在延时过程中进行判断,如果按下,则循环判断紧急键的状态,并一直输出紧急状态的情况。当紧急键放开,则继续紧急前的状态继续延时。
基于单片机的交通信号灯控制系统设计_交通信号灯程序编程
基于单片机的交通信号灯控制系统设计_交通信号灯程序编程
代码语言:javascript
复制
	延时的剩余次数即为剩余时间,因此,只要将CX的值显示在数码管处即可达成显示时间的目的。
	CX中存有两位数,此时,将CX的值处以10,在AH和AL中分别得到余数(个位数字)和商值(十位数字)。
	让两位数字同时显示,则需要将两位数字分别在数码管的高低两位显示出来,并且不断循环显示,此时显示频率很快,肉眼看上去就是两位同时亮的状态。

6、源程序清单(详细注释)

代码语言:javascript
复制
CODE SEGMENT
ASSUME CS:CODE
START:MOV AX,CS
MOV DS,AX
MOV DX,203H			;8255初始化,连接端口IOY0
MOV AL,10000001B		;A口输出接LED,B口输出接数码管,C0~C3输入,C4~C7输出
OUT DX,AL
CALL INITIAL_8253		;8253初始化
A1:   MOV DX,200h   		;8255的A口接
MOV AL,01101111B  	;东西红,南北绿
OUT DX,AL         	;将灯状态传送给LED显示
MOV CX,20       		;计时20秒
CALL action
MOV DX,200h   		;东西红,南北黄     
MOV AL,01111011B
OUT DX,AL
MOV CX,5         	;计时5秒
CALL action
MOV DX,200h			;东西绿,南北红   
MOV AL,10011111B
OUT DX,AL
MOV CX,20     		;计时20秒
CALL action  
MOV DX,200h   		;东西黄,南北红    
MOV AL,10110111B
OUT DX,AL
MOV CX,5        		;计时5秒
CALL action
JMP A1            	;循环到状态A1,即东西红,南北绿
EXIT: MOV AH,4CH
INT 21H
action PROC
PUSH AX
PUSH DX
PUSH CX
mov ah,al					;保存紧急状态前的路灯的状态	
LOOP2:
mov dx,202h
in al,dx
test al,02h				;判断c口倒数第二位是否有状态
JnZ L1 					;无紧急状态         
;有紧急键则转到紧急键处理
CALL DISP				;显示当前时间  
mov dx,200h
mov AL,00111111B		;路口都显示红灯
out dx,al
JMP LOOP2
L1:	  mov dx,200h
mov al,ah
out dx,al
CALL DISP
L2:   MOV DX,202h				;检测1s是否计完
wait1:
CALL DISP
IN AL,DX
TEST AL,01H
JZ wait1                	;若1s没计数完,继续    
wait2:
CALL DISP
IN AL,DX
TEST AL,01H
JNZ wait2   
LOOP LOOP2             ;20s或5s计数完全?若没计数完,继续
POP CX
POP DX
POP AX
RET 
action ENDP
INITIAL_8253  PROC          ;8253初始化,1s
PUSH AX
PUSH DX
mov al,00110101B
mov dx,20Bh
out dx,al
mov al,00h
mov dx,208h
out dx,al
mov al,50h
mov dx,208h
out dx,al
mov al,01110101B
mov dx,20Bh
out dx,al
mov al,00h
mov dx,209h
out dx,al
mov al,04h
mov dx,209h
out dx,al
POP DX
POP AX
RET
INITIAL_8253 ENDP
time1 PROC near
lea di,time
lea si,x1
MOV CX,2
MOV AL,11101111b  		;AL=DFH 1101 1111  控制 Y1~Y5 循环点亮
MOV [si],AL      
l31:	    mov dx,202h
mov al,0ffh
out dx,al
MOV DX,201H	   		;B口输出段码
MOV AL,[DI]
OUT DX,AL	 
INC DI		
MOV AL,[si]
MOV DX,202H    		;c口输出
OUT DX,AL
ROl byte ptr[si],1			;循环左移一位   
loop l31
RET
time1 ENDP
DISP PROC                  	 	;数码管显示
PUSH AX
PUSH BX
PUSH DX
PUSH CX		
lea di,time
MOV AX,CX
MOV CL,0AH  			;将CL中16进制数转化为十进制数
DIV CL
MOV BX,OFFSET table1
XLAT
mov [di],al
inc di
mov al,ah
MOV BX,OFFSET table1
XLAT
mov [di],al			
call time1		
POP CX
POP DX
POP BX
POP AX
RET
DISP ENDP
table1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH  
time db 2 dup(?)
x1 db ?
code ends
end start

7、系统功能与操作说明

代码语言:javascript
复制
a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。
b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。
c、南北路口的红灯、东西路口的绿灯同时亮20秒。
d、南北路口的红灯继续亮、同时东西路口的黄灯亮5秒。
e、转a循环
f、期间,紧急开关按下,时间暂停,两组路口都显示红灯;紧急开关拨起,继续暂停前的状态继续

8、总结

代码语言:javascript
复制
	这个设计是利用四种状态来表示两个路口的红绿灯状态,使用这样化整为零的方法,再利用8255对四种状态进行切换控制,使每种状态之间利用一个延时子程序先进行大概的延时,再利用8253进行对一秒钟的准确延时,利用循环的方式,循环十次为十秒,则完成了对每种信号灯状态的准确定时;为了解决AB口都被占用,而还需要输出口进行对数码管高低位选择的控制,则想到了使用C口的高四位进行该项操作,至于之后的紧急状态的设置,则靠C口的低四位进行输入控制,只需判断相应位置的状态便可以进行这一类的操作。
整个实验最困难的地方就是最开始对四种状态的分析,世界上的任何事物总可以使用各种状态来表示,事物的变换规律也可以使用状态之间的转化来体现出来。我们可以将身边的事物转化为某种逻辑关系,这样就能实现各种功能的设备了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月24日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档