📄 可编程加、减计时器的设计与实现.txt
字号:
SECOND EQU 30H
MINITE EQU 31H
HOUR EQU 32H
SECONDK BIT P1.0
MINITEK BIT P1.1
HOURK BIT P1.2
SW1 BIT P1.3 ;加减计数
SW2 BIT P1.4 ;暂停
DISPBUF EQU 40H ;时、分、秒存储的起始位置
DISPBIT EQU 48H ;DISPBIT用于判断数码管个数
T2SCNTA EQU 49H ;定时初值循环次数
T2SCNTB EQU 4AH
TEMP EQU 4BH ;TEMP位选的起始值
ORG 0000H
LJMP START
;
ORG 000BH
LJMP INT_T0 ;INT_T0用于送数码管显示
;
ORG 001BH
LJMP INT_T1 ;INT_T1用于暂停和整点时闹铃
;
ORG 0030H
START: MOV SECOND,#00H ;初始化
MOV MINITE,#00H
MOV HOUR,#00H
MOV DISPBIT,#00H
MOV T2SCNTA,#00H
MOV T2SCNTB,#00H
MOV TEMP,#0FDH
MOV TMOD,#11H
MOV TH0,#(65536-2000) / 256 ;定时初值为2ms
MOV TL0,#(65536-2000) MOD 256
MOV TH1,#3CH ;闹钟响铃1分钟定时初值
MOV TL1,#0B0H
SETB TR0 ;启动加、减计时
SETB TR1 ;启动闹铃响铃时长计时
MOV IE,#8AH ;允许定时中断
MOV IP,#02H ;使T0优先级高于T1,保证时间准确
MOV 21H,#00H
MOV 20H,#14H
SETB P1.6 ;使闹铃输出口为高电平,不响闹铃
LCALL DISP
NK1: JB SECONDK,NK2 ;判断S键按下否,按下则调秒,否则判断调分键
LCALL DELY10MS ;调用10MS延时去抖
JB SECONDK,NK2
INC SECOND
MOV A,SECOND
CJNE A,#60,NS60
MOV SECOND,#00H
NS60: LCALL DISP
JNB SECONDK,$
NK2: JB MINITEK,NK3 ;判断M键按下否,按下则调分,否则判断调时键
LCALL DELY10MS
JB MINITEK,NK3
INC MINITE
MOV A,MINITE
CJNE A,#60,NM60
MOV MINITE,#00H
NM60: LCALL DISP
JNB MINITEK,$
NK3: JB HOURK,NK4 ;判断H键按下否,按下则调时,否则判断调秒键
LCALL DELY10MS
JB HOURK,NK4
INC HOUR
MOV A,HOUR
CJNE A,#24,NH24
MOV HOUR,#00H
NH24: LCALL DISP
JNB HOURK,$
NK4: LJMP NK1
DELY10MS: MOV R6,#10 ;10ms延时
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
DISP: ;DISP用于取出HOUR、MINITE、SECOND的BCD码
MOV A,#40H ;DISPBUF=40H
ADD A,#6 ;(A)=46H
DEC A
MOV R1,A ;R1=(45H)
MOV A,HOUR
MOV B,#10
DIV AB
MOV @R1,A ;(45H)=HOUR高位
DEC R1
MOV A,B
MOV @R1,A ;(44H)=HOUR低位
DEC R1
MOV A,MINITE
MOV B,#10
DIV AB
MOV @R1,A ;(43H)=MINITE高
DEC R1
MOV A,B
MOV @R1,A ;(42h)=MINITE低
DEC R1
MOV A,SECOND
MOV B,#10
DIV AB
MOV @R1,A ;(41H)=SECOND高
DEC R1
MOV A,B
MOV @R1,A ;(40H)=SECOND低
RET
DISP1:LJMP DISP
INT_T0:
MOV TH0,#(65536-2000) / 256
MOV TL0,#(65536-2000) MOD 256
MOV A,#DISPBUF ;(A)=#40h
ADD A,DISPBIT ;(A)=(40h)
MOV R0,A ;送SECOND高到R0
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;取SECOND高的字符
MOV P0,A ;送出显示
MOV A,DISPBIT ;取第一个数码管位选
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P2,A ;送出位选
INC DISPBIT ;位选加1
MOV A,DISPBIT
CJNE A,#06,KNA ;判断是否为最后个数码管的位选
MOV DISPBIT,#00H ;是最后个数码管就清0
KNA: JNB SW1,JIANJISHU;判断减计时键按下否,按下就减计时
JNB SW2,DONE;否则判断暂停键按下否,按下就退出
INC T2SCNTA ;(49h)=#01;否则开始加计时
MOV A,T2SCNTA
CJNE A,#100,DONE ;判断是否为100?
MOV T2SCNTA,#00H
INC T2SCNTB
MOV A,T2SCNTB
CJNE A,#05,DONE ;判断是否为5,不是则返回
MOV T2SCNTB,#00H ;是(4AH)=#00
INC SECOND ;SECOND加1
MOV A,SECOND
CJNE A,#60,NEXTT ;是否为60S
MOV SECOND,#00H ;是则清0 SECOND
INC MINITE ;60S 则MINITE加1
MOV A,MINITE
CJNE A,#60,NEXTT ;是否为60M
MOV MINITE,#00H ;是则清0 MINITE
INC HOUR;60M则HOUR加1
MOV A,HOUR
CJNE A,#24,NEXTT
MOV HOUR,#00H
NEXTT: LCALL DISP ;否则显示
DONE:RETI
JIANJISHU:JNB SW2,DONE;开始减计时,判断暂停键按下否,按下就退出
INC T2SCNTA ;(49h)=#01;否则开始减计时
MOV A,T2SCNTA ;不是(a)=#01h
CJNE A,#100,DONE ;判断是否为100?
MOV T2SCNTA,#00H ;是(49H)=#00
INC T2SCNTB ;(4ah)=#01h
MOV A,T2SCNTB ;(A)=#01H
CJNE A,#05H,DONE ;判断是否为5,不是则返回
MOV T2SCNTB,#00H ;是(4AH)=#00
MOV A,SECOND
CJNE A,#00H,JIANMIAO;判断秒是否为0,不为0就秒减1
MOV SECOND,#59
MOV A,MINITE
CJNE A,#00H,JIANFEN;判断分是否为0,不为0则分减1
MOV MINITE,#59
MOV A,HOUR
CJNE A,#00H,JIANSHI;判断时是否为0,不为0则时减1
MOV HOUR,#00H
MOV MINITE,#00H
MOV SECOND,#00H
LCALL NEXTT
SJMP DONE
JIANMIAO:DEC SECOND ;SECOND减1
LCALL NEXTT
LJMP JIANJISHU
JIANFEN:DEC MINITE
LCALL NEXTT
LJMP JIANJISHU
JIANSHI:DEC HOUR;HOUR减1
LCALL NEXTT
LJMP JIANJISHU
INT_T1:
PUSH ACC
PUSH PSW
MOV TH1,#3CH
MOV TL1,#0B0H
MOV 21H,#00H
MOV 20H,#14H
MOV A,SECOND
CJNE A,#00H,NT;判断是否为整点
MOV A,MINITE
CJNE A,#00H,NT
LJMP LOOP1;是整点则响闹铃
NT:JNB SW2,LOOP1;判断暂停键按下否,按下则响铃
LJMP OUTT
LOOP1:CLR P1.6
DJNZ 20H,$
INC 21H
MOV A,21H
CJNE A,#60,LOOP1
SETB P1.6
POP PSW
POP ACC
RETI
OUTT:POP PSW
POP ACC
RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
TAB: DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -