数码管时钟电路的设计
数码管时钟电路的设计
LED 数码管时钟电路采用24小时计时方式,时、分、秒用六位数码管显示。采用AT89C2051单片机,可使用3V 电池供电,使用一个按键开关,可进入调时、省电(不显示LED 数码管)和正常显示三种状态。
1 时钟电路硬件的设计
电路如上图2-1,采用AT89C2051单片机最小化应用设计,LED 显示采用动态扫描方式实现,P1口输出段码数据,P3.0—P3.5口作扫描输出,P3.7接按钮开关。为了提供LED 数码管的驱动电流,用三极管9012作电源驱动输出。为了提高秒计时的精确性,采用12MHz 晶振。
2 系统主要程序的设计
(1)主程序
本设计中计时采用定时器T0中断完成,其余状态循环调用显示子程序,当P3.7端口开关按下时,转入调时功能程序。其主程序执行流程见图2-2。
(2)显示子程序
数码管显示的数据存放在内存单元70H —75H 中,其中70H —71H 存放秒数据,72H —73H 存放分数据,74H —75H 存放时数据,每一地址单元内均为十进制
BCD 码。由于采用软件动态扫描实现数据显示功能,显示用十进制BCD 码数据的对应段码存放在ROM 表中,显示时,先取出70H —75H 某一地址中的数据,然后查得对应的显示用段码从P1口输出,P3口将对应的数码管选中,就能显示该地址单元的数据值。
图2—2 主程序流程图 图2—3 T0中断服务程序
(3)定时器T0中断服务程序
定时器T0用于时间计时。定时溢出中断周期设为50ms ,中断累计20次(即1秒)时对秒计数单元进行加1操作。时间计数单元地址分别在70H —71H (秒)、
76H —77H (分)、78H —79H (时),7AH 单元内存放“熄灭符”数据(#0AH)。在计数单元中采用十进制BCD 码计数,满60进位,T0中断服务程序执行流程见图2-3。
(4)T1中断服务程序
T1中断服务程序用于指示调整单元数字的亮闪,在时间调整状态下,每过0.3秒,将对应单元的显示数据换成“熄灭符”数据(#0AH)。这样在调整时间时,对应调整单元的显示数据会间隔闪亮。
(5)调时功能程序
调时功能程序的设计方法是:按下按键,若按下时间小于1秒,进入省电状态(数码管不亮,时钟不停),否则进入调分状态,等待操作。此时计时器停止走动。当再按下按钮时,若按下时间小于0.5秒,则时间加1分,若按下时间大于0.5秒,则进入小时调整状态。在小时调整状态下,当按键按下的时间大于0.5秒时退出调整状态,时钟继续走动。
以下是LED 数码管时钟电路的完整源程序:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; AT89C2051时钟程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; 定时器T0、T1溢出周期为50MS ,T0为秒计数用, T1为调整时闪烁用,
; P3.7为调整按钮,P1口 为字符输出口,采用共阳显示管。
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START 执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序入口
LJMP INTT0 ;跳至INTTO 执行
ORG 0013H ;外中断1中断程序入口
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
START: MOV R0,#70H ;清70H-7AH 共11个内存单元
MOV R7,#0BH ;
CLEARDISP: MOV @R0,#00H ;
INC R0 ;
DJNZ R7,CLEARDISP ;
MOV 20H,#00H ;清20H (标志用)
MOV 7AH,#0AH ;放入“熄灭符”数据
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#0B0H
MOV TH0,#3CH
MOV TL1,#0B0H
MOV TH1,#3CH ;50MS 定时初值(T0计时用) ;50MS 定时初值 ;50MS 定时初值(T1闪烁定时用) ;50MS 定时初值 RETI ;外中断1中断返回 ORG 001BH ;定时器T1中断程序入口 LJMP INTT1 ;跳至INTT1执行 ORG 0023H ;串行中断程序入口地址 RETI ;串行中断程序返回
SETB EA ;总中断开放
SETB ET0 ;允许T0中断
SETB TR0 ;开启T0定时器
MOV R4,#14H ;1秒定时用初值(50MS ×20)
START1: LCALL DISPLAY ;调用显示子程序
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
SJMP START1 ;P3.7口为1时跳回START1
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 1秒计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
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
ADDMM: JC A,#60H,ADDMM ; 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小时
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 ;中断返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 闪动调时 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T1中断服务程序,用作时间调整时调整单元闪烁指示
INTT1: PUSH ACC ;中断现场保护
PUSH PSW ;
MOV TL1, #0B0H ;装定时器T1定时初值
MOV TH1, #3CH ;
DJNZ R2,INTT1OUT
MOV R2,#06H
CPL 02H
JB 02H,FLASH1 ;0.3秒未到退出中断(50MS 中断6次) ;重装0.3秒定时用初值 ;0.3秒定时到对闪烁标志取反 ;02H 位为1时显示单元“熄灭” MOV 72H,76H ;02H 位为0时正常显示
MOV 73H,77H ;
MOV 74H,78H ;
MOV 75H,79H ;
INTT1OUT: POP PSW ;恢复现场
POP ACC ;
RETI ;中断退出
FLASH1: JB 01H,FLASH2 ;01H 位为1时,转小时熄灭控制
MOV 72H,7AH ;01H 位为0时,“熄灭符”数据放入分 MOV 73H,7AH ;显示单元(72H-73H ),将不显示分数据 MOV 74H,78H ;
MOV 75H,79H ;
AJMP INTT1OUT ;转中断退出
FLASH2: MOV 72H,76H ;01H 位为1时,“熄灭符”数据放入小时 MOV 73H,77H ;显示单元(74H-75H ),小时数据将不显示 MOV 74H,7AH ;
MOV 75H,7AH ;
AJMP INTT1OUT ;转中断退出
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 加1子 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ADD1: MOV
DEC
SWAP A,@R0 ;取当前计时单元数据到A R0 ;指向前一地址 A ;A 中数据高四位与低四位交换
ORL
ADD
DA
MOV
ANL
MOV
MOV
INC
SWAP
ANL
MOV A,@R0 ;前一地址中数据放入A 中低四位 A,#01H ;A 加1操作 A ;十进制调整 R3,A ;移入R3寄存器 A,#0FH ;高四位变0 @R0,A ;放回前一地址单元 A,R3 ;取回R3中暂存数据 R0 ;指向当前地址单元 A ;A 中数据高四位与低四位交换 A,#0FH ;高四位变0 @R0,A ;数据放入当削地址单元中
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 清零程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 对计时单元复零用
CLR0: CLR
MOV
DEC
MOV A ;清累加器 @R0,A ;清当前地址单元 R0 ;指向前一地址 @R0,A ;前一地址单元清0
RET ;子程序返回
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 时钟调整程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 当调时按键按下时进入此程序
SETMM: cLR
CLR ET0 ;关定时器T0中断 TR0 ;关闭定时器T0
LCALL DL1S ;调用1秒延时程序
JB
MOV
SETB
SETB
SET2: JNB
SETB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电) R2,#06H ;进入调时状态,赋闪烁定时初值 ET1 ;允许T1中断 TR1 ;开启定时器T1 P3.7,SET1 ;P3.7口为0(键未释放),等待 00H ;键释放,分调整闪烁标志置1 SET4: JB
LCALL DL05S
JNB
MOV
LCALL
MOV
CLR
CJNE
HHH: JC
LCALL
CLR
AJMP
CLOSEDIS: SETB
SETB
CLOSE: JB
LCALL
JB
WAITH: JNB
LJMP
SETHH: CLR
SETHH1: JNB
SETB 01H
SET6: JB
LCALL DL05S P3.7,SET3 P3.7,SETHH R0,#77H ;ADD1 A,R3 C A,#60H,HHH SET4 CLR0 C SET4 ET0 TR0 P3.7,CLOSE DISPLAY P3.7,CLOSE P3.7,WAITH START1 00H P3.7,SET5 P3.7,SET7 ;等待键按下 ;有键按下,延时0.5秒 ;按下时间大于0.5秒转调小时状态 按下时间小于0.5秒加1分钟操作 ;调用加1子程序 ;取调整单元数据 ;清进位标志 ;调整单元数据与60比较 ;调整单元数据小于60转SET4循环 ;调整单元数据大于或等于60时清0 ;清进位标志 ;跳转到SET4循环 ;省电(LED 不显示)状态。开T0中断 ;开启T0定时器(开时钟) ;无按键按下,等待。 ;有键按下,调显示子程序延时削抖 ;是干扰返回CLOSE 等待 ;等待键释放 ;返回主程序(LED 数据显示亮) ;分闪烁标志清除(进入调小时状态) ;等待键释放 ;小时调整标志置1 ;等待按键按下 ;有键按下延时0.5秒
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整 MOV
LCALL
MOV
CLR
CJNE R0,#79H ;按下时间小于0.5秒加1小时操作 ADD1 ;调加1子程序 A,R3 ; C ; A,#24H,HOUU ;计时单元数据与24比较 HOUU: JC
LCALL
AJMP
SETOUT: JNB
LCALL
JNB
CLR
CLR
CLR
CLR
CLR
SETB
SETB
LJMP
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 SET6 CLR0 SET6 P3.7,SETOUT1 DISPLAY P3.7,SETOUT 01H 00H 02H TR1 ET1 TR0 ET0 START1 ;小于24转SET6循环 ;大于或等于24时清0操作 ;跳转到SET6循环 ;调时退出程序。等待键释放 ;延时削抖 ;是抖动,返回SETOUT 再等待 ;清调小时标志 ;清调分标志 ;清闪烁标志 ;关闭定时器T1 ;关定时器T1中断 ;开启定时器T0 ;开定时器T0中断(计时开始) ;跳回主程序 ;键释放等待时调用显示程序(调分) ;防止键按下时无时钟显示 ;等待调分按键时时钟显示用 ;键释放等待时调用显示程序(调小时);防止键按下时无时钟显示 ;等待调小时按键时时钟显示用 ;退出时钟调整时键释放等待 ;防止键按下时无时钟显示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数据在70H-75H 单元内,用六位LED 共阳数码管显示,P1口输出段码数据,P3口作 ; 扫描控制,每个LED 数码管亮1MS 时间再逐位循环。
DISPLAY: MOV
MOV
PLAY: MOV
MOV
MOV
MOV
MOVC
MOV
LCALL
INC
MOV
JNB
RL
MOV
AJMP
ENDOUT: SETB
MOV R1,#70H ;指向显示数据首址 R5,#0FEH ;扫描控制字初值 A,R5 ;扫描字放入A P3,A ;从P3口输出 A,@R1 ;取显示数据到A DPTR,#TAB ;取段码表地址 A,@A+DPTR ;查显示数据对应段码 P1,A ;段码放入P1口 DL1MS ;显示1MS R1 ;指向下一地址 A,R5 ;扫描控制字放入A ACC.5,ENDOUT ;ACC.5=0时一次显示结束 A ;A 中数据循环左移 R5,A ;放回R5内 PLAY ;跳回PLAY 循环 P3.5 ;一次显示结束,P3口复位 P1,#0FFH ;P1口复位
RET ;子程序返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ; 共阳段码表 “0”“1”“2” “3”“4”“5”“6”“7” “8”“9”“不亮” ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 延时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;1MS 延时程序,LED 显示程序用
DL1MS: MOV
DL1: MOV
DL2: DJNZ
DJNZ
RET
;20MS 延时程序,采用调用显示子程序以改善LED 的显示闪烁现象 DS20MS: ACALL
ACALL
ACALL
RET
;延时程序,用作按键时间的长短判断
DL1S: LCALL DL05S
LCALL DL05S
RET
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒 DL05S1: LCALL DISPLAY
DJNZ R3,DL05S1
RET
;
END ;程序结束 DISPLAY DISPLAY DISPLAY R6,#14H R7,#19H R7,DL2 R6,DL1