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

基于单片机的交通信号灯控制系统设计_交通信号灯程序编程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)
blank

相关推荐

  • Pycharm如何提交代码至github仓库配置操作步骤[通俗易懂]

    Pycharm如何提交代码至github仓库配置操作步骤[通俗易懂]需求:同Eclipse解决提交代码至github仓库初衷一致详细操作步骤如下:github创建准备提交的git地址:https://github.com/xxxxxxx/test.git打开pycharm,File–>settings–VersionControl–Github配置账户密码,根据习惯选择认证方式:创建demo项目,pycharm工具条选择VCS,右键选择共享项目…

  • Vue文件上传、下载

    Vue文件上传、下载代码示例:文件上传到接口,对接口返回的文件进行下载。<template><divclass=”hello”><h1>{{msg}}</h1><inputtype=”file”@change=”uploadFile($event)”accept=”.sql,.excel,.txt”/></div></template><script>exportdefau

  • Java的三种注释

    Java的三种注释Java基础是java初学者的起点,是帮助你从小白入门到精通必学基础课程!为初学者而著!Java300集>>>适合准备入行开发的零基础员学习Java,基于最新JDK13、IDEA平台讲解的,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。配套学习:Java初学者入门教程>>>Java注释:单行、多行和文档注释注释是对程序语言的说明,有助于开发者和用户之间的交流,方便理…

  • PHP程序员技术职业生涯,你是如何规划的?

    PHP程序员技术职业生涯,你是如何规划的?

    2021年10月23日
  • Linux top 命令详解

    Linux top 命令详解查看多核CPU命令 mpstat-PALL 和  sar-PALL  说明:sar-PALL>aaa.txt  重定向输出内容到文件aaa.txt top命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解。本文

  • java面试说我基础太差_面试官让你回去考虑考虑

    java面试说我基础太差_面试官让你回去考虑考虑很多小伙伴不知道像MyBatis和Hibernate这种ORM框架是如何实现的,今天,我们就手撸一个ORM框架,看看ORM框架到底是如何实现的!全程实战,建议收藏!

发表回复

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

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