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

基于单片机的交通信号灯控制系统设计_交通信号灯程序编程1、.设计任务交通信号灯控制系统:要求能显示剩余时间和控制红、黄、绿三色灯的显示。2、总体方案设计与方案论证(1)总体方案设计设计路口交通灯控制系统,使用LED显示单元的两组发光二极管(红黄绿)分别模拟十字路口的两组交通灯。a、南北路口的绿灯、东西路口的红灯同时亮20秒。数码管20秒倒记时显示。b、南北路口的黄灯亮5秒,同时东西路口的红灯继续亮。数码管5秒倒记时显示。c、南北

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1、设计任务

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

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

(1) 总体方案设计

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

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

(2) 方案论证

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

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

(1) 总框图
基于单片机的交通信号灯控制系统设计_交通信号灯程序编程
(2) 总体软件设计说明

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

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

(1) 接口电路逻辑图

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

(2) 硬件设计说明

8253芯片说明

	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芯片说明

	 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、局部程序框图及其设计说明

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

    首先,利用8253初始化,使其产生周期为一秒的脉冲,将主程序中规定的循环次数(即、秒数)在子程序中控制产生脉冲的个数,一个脉冲即为一秒。
    判断是否为一个脉冲,采用上升沿判断,出现一个上升沿即产生一个脉冲,循环次数减一,直到有n个脉冲,即已经过了n秒。
    紧急键的按下在延时过程中进行判断,如果按下,则循环判断紧急键的状态,并一直输出紧急状态的情况。当紧急键放开,则继续紧急前的状态继续延时。

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

	延时的剩余次数即为剩余时间,因此,只要将CX的值显示在数码管处即可达成显示时间的目的。
	CX中存有两位数,此时,将CX的值处以10,在AH和AL中分别得到余数(个位数字)和商值(十位数字)。
	让两位数字同时显示,则需要将两位数字分别在数码管的高低两位显示出来,并且不断循环显示,此时显示频率很快,肉眼看上去就是两位同时亮的状态。

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

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、系统功能与操作说明

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

8、总结

	这个设计是利用四种状态来表示两个路口的红绿灯状态,使用这样化整为零的方法,再利用8255对四种状态进行切换控制,使每种状态之间利用一个延时子程序先进行大概的延时,再利用8253进行对一秒钟的准确延时,利用循环的方式,循环十次为十秒,则完成了对每种信号灯状态的准确定时;为了解决AB口都被占用,而还需要输出口进行对数码管高低位选择的控制,则想到了使用C口的高四位进行该项操作,至于之后的紧急状态的设置,则靠C口的低四位进行输入控制,只需判断相应位置的状态便可以进行这一类的操作。
	整个实验最困难的地方就是最开始对四种状态的分析,世界上的任何事物总可以使用各种状态来表示,事物的变换规律也可以使用状态之间的转化来体现出来。我们可以将身边的事物转化为某种逻辑关系,这样就能实现各种功能的设备了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/190014.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python是什么?python能做什么?

    python是什么?python能做什么?人生苦短,我用python。python是什么?Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。python语言有以下特点:易于学习。Python有相对较少的关键字

  • U盘重装系统

    U盘重装系统U盘重装系统

  • 微信公众号平台开发教程_微信公众号制作教程

    微信公众号平台开发教程_微信公众号制作教程关键字:微信公众平台开发入门作者:贝创工作室原文:http://www.cnblogs.com/imaker/p/5491433.html背景知识:微信公众平台的开发需要有一定的PHP基础知识,PHP是一种HTML内嵌式的语言,广泛用于网站开发。微信服务器和开发者的服务器间有两种数据传输方式,分别是XML和JSON。其中XML主要用在接受发送普通消息和事件推送…

  • 沪市和深市有什么区别?

    沪市和深市有什么区别?1、板块不同:沪市只有主板与B股;深市有主板、中小板、创业板和B股。2、股票代码不同:沪市主板是60开头,B股是900开头;深市主板是000开头,中小板是002开头、创业板是300开头、B股是200

  • java过滤器Filter「建议收藏」

    java过滤器Filter「建议收藏」一、简介Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断如是否有权限访问页面等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、…

  • realm数据库使用

    realm数据库使用

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号