⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traffic.asm

📁 应用8255芯片的交通灯程序
💻 ASM
字号:
DATA SEGMENT
     STATE DB ?
     T24S  DW ?
     T5S   DW ?
     T2S   DW ?
     T05S  DW ?
     MESS  DB 'PRESS ANY KEY TO EXIT!!!',0DH,0AH,'$'
DATA ENDS

STACK SEGMENT
      STA DB 100 DUP(?)
      TOP EQU LENGTH STA
STACK ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK

MAIN PROC FAR
START: MOV AX,STACK            ;8086初始化
       MOV SS,AX
       MOV AX,DATA
       MOV DS,AX

       MOV AL,1CH              ;得原中断向量
       MOV AH,35H
       INT 21H
       PUSH ES
       PUSH BX                 ;保存原中断向量

       PUSH DS
       MOV DX,OFFSET KING      ;设置中断向量
       MOV AX,SEG KING         ;中断服务程序名KING
       MOV DS,AX
       MOV AL,1CH
       MOV AH,25H
       INT 21H
       POP DS

       IN AL,21H               ;设置中断屏蔽位
       AND AL,0FEH
       OUT 21H,AL

       MOV DX,20BH             ;8255初始化
       MOV AL,10010000B        ;A口0方式输入
       OUT DX,AL               ;B口0方式输出

       MOV DX,209H             ;清LED
       MOV AL,11111111B
       OUT DX,AL
       MOV STATE,AL

       MOV AH,09H              ;输出提示信息
       LEA DX,MESS
       INT 21H

       STI                     ;开中断


       MOV DX,208H             ;输入车辆状况
       IN AL,DX
       AND AL,00001100B        
       CMP AL,00001100B        ;判断南北是否有车
       JZ  EW                  ;若相等则南北无车,若不等则南北有车

SN:    MOV DX,209H             
       MOV AL,10011001B        ;南北绿灯,东西红灯
       MOV STATE,AL            ;保存交通灯状态
       OUT DX,AL

       CALL PROA_0             ;南北绿灯24S或南北无车5S东西有车子程序PROA_0
       CALL PROA_1             ;南北绿灯闪4S东西红灯子程序             PROA_1
       CALL PROA_2             ;南北黄灯2S东西红灯子程序               PROA_2

WAITK: MOV AL,0
       MOV AH,06H              ;等待有键按下
       MOV DL,0FFH
       INT 21H
       AND AL,AL               ;判断是否有键按下
       JNZ QUIT                ;有输入则跳转至QUIT,无输入则顺序执行

EW:    MOV DX,209H
       MOV AL,01100110B        ;东西绿灯,南北红灯
       MOV STATE,AL            ;保存交通灯状态
       OUT DX,AL

CALL PROB_0             ;东西绿灯24S或东西无车5S南北有车子程序PROB_0 
       CALL PROB_1              ;东西绿灯闪4S南北红灯子程序             PROB_1
       CALL PROB_2              ;东西黄灯2S南北红灯子程序               PROB_2
       JMP SN                   ;跳至"南北绿灯东西红灯"循环执行

QUIT:  CLI                      ;关中断

POP DX
       POP ES
       PUSH DS
       MOV AX,ES
       MOV DS,AX
       MOV AL,1CH
       MOV AH,25H
       INT 21H
       POP DS                   ;恢复1CH中断向量

       IN AL,21H                ;关闭8259的定时中断
       OR AL,01H
       OUT 21H,AL

       MOV DX,209H              ;LED清零
       MOV AL,11111111B
       MOV DX,AL

       MOV AX,4C00H             ;返回DOS
       INT 21H
MAIN ENDP

PROA_0 PROC NEAR                ;南北绿灯24S或南北方向无车5S东西方向有车子程序
       MOV T24S,437
SKY;   MOV T5S,91

S5ONA: MOV DX,208H              ;检测南北方向是否有车
       IN AL,DX
       AND AL,00001100B
       CMP AL,00001100B
       JZ S5OFA                 ;无车则跳转判断5S是否已到

S24OFA:CMP T24S,0               ;判断24S是否已到,若到了则退出子程序
       JNZ SKY               ;24S未到则跳转开始5S计时
       RET 

S5OFA: CMP T5S,0
       JZ JUDGE_0               ;5S未到则跳转判断24S是否结束
       
SKY_0: CMP T24S,0
       JNZ S5ONA
       JMP OUT_0

JUDGE_0:MOV DX,208H              ;5S到了则判断东西方向是否有车
       IN  AL,DX
       AND AL,00000011B
       CMP AL,00000011B
       JZ SKY_0                  ;东西方向无车则判断24S是否结束
OUT_0: RET                       ;东西方向有车则退出子程序
PROA_0 ENDP

PROA_1 PROC NEAR                 ;南北绿灯闪烁4次东西红灯子程序
       MOV CX,4                  ;置闪烁4次

       MOV DX,209H
GOONA: MOV AL,11011101B          ;南北绿灯灭东西红灯
       MOV STATE,AL
       OUT DX,AL

       MOV T05S,9                ;延时0.5S
S050A: CMP T05S,0
       JNZ 05S0A

       MOV AL,10011001B          ;南北绿灯东西红灯
       MOV STATE,AL
       OUT DX,AL

       MOV T05S,9                ;延时0.5S
S051A: CMP T05S,0
       JNZ 05S1A

       DEC CX                    ;判断闪烁次数是否已到
       CMP CX,0
       JNZ GOONA                 ;未到则继续闪烁
       RET                       ;已到则退出子程序
PROA_1 ENDP

PROA_2 PROC NEAR                 ;南北黄灯2S东西红灯子程序
       MOV DX,209H               ;南北黄灯东西红灯
       MOV AL,00010001B
       MOV STATE,AL
       OUT DX,AL

       MOV T2S,36                ;延时2S
S2OFA: MOV AX,T2S
       CMP AX,0
       JNZ S2OFA
       
       RET                       ;退出子程序
PROA_2 ENDP



PROB_0 PROC NEAR                ;东西绿灯24S或东西方向无车5S南北方向有车子程序
       MOV T24S,437
FOV:   MOV T5S,91

S5ONB: MOV DX,208H              ;检测东西方向是否有车
       IN AL,DX
       AND AL,00000011B
       CMP AL,00000011B
       JZ S5OFB                 ;无车则跳转判断5S是否已到

S24OFB:CMP T24S,0               ;判断24S是否已到,若到了则退出子程序
       JNZ FOV                  ;24S未到则跳转开始5S计时
       RET 

S5OFB: CMP T5S,0
       JZ JUDGE_1                ;5S未到则跳转判断24S是否结束
       
FOV_0: CMP T24S,0
       JNZ S5ONB
       JMP OUT_1

JUDGE_1:MOV DX,208H              ;5S到了则判断南北方向是否有车
       IN  AL,DX
       AND AL,00001100B
       CMP AL,00001100B
       JZ FOV_0                  ;南北方向无车则判断24S是否结束
OUT_1: RET                       ;南北方向有车则退出子程序
PROB_0 ENDP

PROB_1 PROC NEAR                 ;东西绿灯闪烁4次南北红灯子程序
       MOV CX,4                  ;置闪烁4次

       MOV DX,201H
GOONB: MVO AL,01110111B          ;东西绿灯灭南北红灯
       MOV STATE,AL
       OUT DX,AL

       MVO T05S,9                ;延时0.5S
S050B: CMP T05S,0
       JNZ S050B

       MOV AL,01100110B          ;东西绿灯南北红灯
       MOV STATE,AL
       OUT DX,AL

       MVO T05S,9                ;延时0.5S
S051B: CMP T05S,0
       JNZ S051B

       DEC CX                    ;判断闪烁次数是否已到
       CMP CX,0
       JNZ GOONB                 ;未到则继续闪烁
       RET                       ;已到则退出子程序
PROB_1 ENDP

PROB_2 PROC NEAR                 ;东西黄灯2S南北红灯子程序
       MOV DX,209H               ;东西黄灯南北红灯
       MOV AL,01000100B
       MOV STATE,AL
       OUT DX,AL

       MOV T2S,36                ;延时2S
S2OFB: MOV AX,T2S
       CMP AX,0
       JNZ S2OFB
       
       RET                       ;退出子程序
PROB_2 ENDP



KING PROC NEAR                   ;中断服务子程序
       PUSH AX                   ;现场保护
       PUSH DX
       MOV AX,DATA
       MOV DS,AX
       STI

       MOV DX,208H               ;读8255A口状态
       IN AL,DX

       TEST AL,00010000B         ;判断J=0?
       JZ   ACC                  ;J=0则跳转至ACC执行紧急情况操作

       MOV AL,STATE              ;交通灯显示恢复
       MOV DX,209H
       OUT DX,AL

       CMP T24S,0                 ;(T24S)=0?
       JZ  COM5S                  ;(T24S)=0则跳转判断(T5S)=0?
       DEC T24S
COM5S: CMP T5S,0
       JZ  COM2S
       DEC T5S
COM2S: CMP T2S,0
       JZ  COM05S
       DEC T2S
COM05S:CMP T05S,0
       JZ KINGB
       DEC T05S
       JMP KINGB

ACC:   MOV AL,01010101B            ;紧急情况南北东西全部红灯
       MOV DX,209H
       OUT DX,AL

KINGB: CLI
POP DX                      ;现场恢复
       POP AX
       IRET                        ;中断返回
KING ENDP
    
       CODE ENDS
END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -