来源:C51之家 作者:未知
单片机的6位数码管电子钟程序
;;显示缓冲单元在70H—75H,70H—71H显示秒,72H—73H显示分,74H—75H显示时
;;时间计数单元在70H—71H(秒)、76H—77H(分)、78H—79H(时),7AH单元放熄灭符(#0AH)
;;计数单元采用BCD码计数,定时器T0设置为50MS溢出中断,为秒计数用,
;;定时器T1为调整时闪烁用
;;P3.2为调整按钮,P0口为字符输出口,P2.1-P2.6为位控制口-采用共阳显示管。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H
LJMP START
ORG 0003H
RETI ;;不用的中断,抗干扰
;---------------------------------
ORG 000BH ;;定时器0中断
LJMP INTT0
;--------------------------------------------
ORG 0013H
RETI ;;不用的中断,抗干扰
;;;===========================================
ORG 001BH ;;定时器1中断,调整时闪烁
LJMP INTT1
;----------------------------------------------
ORG 0023H
RETI ;;不用的中断,抗干扰
ORG 002BH
RETI ;;不用的中断,抗干扰
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START:
MOV R0, #70H ;;时间计数单元在70H
MOV R7, #0BH ;;
MOV 20H, #00H ;;
CLEARDISP:
MOV @R0, #00H ;;清地址单元70H--7BH
INC R0
DJNZ R7,CLEARDISP
MOV 7AH,#0AH ;;地址单元7AH熄灭符=0AH(1010)
MOV TMOD,#11H ;;定时器0-1方式1工作
MOV TL0, #0B0H ;;
MOV TH0, #3CH ;;3CB0H
MOV TL1, #0B0H ;;
MOV TH1, #3CH ;;3CB0H
SETB EA ;;总中断允许
SETB ET0 ;;定时器0中断允许
SETB TR0 ;;启动定时器0
MOV R4,#14H ;;20D
START1:
LCALL DISPLAY ;;调显示
JNB P3.2,SETMM1 ;查询按键
SJMP Start1 ;;
SETMM1:
LJMP SETMM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1秒定时程 序 ;;定时中断0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT0:
PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
MOV A,#0B7H ;中断同步修正重新设定定时初值
ADD A,TL0
MOV TL0,A
MOV A,#3CH
ADD A,TH0
MOV TH0,A
SETB TR0 ;;启动定时器0
DJNZ R4, OUTT0 ;;1秒到
ADDSS: ;;秒处理70H-71H
MOV R4,#14H ;;20D
MOV R0,#71H ;;
ACALL ADD1 ;;加1程序秒
MOV A,R3
CLR C
CJNE A,#60H,ADDMM ;;1分到
ADDMM: ;;分处理76H-77H
JC OUTT0
ACALL CLR0
MOV R0,#77H
ACALL ADD1 ;;加1程序
MOV A,R3
CLR C
CJNE A,#60H,ADDHH ;;1小时到
ADDHH: ;;小时处理78H-79H
JC OUTT0
ACALL CLR0
MOV R0,#79H
ACALL ADD1 ;;加1程序-时
MOV A,R3
CLR C
CJNE A,#24H,HOUR ;;1天到
HOUR:
JC OUTT0 ;;C=0跳
ACALL CLR0
OUTT0:
MOV 72H,76H ;;分72H-73H
MOV 73H,77H ;;
MOV 74H,78H ;;时74H-75H
MOV 75H,79H ;;
POP PSW
POP ACC
SETB ET0
RETI
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 闪动调时程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT1:
PUSH ACC ;;
PUSH PSW
MOV TL1, #0B0H ;;
MOV TH1, #3CH ;;
DJNZ R2,INTT1OUT ;;
MOV R2,#06H ;;
CPL 02H ;;
JB 02H,FLASH1 ;;
MOV 72H,76H ;;
MOV 73H,77H ;;
MOV 74H,78H ;;
MOV 75H,79H ;;
INTT1OUT: ;;
POP PSW
POP ACC
RETI
FLASH1:
JB 01H,FLASH2 ;;
MOV 72H,7AH ;;
MOV 73H,7AH ;;
MOV 74H,78H ;;
MOV 75H,79H ;;
AJMP INTT1OUT ;;
FLASH2:
MOV 72H,76H ;;
MOV 73H,77H ;;
MOV 74H,7AH ;;
MOV 75H,7AH ;;
AJMP INTT1OUT ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ADD1: MOV A,@R0 ;;--71H
DEC R0 ;;--70H
SWAP A ;;
ORL A,@R0 ;;
ADD A,#01H ;;
DA A ;;
MOV R3,A ;;
ANL A,#0FH ;;
MOV @R0,A ;;70H
MOV A,R3 ;;
INC R0 ;;71H
SWAP A ;;
ANL A,#0FH ;;
MOV @R0,A ;;71H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
CLR0: CLR A
MOV @R0,A
DEC R0
MOV @R0,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 时钟调整程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
SETMM:
CLR ET0 ;;禁止定时器0中断
CLR TR0 ;;停止定时器0
LCALL DL1S
JB P3.2,CLOSEDIS
MOV R2,#06H
SETB ET1
SETB TR1
SET2:
JNB P3.2,SET1
SETB 00H
SET4:
JB P3.2,SET3
LCALL DL05S
JNB P3.2,SETHH
MOV R0,#77H ;加1分程序
LCALL ADD1
MOV A,R3
CLR C
CJNE A,#60H,HHH
HHH: JC SET4
LCALL CLR0
CLR C
AJMP SET4
CLOSEDIS:
SETB ET0
SETB TR0
CLOSE:
JB P3.2,CLOSE
LCALL DISPLAY
JB P3.2,CLOSE
WAITH:
JNB P3.2,WAITH
LJMP START1
SETHH:
CLR 00H
SETHH1:
JNB P3.2,SET5
SETB 01H
SET6: JB P3.2,SET7
LCALL DL05S
JNB P3.2,SETOUT
MOV R0,#79H
LCALL ADD1
MOV A,R3
CLR C
CJNE A,#24H,HOUU
HOUU: JC SET6
LCALL CLR0
AJMP SET6
SETOUT:
JNB P3.2,SETOUT1
LCALL DISPLAY
JNB P3.2,SETOUT
CLR 01H
CLR 00H
CLR 02H
CLR TR1
CLR ET1
SETB TR0
SETB ET0
LJMP START1
SET1: LCALL DISPLAY
AJMP SET2
SET3: LCALL DISPLAY
AJMP SET4
SET5: LCALL DISPLAY
AJMP SETHH1
SET7: LCALL DISPLAY
AJMP SET6
SETOUT1: LCALL DISPLAY
AJMP SETOUT
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY:
MOV R1,#70H ;;70H—71H显示秒,72H—73H显示分,74H—75H显示时
MOV R5,#0BFH ;;1011 1111 开始显示 P2.6
PLAY:
MOV A,R5 ;;
MOV P2,A ;;1011 1111
MOV A,@R1 ;;
MOV DPTR,#TAB ;;
MOVC A,@A+DPTR ;;
MOV P0,A ;;段
LCALL DL1MS ;;延时1MS
INC R1 ;;
MOV A,R5 ;;
JNB ACC.1,ENDOUT ;;=0跳 显示到P2.1=0
RR A ;;1011 1111---1101 1111
MOV R5,A ;;
AJMP PLAY ;;
ENDOUT:
SETB P2.1
MOV P0,#0FFH
RET
TAB: DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H ;;84*14=1176
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;-----------------------
DS20MS: ACALL DISPLAY
ACALL DISPLAY
ACALL DISPLAY
RET
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H
DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
END