📄 time.asm
字号:
$NOMOD51
;
NAME TIME
;
$NOLIST
$INCLUDE(REG52.INC)
$LIST
;
BUFF DATA 50H
SSBUF DATA 51H
ORG 0000H
AJMP MAIN
ORG 002BH
AJMP TIME
ORG 0030H
MAIN: MOV RCAP2H,#0D8H
MOV RCAP2L,#0F0H
MOV TH2,#0D8H ;定时时间=(2^16-T0初值)*时钟周期*12
MOV TL2,#0F0H ;(2^16-OD8F0H)*1/(12*10^6)*12=10MS
MOV IE,#10100000B ;允许中断
MOV T2CON,#00001000B ;允许重新装入(外部允许标志)
MOV SSBUF,#00H
MOV BUFF,#100
SETB TR2
LOOP: ACALL DSUP
;启动定时计数器 2
CALL DELAY
AJMP LOOP
DSUP: MOV A,SSBUF ;取秒的低位
ANL A,#0FH
ACALL SEND ;显示
MOV A,SSBUF
SWAP A
ANL A,#0FH ;取秒的高位
ACALL SEND ;显示
RET
SEND: MOV DPTR,#SGTB1
MOVC A,@A+DPTR ;取字符
MOV SBUF,A
JNB TI,$
CLR TI ;发送字符
RET
TIME: CLR EA ;关中断
PUSH PSW ;保护工作寄存器
PUSH ACC
PUSH 01H
CLR TF2
MOV A,BUFF ;取 %1 秒 BUFF 缓冲区的内容
DEC A ;%1 秒 BUFF 缓冲区内容减 1
MOV BUFF,A ;%1 秒 BUFF缓冲区内容保存
CJNE A,#00H,TIME2 ;是否等于 0 秒? 不等于转出
MOV A,#64H ;%1 秒 BUFF 缓冲区送100
MOV BUFF,A
MOV A,SSBUF ;取秒 SSBUF 缓冲区的内容
SUBB A,#01H ;秒单元内容减 1
JNB PSW.6,TIME1 ;是否有辅助借位
SUBB A,#06H ;有借位进行十进制调整
TIME1: MOV SSBUF,A
CJNE A,#0F8H,TIME2 ;是否等于 60 秒? 不等于转出
MOV A,#59H ;秒缓冲区送59
MOV SSBUF,A
AJMP TIME2
TIME2: POP 01H ;恢复断点
POP ACC
POP PSW
SETB EA ;开中断
RETI
;*****************************************************************************
; /*延时子程序*/
;*****************************************************************************
DELAY: MOV R4,#250 ;延时
DELAY1: MOV R5,#250
DJNZ R5,$
DJNZ R4,DELAY1
RET
;*****************************************************************************
; /*字符编码*/
;*****************************************************************************
SGTB1: DB 03H ;0
DB 9FH ;1
DB 25H ;2
DB 0DH ;3
DB 99H ;4
DB 49H ;5
DB 41H ;6
DB 1FH ;7
DB 01H ;8
DB 09H ;9
DB 0FFH ;灭
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -