A_BIT EQU 20H ;用于存放个位数
B_BIT EQU 21H ;用于存放十位数
TEMP1 EQU 24H ;用于存放要显示的时间
ORG 0000H
AJMP MAIN
ORG 0003H ;外部中断0入口
AJMP KEY1
ORG 0013H ;外部中断1入口
AJMP KEY2
ORG 0100H
;--------主程序--------
MAIN:
MOV SP. #60 ;定义堆栈区域
SETB EA ;总中断允许
SETB EX0 ;外部中断0允许中断
SETB EX1 ;外部中断1允许中断
CLR IT0 ;外部中断0电平触发方式
CLR IT1 ;外部中断1电平触发方式
MOV P1, #00H
MOV P2, #00H
SETB P2.0
MOV TEMP1, #28
MOV R3, #20 ;定义50ms的循环次数
MOV TMOD, #01H ;定义定时器0为方式1
MOV TH0, #3CH ;置定时器初值为50ms溢出
MOV TL0, #0B0H
SETB TR0 ;软件启动T1
;---状态1:东西红灯亮,南北绿灯亮,时间(学号后两位加5秒)---
SETB P1.0 ;P10红灯亮,禁止东西通行
CLR P1.1 ;P11黄灯灭
CLR P1.2 ;P12绿灯灭
CLR P2.1 ;P21红灯灭
CLR P2.2 ;P22黄灯灭
SETB P2.3 ;P23绿灯亮,允许南北通行
STLOP0:
ACALL DISPLAY ;调用显示
DEC TEMP1 ;时间够1s显示时间减1
MOV A, TEMP1
CJNE A, #0, STLOP0 ;若显示时间不为0,则继续循环
;若显示时间为0,跳到状态2
;---状态2:南北绿灯灭,黄灯亮5秒,同时发出报警声(蜂鸣器发声)---
SETB P1.0 ;P10红灯亮,禁止东西通行
CLR P1.1 ;P11黄灯灭
CLR P1.2 ;P12绿灯灭
CLR P2.1 ;P21红灯灭
SETB P2.2 ;P22黄灯亮
CLR P2.3 ;P23绿灯灭,允许南北通行
MOV TEMP1, #05
STLOP1:
CLR p2.0 ;发出报警声(蜂鸣器发声)
ACALL DISPLAY ;调用显示
DEC TEMP1 ;时间够1s显示时间减1
MOV A, TEMP1
CJNE A, #0, STLOP1 ;若显示时间不为0,则继续循环
SETB P2.0
;---状态3:南北红灯亮,东西绿灯亮,时间(学号后两位加5秒)---
CLR P1.0 ;P10红灯灭
CLR P1.1 ;P11黄灯灭
SETB P1.2 ;P12绿灯亮,允许东西通行
SETB P2.1 ;P21红灯亮,禁止南北通行
CLR P2.2 ;P22黄灯灭
CLR P2.3 ;P23绿灯灭
MOV TEMP1, #28
STLOP2:
ACALL DISPLAY ;调用显示
DEC TEMP1 ;时间够1s显示时间减1
MOV A, TEMP1
CJNE A, #0, STLOP2 ;若显示时间不为0,则继续循环
;---状态4:东西绿灯灭,黄灯亮5秒,同时发出报警声(蜂鸣器发声)---
CLR P1.0 ;P10红灯灭
SETB P1.1 ;P11黄灯亮
CLR P1.2 ;P12绿灯灭,禁止东西通行
SETB P2.1 ;P21红灯亮,禁止南北通行
CLR P2.2 ;P22黄灯灭
CLR P2.3 ;P23绿灯灭
MOV TEMP1, #05
STLOP3:
CLR p2.0 ;发出报警声(蜂鸣器发声)
ACALL DISPLAY ;调用显示
DEC TEMP1 ;时间够1s显示时间减1
MOV A, TEMP1
CJNE A, #0, STLOP3 ;若显示时间不为0,则继续循环
SETB P2.0
LJMP MAIN
;--------显示程序1------
DISPLAY:
MOV A, TEMP1
MOV B, #10
DIV AB
MOV A_BIT, B ;个位
MOV B_BIT, A ;十位
MOV DPTR, #NUMT
LP1: MOV A,A_BIT
MOVC A,@A+DPTR
MOV P0, A
CLR P2.4
ACALL D1MS
SETB P2.4
MOV A,B_BIT
MOVC A,@A+DPTR
MOV P0, A
CLR P2.5
ACALL D1MS
SETB P2.5
JBC TF0,LP2 ;查询计数溢出(若溢出则延时了5ms)
SJMP LP1
LP2: MOV TH0, #3CH
MOV TL0, #0B0H
DJNZ R3, LP1
MOV R3, #20
RET
;-----按K1键INT0中断服务程序-----
;//使东西向绿灯、南北向红灯
KEY1: CLR P1.0 ;P10红灯灭
CLR P1.1 ;P11黄灯灭
SETB P1.2 ;P12绿灯亮,允许东西通行
SETB P2.1 ;P21红灯亮,禁止南北通行
CLR P2.2 ;P22黄灯灭
CLR P2.3 ;P23绿灯灭
RETI;中断返回
;-----按K2键INT1中断服务程序-----
;//使南北向绿灯、东西向红灯
KEY2: SETB P1.0 ;P10红灯亮,禁止东西通行
CLR P1.1 ;P11黄灯灭
CLR P1.2 ;P12绿灯灭
CLR P2.1 ;P21红灯灭
CLR P2.2 ;P22黄灯灭
SETB P2.3 ;P23绿灯亮,允许南北通行
RETI;中断返回
;--------1ms延时子程序---------
D1MS: MOV R7, #250
DJNZ R7,$
RET
;--------10ms延时子程序--------
D10MS: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
;--------字形码表--------
NUMT: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH
END
|