微机原理交通灯设计

一、设计要求

1、东西方向和南北方向交替准行控制东西方向准行时,东西方向上的绿灯亮,南北方向红灯亮,经过一段时间后,南北方向准行,南北方向上的绿灯亮,东西方向红灯亮,如此交替。各方向信号灯顺序为:红→绿→黄→红→绿→黄…,某一方向红灯亮的时间等于另一方向绿灯和黄灯亮的时间之和。
2、各方向红、绿灯亮的时间为6~99秒(可灵活的任意设定),以满足不同交通路口的需要。
3、当准行时间倒计时到最后3秒时,准行方向上绿灯灭,同时该方向的黄灯变为闪烁。
4、各方向要有两位数码管分别显示准行时间或禁行时间,并以秒倒计时。
5、设置功能按键,
1)在发生交通事故时,东西方向和南北方向同时禁行。
2)强制东西方向通行。
3)强制南北方向通行。
4)恢复正常交替通行。
5)改变通行时间。

二、系统设计方案

(一)实验原理
主程序主要用于初始化和倒计时数码管显示以及部分键盘扫描。用8254在8086的CLK0下分频产生1HZ的信号,8259采用上升沿实现倒计时数据减一以及状态切换。矩阵键盘与数码管分时处理,键盘采用扫描法读取键值。采用8255实现6路LED的驱动以及数码管的显示。
(二)实验设备
实验设备:PC机一台、Wmd86编译器、TD-PITE实验装置一套
实验器件:
1、8255-键盘扫描、数码显示和LED驱动(用于检测按键、数码管显示当前倒计时数以及LED的控制);
2、8254-定时/计时单元(产生1HZ的信号,上升沿触发中断);
3、8259-中断控制(用于秒数的减一,led灯的切换和状态机的运行)。
(三)实验方法
在设计过程中,先进行分模块设计、待各模块设计调试完好后进行整合,能有效提高整体效率,加快设计进程。
在设计过程中,先对键盘扫描单元进行单独的测试,主要是参考例程。接下来设计倒计时,先达到能倒计时显示的目的,然后再加入状态机,实现基本的红绿灯功能。在完成红绿灯的基本设计后加入三个紧急开关,实现东西南北禁止通行,东西禁止通行和南北禁止通行。在完成三个紧急开关的设计后,加入设置红绿黄三灯时间的功能,到这里就已经完成了实验设计的基础要求,最后再加上一个电路的总开关,用软件控制,按下总开关按键之后数码管才会显示。
在这里插入图片描述

三、硬件设计

1、总体电路
由于之前采用了Proteus进行了倒计时的仿真,因此电路图用Proteus的形式给出,给出的电路是按照实验箱用户手册设计的。
在这里插入图片描述

(一)键盘扫描及数码管显示单元
8255的B口用来连接数码管的数据口,C口低四位用来控制4个数码管的选通以及键盘的列选通,C口高四位用来扫描按键,判断是哪个按键按下。本次设计中有两路显示倒计时,每路两位数字,对应PC0PC3这4个引脚,X5与X6是用来在设置红绿黄灯时间时显示数据的,与8255A的PA0PA1相连。其硬件电路连接如下图所示。
在这里插入图片描述
在这里插入图片描述

(二)8254定时单元
8254无法一次完成1000*1000的分频,因此采用课本上的方法,通道0先分频1000,通道1再分频1000,实现1MHZ/10^6=1HZ信号的产生。仿真图中LED灯实际上并没有接入,这里接入只是为了便于仿真的时候观测有没有1HZ信号输出。
在这里插入图片描述

(三)8259中断单元
这一部分电路在实际上并不需要自己接。
在这里插入图片描述

(四)LED驱动单元
仿照试验箱设计,LED为高电平点亮。LED_EWR、LED_EWG、LED_EWY分别表示东西方向红灯、绿灯、黄灯;LED_SNR、LED_SNG、LED_SNY分别表示南北方向红灯、绿灯、黄灯;
在这里插入图片描述

四、软件设计

1、主程序
主程序主要进行各芯片初始化、数码管的显示、按键1~5的扫描以及总开关的打开。
按下12号按键启动系统,东西方向和南北方向交替通行,为一般红绿灯规律,红绿两灯的时间设置范围为699(可自己修改),黄灯时间设置范围为25S(可自己修改)。4x4的矩阵键盘对应功能如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、IRQ7中断
检测到输入了一个正脉冲,则进入IRQ7中断,实现CNT+1,还有就是变换STATE和LED的赋值。
EWG_SNR:东西方向绿灯,南北方向红灯
EWY_SNR:东西方向黄灯,南北方向红灯
EWR_SNG:东西方向红灯,南北方向绿灯
EWR_SNY:东西方向红灯,南北方向黄灯

在这里插入图片描述

五、遇到的问题及分析解决
①下载程序是老是下载不进去,后面通过系统复位就可以了。
②在调试按键时,原本按一下实现加减一的操作,但是实际上会加减很多次,这是因为按键的机械抖动,加入延时消抖后即可解决。
③数字显示时,之前尝试用BCD压缩去显示,发现不行,之后尝试利用除10操作得到数值的个位和十位,分别显示,效果比较好。
④在没有设置红绿黄灯的时间时,最后两位数码管也会亮,查看硬件连接图后发现在LED赋值时低两位一直赋值为00,修改为11后解决。
六、实验总结与心得体会
由于之前对微机原理的程序设计掌握得并不是很牢固,所以通过这次设计可以说是基本掌握得简单得汇编设计技巧。其实汇编与其他语言都是一样的,逻辑都还是那样,只是实现的方法不同而已,所以我习惯与先用if-else语句先罗列出大概的思路,然后用汇编去实现。鉴于之前的经验,这次没有一开始就把全部的程序写完,而是选择了分开写,最后汇总在一起再优化的方法,这样做也是为了方便查错。对于仿真,我认为很有必要去做,一来可以熟悉Proteus和emu8086等软件,二来是因为设计一个8086最小系统也是比较有意义的,尤其是地址IOY0、IOY1、IOY2的设计。虽然只做倒计时的仿真,但收获还是很多。

;------------------------------------------------------------------
;Function: (tip:配套SCNU微机原理实验箱)
;微机原理红绿灯设计,按下12号按键启动系统,东西方向和南北方向交替通行,
;为一般红绿灯规律,红绿两灯的时间设置范围为6~99(可自己修改),黄灯时间设置范围为2~5S(可自己修改)
;按键对应功能:矩阵键盘,对应原理图看
;----------------------------------------------------------------------------------------------------------------------------
;-  (东西南北禁止通行)                   (恢复正常)                    (东西禁止通行)             (南北禁止通行)
;y  (设置时间启动)                     (设置红灯时间)                    (设置绿灯时间)          (设置黄灯时间)
;(选择设置哪种灯后按下则增加1)(选择设置哪种灯后按下则减少1)     (结束选中设定时间的灯)       (设置时间结束,恢复计时)
;-  ()                                       ()                               ()                 (启动系统)
;-------------------------------------x轴------------------------------------------------------------------------------------
DATA	SEGMENT		;数据段		
      ;此处输入数据段
      LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
          
      IOY0 EQU  0600H;8255地址,对应IOY0
      IOY1 EQU  0640H;8254地址,对应IOY1
      IOY2 EQU  0650H;仿真用于8259,试验箱不用
      PORTA EQU IOY0
      PORTB EQU IOY0+02H
      PORTC EQU IOY0+04H
      CS8255 EQU IOY0+06H
      ; A口工作方式0 输入  B口工作方式0 输入 
      REGIS EQU 88H;AB口方式0,全为输出,C口高四位输入,低四位输出 
      
      CS8253 EQU IOY1+06H
      TRANAL0 EQU IOY1
      TRANAL1 EQU IOY1+02H
      
      
      ICW1 EQU  20H;0620H
      
      ICW2 EQU 21H;0622H
      ICW3 EQU 21H;0622H
      ICW4 EQU 21H;0622H 
      
      OCW1 EQU 21H;0622H
      OCW2 EQU 20H;0620H
      OCW3 EQU 20H;0620H
      
      CNT DB 15;倒计时变量
      CNT_TEMP DB 15H;锁存所有当前状态的变量
      TIME_OF_RED_LED DB 10;初始红灯时间
      TIME_OF_GREEN_LED DB 15;初始绿灯时间
      TIME_OF_YELLOW_LED DB 3;初始黄灯时间
      BREAK DB 00H;用于跳出按键5的设置时间状态
      STATE DB 00H;00H--EWG-SNR;01H--EWG-SNY;10H--EWR-SNG;11H--EWY-SNG

DATA	ENDS

EXTRA	SEGMENT	;	;附加段
 
 
 
EXTRA	ENDS
;


STACK	SEGMENT  PARA  STACK  'STACK'  ;堆栈段
STAPN	DB     500 DUP (00H)	;定义100字节空间
TOP	EQU  LENGTH  STAPN
STACK	ENDS
           
 
           
CODE	SEGMENT			
MAIN	PROC   FAR			;过程定义语句
				;说明4个段寄存器分别与哪些段有关
		ASSUME  CS:CODE, DS:DATA,ES:EXTRA,SS:STACK
 
START: 

		
        MOV AX,DATA
        MOV DS,AX    
        
        MOV AX, EXTRA
        MOV ES,AX
        
        MOV AX,STACK
        MOV SS,AX
        
        ; 此处输入代码 
        ; 初始化8255
        MOV DX,CS8255
        MOV AL,REGIS
        OUT DX,AL
        ;初始化8253,产生1HZ信号
        MOV AL,00110101B;  
        MOV DX,CS8253  
	    OUT DX,AL  
	    MOV AL,00  
	    MOV DX,TRANAL0
	    OUT DX,AL
	    MOV AL,10H     
	    MOV DX,TRANAL0
	    OUT DX,AL
	    
        MOV AL,01110110B     
        MOV DX,CS8253 
        OUT DX,AL
        MOV AL,0E8H        
        MOV DX,TRANAL1
        OUT DX,AL
        MOV AL,03H  
        MOV DX,TRANAL1 
        OUT DX,AL               
        
        
	    
NOT_BEGIN:
		;(X4,Y4)12,对应右下角按键,按下才能正常启动系统
		MOV DX,PORTC
		MOV AL,00000111B 
		OUT DX,AL
		IN AL,DX
		AND AL,0F0H
		CMP AL,01110000B
		JNZ NOT_BEGIN
		JMP BEGIN 
BEGIN:	
        ; 显示计数的初始值
        MOV BX, OFFSET LED
        MOV AL,CNT
        XLAT
        
        MOV DX,PORTB
        OUT DX,AL
        
        ;8259 初始化
        
        MOV DX,ICW1
        MOV AL, 11H;00010011B
        OUT DX,AL
        
        MOV DX,ICW2
        MOV AL,08H;003CH
        OUT DX,AL
        
       
        MOV DX,ICW4
        MOV AL,01H;00000001B
        OUT DX,AL
        
        MOV DX,OCW1
        MOV AL,6FH;11111000B
        OUT DX,AL 
        
        ;定义中断向量表
        MOV AX,00H
        MOV ES,AX
        
        MOV BX, 003CH
        MOV AX,OFFSET INT0 
        MOV ES:[BX],AX 
        
        MOV AX,CS
        MOV ES:[BX+2],AX   
        STI
       ;数码管片选
CS_CONTRO:     
         XOR AX,AX;需要清零
         MOV AL,CNT    
         MOV BL,10
         DIV BL  ;除以10,十位在AL,个位在AH,注意只有AL能OUT
         ;十位显示
         MOV BX,AX
         MOV DX,PORTC 
         MOV AL,00001010B;两个1代表两个十位,东西方向和南北方向的数码管显示是一样的
         OUT DX,AL  
         MOV AX,BX              
         MOV BX,OFFSET LED
         XLAT          
         MOV DX,PORTB
         OUT DX,AL  
         CALL delay10ms 
         CALL CLEAR;记得清屏里要延时
         ;个位显示 
         MOV BX,AX
         MOV DX,PORTC
         MOV AL,00000101B   
         OUT DX,AL
         MOV AX,BX
         MOV AL,AH
         MOV BX,OFFSET LED
         XLAT          
         MOV DX,PORTB
         OUT DX,AL                     
         CALL delay10ms
         CALL CLEAR
         ;键盘扫描,扫描1~5按键,6~12按键在按键5中扫描,为嵌套扫描
         ;(X1,Y1)
         MOV DX,PORTC
         MOV AL,00001110B 
         OUT DX,AL
         IN AL,DX
         AND AL,0F0H
         CMP AL,11100000B
         JNZ KEY_Y1_X1_NO
         CALL KEY_Y1_X1_YES
KEY_Y1_X1_NO:         
		 ;(X2,Y1)
         MOV DX,PORTC
         MOV AL,00001101B 
         OUT DX,AL
         IN AL,DX
         AND AL,0F0H
         CMP AL,11100000B
         JNZ KEY_Y1_X2_NO
         CALL KEY_Y1_X2_YES        
KEY_Y1_X2_NO:            
         ;(X3,Y1)
         MOV DX,PORTC
         MOV AL,00001011B 
         OUT DX,AL
         IN AL,DX
         AND AL,0F0H
         CMP AL,11100000B
         JNZ KEY_Y1_X3_NO
         CALL KEY_Y1_X3_YES
KEY_Y1_X3_NO:         
		 ;(X4,Y1)
         MOV DX,PORTC
         MOV AL,00000111B 
         OUT DX,AL
         IN AL,DX
         AND AL,0F0H
         CMP AL,11100000B
         JNZ KEY_Y1_X4_NO
         CALL KEY_Y1_X4_YES        
KEY_Y1_X4_NO:
         ;(X1,Y2)
         MOV DX,PORTC
         MOV AL,00001110B 
         OUT DX,AL
         IN AL,DX
         AND AL,0F0H
         CMP AL,11010000B
         JNZ KEY_Y2_X1_NO
         CALL KEY_Y2_X1_YES
KEY_Y2_X1_NO:         
        JMP CS_CONTRO
        
        
        
  L1:
       JMP L1      
        
   
        
        RET
MAIN	ENDP		;MAIN过程结束

;按键1
KEY_Y1_X1_YES PROC
CLI
PUSH AX
PUSH DX
CALL DELAY_FOR_KEY
MOV AL,CNT
MOV CNT_TEMP,AL
MOV AL,88
MOV CNT,AL
;状态不会变,不需要锁存
MOV DX,PORTA
MOV AL,10010000B
OUT DX,AL

;MOV DX,PORTC
;MOV AL,0F0H
;OUT DX,AL

POP DX
POP AX
RET
KEY_Y1_X1_YES ENDP


;按键2
KEY_Y1_X2_YES PROC
PUSH AX
PUSH DX
CALL DELAY_FOR_KEY
MOV AL,CNT_TEMP
MOV CNT,AL
STI

POP DX
POP AX
RET
KEY_Y1_X2_YES ENDP


;按键3--东西方向强行通车,南北方向禁止通车
KEY_Y1_X3_YES PROC
CLI
PUSH AX
PUSH DX
CALL DELAY_FOR_KEY
MOV AL,CNT
MOV CNT_TEMP,AL
MOV AL,88
MOV CNT,AL
;状态不会变,不需要锁存
MOV DX,PORTA
MOV AL,01010000B
OUT DX,AL

POP DX
POP AX
RET
KEY_Y1_X3_YES ENDP


;按键4--南北方向强行通车,东西方向禁止通车
KEY_Y1_X4_YES PROC
CLI
PUSH AX
PUSH DX
CALL DELAY_FOR_KEY
MOV AL,CNT
MOV CNT_TEMP,AL
MOV AL,88
MOV CNT,AL
;状态不会变,不需要锁存
MOV DX,PORTA
MOV AL,10001000B
OUT DX,AL

POP DX
POP AX
RET
KEY_Y1_X4_YES ENDP


;按键5--设置时间
KEY_Y2_X1_YES PROC
CLI
PUSH AX
PUSH DX
CALL DELAY_FOR_KEY

CONTINU_CHECK:
	;(X2,Y2)6
	MOV DX,PORTC
	MOV AL,00001101B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,11010000B
	JNZ KEY_Y2_X2_NO
	CALL KEY_Y2_X2_YES        
KEY_Y2_X2_NO:
	;(X3,Y2)7
	MOV DX,PORTC
	MOV AL,00001011B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,11010000B
	JNZ KEY_Y2_X3_NO
	CALL KEY_Y2_X3_YES        
KEY_Y2_X3_NO:
	;(X4,Y2)8
	MOV DX,PORTC
	MOV AL,00000111B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,11010000B
	JNZ KEY_Y2_X4_NO
	CALL KEY_Y2_X4_YES  
KEY_Y2_X4_NO:
	;(X4,Y3)12
	MOV DX,PORTC
	MOV AL,00000111B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X4_NO
	JMP END_SET_TIME 
KEY_Y3_X4_NO:	
	JMP CONTINU_CHECK

END_SET_TIME: 
STI      
POP DX
POP AX
RET
KEY_Y2_X1_YES ENDP


;按键6--在这里扫描91011号按键,实现加减
KEY_Y2_X2_YES PROC
PUSH AX
PUSH DX
PUSH BX
CALL DELAY_FOR_KEY
KEY6_CONTINU_CHECK:
	;显示调整的时间
	     MOV DX,PORTC
	     MOV AL,0FH
	     OUT DX,AL
         XOR AX,AX
         MOV AL,TIME_OF_RED_LED 
         MOV BL,10
         DIV BL  
         ;十位显示
         MOV BX,AX
         MOV DX,PORTA 
         MOV AL,00000010B
         OUT DX,AL  
         MOV AX,BX              
         MOV BX,OFFSET LED
         XLAT          
         MOV DX,PORTB
         OUT DX,AL  
         CALL delay10ms 
         CALL CLEAR
         ;个位显示 
         MOV BX,AX
         MOV DX,PORTA
         MOV AL,00000001B   
         OUT DX,AL
         MOV AX,BX
         MOV AL,AH
         MOV BX,OFFSET LED
         XLAT          
         MOV DX,PORTB
         OUT DX,AL                     
         CALL delay10ms
         CALL CLEAR
	;(X1,Y3)9--加法
	MOV DX,PORTC
	MOV AL,00001110B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X1_NO_RED
	CALL DELAY_FOR_KEY
	MOV AL,TIME_OF_RED_LED
	INC AL
	MOV TIME_OF_RED_LED,AL
	CMP AL,99
	JNA ADD_OVER_RED
 	MOV AL,6
ADD_OVER_RED:	
		MOV TIME_OF_RED_LED,AL   
KEY_Y3_X1_NO_RED:
	;(X2,Y3)10--减法
	MOV DX,PORTC
	MOV AL,00001101B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X2_NO_RED
	CALL DELAY_FOR_KEY
	MOV AL,TIME_OF_RED_LED
	DEC AL
	MOV TIME_OF_RED_LED,AL
	CMP AL,6
	JA DELETE_OVER_RED
 	MOV AL,6
DELETE_OVER_RED:	
		MOV TIME_OF_RED_LED,AL   	
KEY_Y3_X2_NO_RED:
	;(X3,Y3)11
	MOV DX,PORTC
	MOV AL,00001011B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X3_NO_RED
	JMP END_SET_TIME_OF_RED_LED
KEY_Y3_X3_NO_RED:
			JMP KEY6_CONTINU_CHECK
END_SET_TIME_OF_RED_LED:
POP BX
POP DX
POP AX
RET
KEY_Y2_X2_YES ENDP

;按键7,同按键6,只是变为针对绿灯
KEY_Y2_X3_YES PROC
PUSH AX
PUSH DX
PUSH BX
CALL DELAY_FOR_KEY
KEY7_CONTINU_CHECK:
	;显示调整的时间
	     MOV DX,PORTC
	     MOV AL,0FH
	     OUT DX,AL
         XOR AX,AX
         MOV AL,TIME_OF_GREEN_LED 
         MOV BL,10
         DIV BL  
         ;十位显示
         MOV BX,AX
         MOV DX,PORTA 
         MOV AL,00000010B
         OUT DX,AL  
         MOV AX,BX              
         MOV BX,OFFSET LED
         XLAT          
         MOV DX,PORTB
         OUT DX,AL  
         CALL delay10ms 
         CALL CLEAR
         ;个位显示 
         MOV BX,AX
         MOV DX,PORTA
         MOV AL,00000001B   
         OUT DX,AL
         MOV AX,BX
         MOV AL,AH
         MOV BX,OFFSET LED
         XLAT          
         MOV DX,PORTB
         OUT DX,AL                     
         CALL delay10ms
         CALL CLEAR
	;(X1,Y3)9--加法
	MOV DX,PORTC
	MOV AL,00001110B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X1_NO_GREEN
	CALL DELAY_FOR_KEY
	MOV AL,TIME_OF_GREEN_LED
	INC AL
	MOV TIME_OF_GREEN_LED,AL
	CMP AL,99
	JNA ADD_OVER_GREEN
 	MOV AL,6
ADD_OVER_GREEN:	
		MOV TIME_OF_GREEN_LED,AL   
KEY_Y3_X1_NO_GREEN:
	;(X2,Y3)10--减法
	MOV DX,PORTC
	MOV AL,00001101B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X2_NO_GREEN
	CALL DELAY_FOR_KEY
	MOV AL,TIME_OF_GREEN_LED
	DEC AL
	MOV TIME_OF_GREEN_LED,AL
	CMP AL,6
	JA DELETE_OVER_GREEN
 	MOV AL,6
DELETE_OVER_GREEN:	
		MOV TIME_OF_GREEN_LED,AL   	
KEY_Y3_X2_NO_GREEN:
	;(X3,Y3)11
	MOV DX,PORTC
	MOV AL,00001011B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X3_NO_GREEN
	JMP END_SET_TIME_OF_GREEN_LED
KEY_Y3_X3_NO_GREEN:
			JMP KEY7_CONTINU_CHECK
END_SET_TIME_OF_GREEN_LED:
POP BX
POP DX
POP AX
RET
KEY_Y2_X3_YES ENDP


;按键8--同按键6,只是变为针对黄灯
KEY_Y2_X4_YES PROC
PUSH AX
PUSH DX
PUSH BX
CALL DELAY_FOR_KEY
KEY8_CONTINU_CHECK:
	;显示调整的时间
	     MOV DX,PORTC
	     MOV AL,0FH
	     OUT DX,AL
         XOR AX,AX
         MOV AL,TIME_OF_YELLOW_LED 
         MOV BL,10
         DIV BL  
         ;十位显示
         MOV BX,AX
         MOV DX,PORTA 
         MOV AL,00000010B
         OUT DX,AL  
         MOV AX,BX              
         MOV BX,OFFSET LED
         XLAT          
         MOV DX,PORTB
         OUT DX,AL  
         CALL delay10ms 
         CALL CLEAR
         ;个位显示 
         MOV BX,AX
         MOV DX,PORTA
         MOV AL,00000001B   
         OUT DX,AL
         MOV AX,BX
         MOV AL,AH
         MOV BX,OFFSET LED
         XLAT          
         MOV DX,PORTB
         OUT DX,AL                     
         CALL delay10ms
         CALL CLEAR
	;(X1,Y3)9--加法
	MOV DX,PORTC
	MOV AL,00001110B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X1_NO_YELLOW
	CALL DELAY_FOR_KEY
	MOV AL,TIME_OF_YELLOW_LED
	INC AL
	MOV TIME_OF_YELLOW_LED,AL
	CMP AL,5
	JNA ADD_OVER_YELLOW
 	MOV AL,5
ADD_OVER_YELLOW:	
		MOV TIME_OF_YELLOW_LED,AL   
KEY_Y3_X1_NO_YELLOW:
	;(X2,Y3)10--减法
	MOV DX,PORTC
	MOV AL,00001101B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X2_NO_YELLOW
	CALL DELAY_FOR_KEY
	MOV AL,TIME_OF_YELLOW_LED
	DEC AL
	MOV TIME_OF_YELLOW_LED,AL
	CMP AL,2
	JA DELETE_OVER_YELLOW
 	MOV AL,2
DELETE_OVER_YELLOW:	
		MOV TIME_OF_YELLOW_LED,AL   	
KEY_Y3_X2_NO_YELLOW:
	;(X3,Y3)11
	MOV DX,PORTC
	MOV AL,00001011B 
	OUT DX,AL
	IN AL,DX
	AND AL,0F0H
	CMP AL,10110000B
	JNZ KEY_Y3_X3_NO_YELLOW
	JMP END_SET_TIME_OF_YELLOW_LED
KEY_Y3_X3_NO_YELLOW:
			JMP KEY8_CONTINU_CHECK
END_SET_TIME_OF_YELLOW_LED:
POP BX
POP DX
POP AX
RET
KEY_Y2_X4_YES ENDP




;中断主要实现接收8254的OUT2的上升沿触发,实现CNT+1,还有就是变换STATE,调用相应的子程序进行数码管显示和灯的显示
;在写程序之前先画好状态机流程图
INT0 PROC
     PUSH AX
     CLI
     
     ;MOV AL,CNT
;     INC AL
;     AND AL,0FH 
;     MOV CNT,AL 
     
     MOV AL,CNT  
     DEC AL  
     MOV CNT,AL
     
     MOV AL,STATE
     CMP AL,00H
     JZ EWG_SNR
     
     CMP AL,01H
     JZ EWY_SNR

     CMP AL,10H
     JZ EWR_SNG
     
     CMP AL,11H
     JZ EWR_SNY
    

EWG_SNR:
		MOV DX,PORTA
		MOV AL,01010011B;最后两位为11,防止显示倒计时时产生干扰
	    OUT DX,AL
	    MOV AL,CNT
	    CMP AL,TIME_OF_YELLOW_LED
	    JNZ END_EWG_SNR
	    CALL EWG_SNR_PROC
END_EWG_SNR:
	    JMP END_INTO0 
	    
	    
EWY_SNR:
		MOV DX,PORTA
		MOV AL,00110011B
	    OUT DX,AL
	    CALL DELAY_FOR_YELLOW
	    MOV AL,00010011B
	    OUT DX,AL
	    
	    MOV AL,CNT
	    CMP AL,0
	    JNZ END_EWY_SNR
	    CALL EWY_SNR_PROC
END_EWY_SNR:
	    JMP END_INTO0
	    
	    
EWR_SNG:
		MOV DX,PORTA
		MOV AL,10001011B
	    OUT DX,AL
	    MOV AL,CNT
	    CMP AL,TIME_OF_YELLOW_LED
	    JNZ END_EWR_SNG
	    CALL EWR_SNG_PROC
END_EWR_SNG:
	    JMP END_INTO0
	    
	    
EWR_SNY:
		MOV DX,PORTA
		MOV AL,10000111B
	    OUT DX,AL
	    CALL DELAY_FOR_YELLOW
	    MOV AL,10000011B
	    OUT DX,AL
	    
	    MOV AL,CNT
	    CMP AL,0
	    JNZ END_EWR_SNY
	    CALL EWR_SNY_PROC
END_EWR_SNY:
	    JMP END_INTO0	
	    
	    						    
END_INTO0:     
     MOV DX,OCW2
     MOV AL,20H
     OUT DX,AL
     
     STI
     POP AX
     
    
    IRET
INT0 ENDP


EWG_SNR_PROC PROC
	PUSH AX
	MOV AL,STATE
	MOV AL,01H
	MOV STATE,AL
	POP AX
	RET
EWG_SNR_PROC ENDP



EWY_SNR_PROC PROC
	PUSH AX
	MOV AL,STATE
	MOV AL,10H
	MOV STATE,AL
	MOV AL,TIME_OF_RED_LED
	MOV CNT,AL
	POP AX
	RET
EWY_SNR_PROC ENDP


EWR_SNG_PROC PROC
	PUSH AX
	MOV AL,STATE
	MOV AL,11H
	MOV STATE,AL
	POP AX
	RET
EWR_SNG_PROC ENDP



EWR_SNY_PROC PROC
	PUSH AX
	MOV AL,STATE
	MOV AL,00H
	MOV STATE,AL
	MOV AL,TIME_OF_GREEN_LED
	MOV CNT,AL
	POP AX
	RET
EWR_SNY_PROC ENDP

;不准确的延时
delay10ms proc
	PUSH CX						
	push ax
    MOV CX,000aH
T1:	MOV AX,008FH
T2:	DEC AX
	JNZ T2
	LOOP T1
    pop ax
	POP CX
	RET
delay10ms endp

;按键消抖
DELAY_FOR_KEY PROC
	PUSH CX						
	PUSH AX
    MOV CX,0AAAH
T3:	MOV AX,008FH
T4:	DEC AX
	JNZ T4
	LOOP T3
    POP AX
	POP CX
	RET
DELAY_FOR_KEY ENDP


;作为黄灯闪烁的时钟
DELAY_FOR_YELLOW PROC
	PUSH CX						
	PUSH AX
    MOV CX,009AH
T5:	MOV AX,008FH
T6:	DEC AX
	JNZ T6
	LOOP T5
    POP AX
	POP CX
	RET
DELAY_FOR_YELLOW ENDP    


clear proc
    push dx
    push ax 
    mov dx,PORTB
    mov al,00H
    out dx,al
    call delay10ms
    pop ax
    pop dx
    ret
clear endp


CODE 	ENDS	          	;代码段结束
    END   MAIN	;整个源代码结束

电路连接图(Proteus)
提取码:7z2b

  • 21
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
(1)用8253 计时器来完成时间的设定; (3)用8259 中断控制器来进行紧急情况处理,如警车执行任务等情况; (4)通过8255A 并口来控制LED 发光二极管的亮灭,输出为0 则亮,输出为1 则 灭; (5)用8255 来输出绿灯的倒计时间。 2 设计方案及分工 在这个方案里,我们将此设计分为5 个模块,即:实现电路设计、连接电路以及各模块 间整合的模块、实现交通灯循环的模块、对中断进行处理的模块、实现绿灯倒计时的显示模 块、实现夜间控制模块。 具体分工如下: xx:实现8253、电路设计、连接电路以及各模块间整合的模块 xx:实现夜间控制模块 xx:实现交通灯循环的模块 xx: 对中断进行处理的模块 xx: 实现绿灯倒计时的显示模块 我们想通过这次设计,具体实现以下功能: 以8086CPU 为核心设计一个交通灯控制系统,通过8255 并口来控制LED 发光二级管 的亮灭,输出0 为亮,输出一为灭;用8253 来实现一个定时器(隔一定时间发生一边沿跳 变,引发8259 中断);用8259 来实现对中断的处理; 设有一个十字路口,东西方向与南北方向各有一个红绿灯,初始状态为东西路口的红灯 亮南北路口的绿灯,南北方向的路口通车,并显示南北路口绿灯的倒计时间。延迟一定时间 之后,南北路口与东西路口都为黄灯亮,延迟一定的时间后,南北方向的红灯亮,东西路口 的绿灯两,东西方向的路口通车,并显示东西路口的绿灯倒计时间。延迟一定时间后直接跳 变为东西方向的红灯亮,南北路口的绿灯亮。如上所述循环一定次数后假设进入晚上,屏幕 上显示Good Night!此时这两个路口的黄灯开始闪烁,数码管清零并且闪烁。延迟一定时间 后假设进入早晨并在屏幕上显示Good Night!并实现交通灯的循环。如果遇到紧急情况,采 取紧急中断并且两个方向路口的红灯全亮确保紧急情况得到妥善处理,并且不管。在紧急情 况中断处理模块里通过拨动按钮KK2 来触发中断,使各个路口的灯全显示红灯,并在屏幕 上输出Waring!中断完成后跳回原来的状态,继续运行。 3. 各个模块的实现 3.1交通灯循环模块(XX) 3.1.1 设计思想 十字路口分为南北方向和东西方向,各个方向有红黄绿三灯,其循环过程如下: 1:东西方向路口的红灯亮,南北路口的绿灯亮; 2:东西路口与南北路口都为黄灯亮; 3:东西方向路口的绿灯亮,南北方向路口的红灯亮; 4:不经过黄灯亮,直接跳变为状态1; 5:按如上过程循环; 3.1.2流程图 图3-1 8255 并口输出流程图
CSDN微机原理交通灯实时控制系统课程设计是一项基于微机原理交通灯实时控制系统的设计项目。该项目旨在通过使用微机控制技术,实现对交通灯信号的实时控制,提高交通流量的效率和交通安全性。 该课程设计将涉及到硬件设计和软件编程两个方面。硬件设计部分将包括选择合适的微机控制器,设计电路板以及与交通灯控制器的连接。软件编程部分将包括设计和编写用于控制交通灯信号的程序,确保各个交通灯的协调配合,同时考虑到不同道路的交通流量和优先级。 在硬件设计方面,需要选择适合的微机控制器,如Arduino等,并设计相应的电路板,包括输入和输出接口,以及与交通灯控制器的连接。为了实现实时控制,可能需要使用中断技术来处理交通信号的变化和交通灯状态的更新。 在软件编程方面,需要设计并编写程序来实现交通灯信号的实时控制。这包括了读取交通流量数据和交通灯状态,并根据一定的算法来进行信号的调整。算法的选择需要考虑到交通流量、优先级、是否有行人等因素,并根据实际场景做出相应的控制决策。 最后,通过连接微机控制器和交通灯控制器,将编写好的程序运行在微机上,实现对交通灯信号的实时控制。在实验室环境下,可以通过模拟交通流量来测试控制系统的效果,进行调试和优化。 总结而言,CSDN微机原理交通灯实时控制系统课程设计是一个综合性的项目,涉及到硬件设计和软件编程。通过设计和编写程序,使用微机控制技术对交通灯信号进行实时控制,旨在提高交通流量的效率和交通安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F l e

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值