本帖最后由 泗一起 于 2013-4-25 21:02 编辑
AGO EQU 30H
AGD EQU 31H
BRD EQU 32H
BGO EQU 33H
ARD EQU 34H
BGD EQU 35H
GF EQU 36H
YF EQU 37H
YD EQU 38H
RF EQU 39H
INI EQU 40H
WAITO BIT 41H
URGENCYO BIT 42H
ADSU BIT 43H
CTRL BIT P3.6
SPK BIT P3.7
ORG 0000H
LJMP START
ORG 0003H
LJMP INTT0 ;转向紧急车辆中服程序
ORG 0013H
LJMP INTT1
;*******************************************************************************
;* 主程序
;*******************************************************************************
ORG 0100H
START: MOV AGO,#52 ;初始化数据
MOV BGO,#32
MOV GF,#3
MOV YF,#5
MOV RF,#5
MOV YD,#4
LCALL INI_DATA ;数据处理
MOV SP,#40H
MOV IE,#83H ;使能INT0,INT1
MOV TCON,#01H
MOV TCON,#05H ;INT0,INT1下降沿触发
MOV IP,#01H ;中断0优先
MOV R1,#6 ;初始化检测 交通灯闪烁,数码管显示8并闪烁
M1: MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0F0H
LCALL DELAY
LCALL DELAY
MOV P0,#00H
MOV P2,#0FH
LCALL DELAY
LCALL DELAY
DJNZ R1,M1
MAIN:
LCALL STATE1 ;状态0,A道绿灯亮(AGO)s 闪烁(AGF)s
; B道红灯亮(AR0)s
LCALL STATE2 ;状态1,A道黄灯闪烁(AY)s
; B道红灯闪烁(ARF)s
LCALL STATE3 ;状态2,A道红灯亮(ARO)s
; B道绿灯亮(AGO)s 闪烁(AGF)s
LCALL STATE4 ;状态3,A道红灯闪烁(ARF)s
; B道黄灯闪烁(AY)s
AJMP MAIN
;状态1 A道绿灯通行,B道红灯禁止
STATE1: MOV P0,#0CCH ;(1100 1100)B A道绿灯,B道红灯
ORL P2,#0F0H ;人行道灯关
ANL P2,#6FH ;(0110 1111)B 人行道灯显示
MOV R0,AGO ;A道绿灯亮 52s
MOV R1,AGD ;A道数码管倒计时55s
MOV R2,BRD ;B道数码管倒计时60s
ST1: LCALL DIS1S ;A、B道数码管分别显示
ACALL DE
DJNZ R0,ST1 ;52s未到 循环
MOV R0,GF ;A道绿灯闪烁3s
FLASH1: CPL P0.2
LCALL DIS
CPL P0.2
LCALL DIS
ACALL DE
DJNZ R0,FLASH1 ;3s未到 循环
RET
;状态2 A道黄灯提醒,B道红灯禁止
STATE2: MOV P0,#0CAH ;(1100 1010)B A道黄灯,B道红灯
MOV R0,YF ;闪烁定时 5s
MOV R1,YD ;A道数码管倒计时5s,B道数码管继续计时
FLASH2: CPL P0.1 ;A道黄灯闪烁
CPL P0.3 ;B道红灯闪烁
CPL P2.5 ;A道人行道绿灯闪烁
CPL P2.6 ;B道人行道红灯闪烁
LCALL DIS ;数码管显示(0.5s)
CPL P0.1
CPL P0.3
CPL P2.5
CPL P2.6
LCALL DIS
ACALL DE ;减一
DJNZ R0,FLASH2 ;5s未到 循环
RET
;状态3 A道红灯禁止,B道绿灯亮通行
STATE3: MOV P0,#0E1H ;(1110 0001)B A道红灯,B道绿灯
ORL P2,#0F0H ;(1111 0000)B 人行道灯关
ANL P2,#9FH ;(1001 1111)B 人行道灯显示
MOV R0,BGO ;B道绿灯亮 32s
MOV R1,ARD ;A道数码管倒计时40s
MOV R2,BGD ;B道数码管倒计时45s
ST2: LCALL DIS1S ;数码管显示(1s)
LCALL DE
DJNZ R0,ST2 ;32s未到 循环
MOV R0,GF ;B道绿灯闪烁3s
FLASH3: CPL P0.5
LCALL DIS ;数码管显示(0.5s)
CPL P0.5
LCALL DIS
LCALL DE
DJNZ R0,FLASH3 ;3s未到 循环
RET
;状态4 A道红灯禁止,B道黄灯提醒
STATE4: MOV P0,#0D1H ;(1101 0001)B A道红灯,B道黄灯
MOV R0,YF
MOV R2,YD ;B道数码管倒计时5s,A道数码管继续倒计时
FLASH4: CPL P0.0
CPL P0.4
CPL P2.4
CPL P2.7
LCALL DIS
CPL P0.0
CPL P0.4
CPL P2.4
CPL P2.7
LCALL DIS
LCALL DE
DJNZ R0,FLASH4
RET
;*******************************************************************************
;* 初始化程序
;*******************************************************************************
INI_DATA:
MOV A,AGO
SWAP A
ANL A,#0FH
MOV INI,A
MOV A,AGO
INI_DATA1:
ADD A,#6
DA A
DJNZ INI,INI_DATA1 ;将#AGO转换为16进制数
ADD A,#2
DA A
MOV AGD,A ;A路数码管显示数字
ADD A,#5
DA A
MOV BRD,A ;B路数码管显示数字
MOV A,BGO ;
SWAP A
ANL A,#0FH
MOV INI,A
MOV A,BGO
INI_DATA2:
ADD A,#6
DA A
DJNZ INI,INI_DATA2 ;将#BGO转换为16进制数
ADD A,#2
DA A
MOV BGD,A ;B路数码管显示数字
ADD A,#5
DA A
MOV ARD,A ;A路数码管显示数字
RET
;*******************************************************************************
;* 延时程序
;*******************************************************************************
DY1MS: MOV R6, #02H ;1ms延时程序
DL1: MOV R7, #0FAH
DL2: DJNZ R7, DL2
DJNZ R6, DL1
RET
DELAY: MOV R5,#250 ;0.5s延时程序
DL3: ACALL DY1MS
ACALL DY1MS
DJNZ R5,DL3
RET
;*******************************************************************************
;* 减法调整程序
;*******************************************************************************
;R1=R1-1
;R2=R2-1
DE: CLR C
MOV A,#9AH
DEC A
ADD A,R1
DA A
MOV R1,A
CLR C
MOV A,#9AH
DEC A
ADD A,R2
DA A
MOV R2,A
RET
;*******************************************************************************
;* 显示程序
;*******************************************************************************
DIS: MOV R3,#01H ;0.5s为一个周期
AJMP DIS1
DIS1S: MOV R3,#2 ;1s为一个周期
DIS1: MOV R4,#125
DIS2: ACALL DISPLAY
DJNZ R4,DIS2
DJNZ R3,DIS1
RET
DISPLAY:
MOV A,R1
ANL A,#0FH
CLR P2.0 ;P2.0选通A道的低位
ACALL LED ;显示
SETB P2.0
MOV A,R1
SWAP A
ANL A,#0FH
CLR P2.1 ;P2.1选通A道高位
ACALL LED ;显示
SETB P2.1
MOV A,R2
ANL A,#0FH
CLR P2.2 ;P2.2选通B道的低位
ACALL LED ;显示
SETB P2.2
MOV A,R2
SWAP A
ANL A,#0FH
CLR P2.3 ;P2.3选通B道高位
ACALL LED ;显示
SETB P2.3
RET
LED: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A ;P1口输出到数码管显示
ACALL DY1MS
RET
;*******************************************************************************
;* 中服程序
;*******************************************************************************
INTT0: CLR EA ;关中断
PUSH ACC ;P0口数据压栈保护
PUSH PSW
SETB EA
JNB P3.0,CONTROL ;控制
JNB P3.1,ADDSUBB1 ;
AJMP EXIT1
CONTROL:
CPL CTRL
AJMP EXIT1
ADDSUBB1:
CPL ADSU
EXIT1: CLR EA
POP PSW ;退栈 恢复现场
POP ACC
SETB EA
RETI ;返回主程序
INTT1: CLR EA ;关中断
PUSH ACC ;P0口数据压栈保护
PUSH PSW
PUSH P0
PUSH P2
SETB EA
JNB CTRL,ADDSUBB2
JNB P3.4,WAI
JNB P3.5,URG
AJMP EXIT2
ADDSUBB2:
JNB P3.4,ADSU1
JNB ADSU,ADD5S
LCALL BAD5S
AJMP EXIT2
ADD5S: LCALL AAD5S
AJMP EXIT2
ADSU1: JNB ADSU,SUBB5S
LCALL BSUB5S
SUBB5S: LCALL ASUB5S
AJMP EXIT2
WAI: LCALL WAIT
AJMP EXIT2
URG: LCALL URGENCY
EXIT2: CLR EA
POP P2
POP P0
POP PSW ;退栈 恢复现场
POP ACC
SETB EA
RETI ;返回主程序
BAD5S: MOV A,BGO
ADD A,#5
MOV BGO,A
LCALL INI_DATA
LCALL DIS1S
LCALL DELAY
LCALL DELAY
RET
AAD5S: MOV A,AGO
ADD A,#5
MOV AGO,A
LCALL INI_DATA
LCALL DIS1S
LCALL DELAY
LCALL DELAY
RET
BSUB5S: MOV A,BGO
SUBB A,#5
MOV BGO,A
LCALL INI_DATA
LCALL DIS1S
LCALL DELAY
LCALL DELAY
RET
ASUB5S: MOV A,AGO
SUBB A,#5
MOV AGO,A
LCALL INI_DATA
LCALL DIS1S
LCALL DELAY
LCALL DELAY
RET
WAIT: MOV P1,#3FH ;数码管显示'0'
DEY0: MOV P0,#12H ;A、B道均黄灯 1100 0000
MOV P2,#50H ;0101 0000
LCALL DELAY
LCALL DELAY
MOV P0,#00H
MOV P2,#0FH ;0000 1111
LCALL DELAY
LCALL DELAY
JNB CTRL,RET1
AJMP DEY0
RET1: RET
URGENCY:
MOV P1,#7FH ;数码管显示'8'
DEY1: MOV P0,#09H ;两路红灯亮
MOV P2,#50H ;0101 0000人行道红灯亮,并显示数码
ACALL DELAY
ACALL DELAY
MOV P0,#00H
MOV P2,#0FH
ACALL DELAY
ACALL DELAY
JNB CTRL,RET2
AJMP DEY1
RET2: RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0,1,2,3,4,5,6,7,8,9
END
新建 好压 RAR 压缩文件.rar
(25.81 KB)
|