📄 time_02.asm
字号:
org 0000h
ljmp start
org 0003h
ljmp ex_int0
org 000bh
ljmp intt0
org 0013h
ljmp set_time
org 0050h
;中断服务程序;
;;;;;;;;;;;;;;;;;;;;;;;
;;;1s计时程序
;;;;;;;;;;;;;;;;;;;;;;;;
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, outt0 ;20次中断未到中断退出
addss: mov r4,#14h ;20次中断到(1秒)重赋初值
mov r0,#71h ;指向秒计时单元(71h-72h)
acall add1 ;调用加1程序(加1秒操作)
mov a,r3 ;秒数据放入a(r3为2位十进制数组合)
clr c ;清进位标志
cjne a,#60h,addmm ;
addmm: jc outt0 ;小于60秒时中断退出
acall clr0 ;大于或等于60秒时对秒计时单元清0
mov r0,#77h ;指向分计时单元(76h-77h)
acall add1 ;分计时单元加1分钟
mov a,r3 ;分数据放入a
clr c ;清进位标志
cjne a,#60h,addhh ;
addhh: jc outt0 ;小于60分时中断退出
acall clr0 ;大于或等于60分时分计时单元清0
mov r0,#79h ;指向小时计时单元(78h-79h)
acall add1 ;小时计时单元加1小时
setb p3.7
lcall dl1s
lcall dl1s
lcall dl1s
lcall dl1s
clr p3.7
mov a,r3 ;时数据放入a
clr c ;清进位标志
cjne a,#24h,hour ;
hour: jc outt0 ;小于24小时中断退出
acall clr0 ;大于或等于24小时小时计时单元清0
outt0: mov 72h,76h ;中断退出时将分、时计时单元数据移
mov 73h,77h ;入对应显示单元
mov 74h,78h ;
mov 75h,79h ;
pop psw ;恢复状态字(出栈)
pop acc ;恢复累加器
setb et0 ;开放t0中断
reti ;中断返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 时间调整中断服务程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
set_time: push acc ;累加器入栈保护
push psw ;状态字入栈保护
clr ET0 ;关定时器T0中断
clr TR0 ;关闭定时器T0
LCALL DL01S ;调用1秒延时程序
jb p3.0,set_m
mov a,#79h
mov r0,a
lcall add1
;LCALL DISPLAY
;lcall DL01S
mov a,r3
clr c
cjne a,#24h,next
next: jc out
mov r3,#79h
lcall clr0
ljmp out
set_m : jb p3.1,set_s
mov a,#77h
mov r0,a
lcall add1
; lcall DL01S
;LCALL DISPLAY
mov a,r3
clr c
cjne a,#60h,next1
next1: jc out
mov r3,#77h
lcall clr0
ljmp out
set_s : jb p3.5,out
mov a,#71h
mov r0,a
lcall add1
mov a,r3
clr c
cjne a,#60h,next2
next2: jc out
mov r3,#71h
lcall clr0
;lcall DL01S
;LCALL DISPLAY
out: MOV 72H,76H ;
MOV 73H,77H ;
MOV 74H,78H ;
MOV 75H,79H ;
setb ET0 ;开定时器T0中断
setb TR0 ;开定时器T0
pop psw ;恢复状态字(出栈)
pop acc ;恢复累加器
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;闹钟设置程序;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ex_int0: push acc ;累加器入栈保护
push psw ;状态字入栈保护
clr et0
clr tr0
ljmp $
setb et0
setb tr0
pop psw ;恢复状态字(出栈)
pop acc ;恢复累加器
reti
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;主程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start : clr p3.7 ;蜂鸣器不叫
MOV R0,#70H ;清70H-7AH共11个内存单元
MOV R7,#0BH
CLEARD: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARD ;
MOV 20H,#00H ;清20H(标志用)mov r2,#20
mov tmod,#11h ;设t0、t1为16位定时器
mov tl0,#0b0h ;50ms定时初值(t0计时用)
mov th0,#3ch ;50ms定时初值
setb ea ;总中断开放
setb ex1
setb et0 ;允许t0中断
setb tr0 ;开启t0定时器
mov r4,#20 ;20*50ms
START1: LCALL DISPLAY ;调用显示子程序
JNB P3.4,start ;P3.5口为0时转时间调整程序
SJMP START1 ;P3.5口为1时跳回START1
set_time1: LJMP set_time ;转到时间调整程序SETMM
;子程序
; 显示数据在70H-75H单元内,用六位LED共阳数码管显示,P1口输出段码数据,P3口作
; 扫描控制,每个LED数码管亮1MS时间再逐位循环。
DISPLAY: MOV R1,#70H ;指向显示数据首址
MOV R5,#0FEH ;扫描控制字初值
PLAY: MOV A,R5 ;扫描字放入A
MOV P2,A ;从P2口输出
MOV A,@R1 ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P1,A ;段码放入P1口
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,R5 ;扫描控制字放入A
JNB ACC.5,ENDOUT ;ACC.5=0时一次显示结束
RL A ;A中数据循环左移
MOV R5,A ;放回R5内
AJMP PLAY ;跳回PLAY循环
ENDOUT: SETB P2.5 ;一次显示结束,P3口复位
MOV P0,#0FFH ;P1口复位
RET ;子程序返回
tab: db 00111111b, 00000110b, 01011011b, 01001111b, 01100110b, 01101101b, 01111101b, 00000111b, 01111111b, 01101111b
;共阴显示 "0"" 1"" 2" " 3" "4" "5" "6" "7" "8" "9""不亮"
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
add1: mov a,@r0 ;取当前计时单元数据到a
dec r0 ;指向前一地址
swap a ;a中数据高四位与低四位交换
orl a,@r0 ;前一地址中数据放入a中低四位
add a,#01h ;a加1操作
da a ;十进制调整
mov r3,a ;移入r3寄存器
anl a,#0fh ;高四位变0
mov @r0,a ;放回前一地址单元
mov a,r3 ;取回r3中暂存数据
inc r0 ;指向当前地址单元
swap a ;a中数据高四位与低四位交换
anl a,#0fh ;高四位变0
mov @r0,a ;数据放入当削地址单元中
ret ;子程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;对计时单元复零用
CLR0: CLR A ;清累加器
MOV @R0,A ;清当前地址单元
DEC R0 ;指向前一地址
MOV @R0,A ;前一地址单元清0
RET ;子程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;1MS延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;延时0.1s程序
dl01s: MOV R3,#10H
dl01: LCALL DISPLAY
DJNZ R3,dl01
RET
;延时程序,用作按键时间的长短判断
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -