📄 jdd5.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 交通灯 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIME EQU 50H ;秒计数用
TIMESFR EQU 51H ;临时寄存器
CONR5 EQU 52H ;T11秒定时计数用
TIMED0 EQU 55H ;单向最大定时时间,直行开始,人行开始 120
TIMED1 EQU 56H ; 各路右转开始时间 110
TIMED2 EQU 57H ; 前行结束提醒 70
TIMED3 EQU 58H ; 前行结束,人行结束,左转开始 60
TIMED4 EQU 59H ; 左转结束提醒
TIMED5 EQU 5AH ; 左转结束
TIMED6 EQU 5BH ;
TIMED7 EQU 5CH ;
SN EQU P1 ; 南北口
EW EQU P2 ; 东西口
SCAN EQU P3 ;扫描口
LEDOUT EQU P0 ;段码口
SNEWFLAG BIT 09H ;东西口与南北口转换标志
; 按键在扫描口的最高位,按一下,全红灯,再按一下,恢复原状态
;
; 定时器T0、T1溢出周期为50MS,T0为秒计数用,
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTTO执行
ORG 0013H ;外中断1中断程序入口
LJMP INT11 ;外中断1中断返回,119.120中断
ORG 001BH ;定时器T1中断程序入口
LJMP INTT1
ORG 0023H ;串行中断程序入口地址
RETI ;串行中断程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
START: MOV SP,#80H
MOV R0,#00H ;清70H-7AH共11个内存单元
MOV R7,#8FH ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV TIMED0,#78H ;单向最大定时时间,直行开始,人行开始 120
MOV TIMED1,#6EH ; 各路右转开始时间 110
MOV TIMED2,#46H ; 前行结束提醒 70
MOV TIMED3,#3CH ; 前行结束,人行结束,左转开始 60
MOV TIMED4,#0AH ; 左转结束提醒
CLR SNEWFLAG ;南北先通行标志位
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
MOV TH0,#3CH ;50MS定时初值
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
MOV TH1,#3CH ;50MS定时初值
;
JB SCAN.7,SSST ;120秒管理
;以下为60秒管理
LCALL DL1MS
LCALL DL1MS
LCALL DL1MS
JB SCAN.7,SSST ;干扰
MOV TIMED0,#60 ;单向最大定时时间,直行开始,人行开始60
MOV TIMED1,#55 ; 各路右转开始时间 55
MOV TIMED2,#35 ; 前行结束提醒 35
MOV TIMED3,#30 ; 前行结束,人行结束,左转开始 30
MOV TIMED4,#05 ; 左转结束提醒
SSWAIT: JNB SCAN.7,SSWAIT
LCALL DL1MS
LCALL DL1MS
LCALL DL1MS
JNB SCAN.7,SSWAIT
;
SSST: MOV TIME,TIMED0 ;120秒
LCALL TUNBCD
MOV SN,#66H ;
MOV EW,#55H ;
SETB EA ;总中断开放
SETB PX1
SETB EX1
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1秒定时用初值(50MS×20)
MOV CONR5,#20
START1: LCALL DISPLAY ;调用显示子程序
JNB SCAN.7,KEYFUN ;手动状态
SJMP START1 ;P1.0口为1时跳回START1
;
KEYFUN: LCALL DISPLAY
LCALL DISPLAY
JB SCAN.7,START1
CLR ET0
CLR TR0
MOV SN,#056H ;全车道停,行人通
MOV EW,#056H ;
MOV TIME,#00H ;时间显示0
LCALL TUNBCD
KEYWAIT: LCALL DISPLAY ;
JNB SCAN.7,KEYWAIT ;
KEYY: LCALL DISPLAY ;等待按键按下
JB SCAN.7,KEYY
LCALL DISPLAY
JB SCAN.7,KEYY
KEYWAIT1: LCALL DISPLAY ;
JNB SCAN.7,KEYWAIT1 ;
MOV TIME,TIMED0 ;从新开始计时初值
LCALL TUNBCD
CLR SNEWFLAG ;南北先通行标志位
SETB TR0
SETB ET0
AJMP START1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1秒计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
INTT0: PUSH ACC ;累加器入栈保护
PUSH PSW ;状态字入栈保护
CLR ET0 ;关T0中断允许
CLR TR0 ;关闭定时器T0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值(低8位修正值)
MOV A,#3CH ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重装初值(高8位修正值)
SETB TR0 ;开启定时器T0
DJNZ R4, OUTT00 ;20次中断未到中断退出
MOV R4,#14H ;20次中断到(1秒)重赋初值
JB SNEWFLAG, INT22
DEC TIME
MOV A,TIME
CJNE A,TIMED1,LOOP11 ; 判断是否小于110秒
LOOP11: JC LOOP22 ; 120-110
MOV SN,#66H ; I
MOV EW,#55H ; I
LJMP OUTT0 ; 120-110
LOOP22: MOV A,TIME
CJNE A,TIMED2,LOOP33 ; 判断是否小于70秒
LOOP33: JC LOOP44 ; 110-70
MOV SN,#6AH ; I
MOV EW,#59H ; I
LJMP OUTT0 ; 110-70
LOOP44: MOV A,TIME
CJNE A,TIMED3,LOOP55 ; 判断是否小于60秒
LOOP55: JC LOOP66 ; 70-60
MOV 20H,SN ;
CPL 04H ;
CPL 00H
MOV SN,20H ; I
MOV EW,#59H ; I
LJMP OUTT0 ; 70-60
LOOP66: MOV A,TIME
CJNE A,TIMED4,LOOP77 ; 判断是否小于10秒
LOOP77: JC LOOP88 ; 60-10
MOV SN,#99H ; I
MOV EW,#59H ; I
LJMP OUTT0 ; 60-10
LOOP88: MOV A,TIME
JZ OUT88
MOV 20H,SN ;
CPL 06H ;
CPL 02H
MOV SN,20H ;
MOV 20H,EW
CPL 02H
MOV EW,20H ; I
LJMP OUTT0 ; 70-60
OUT88: MOV TIME,TIMED0 ;120秒初值
CPL SNEWFLAG
OUTT0: LCALL TUNBCD ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -