51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。
% X, S; C$ f) k) o1 H# F" R 时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 q* C* U" j7 j" p8 ?
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 6 C z, n6 L. ?7 b
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
0 O/ z. E6 F% | H0 P; ~& T' l; {- l! U/ X
+ J& h$ [, z( k! w
r" G, S1 D6 s* i0 j 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
/ i; V1 P9 A' k" y0 z- a- x9 k;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/ X$ @; d, K4 T, U/ m) T;; 中断入口程序 ;; (仅供参考)
- c" O0 y3 c4 l$ l$ J% J7 }# d% {: r5 m;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
( c& Q4 Y. ^- u- c" H4 L/ g7 l! x5 K;
m, P5 U1 d- ^2 j% A. Z5 v' z5 jORG 0000H ;程序执行开始地址1 _4 P1 Z3 l O1 Q
LJMP START ;跳到标号START执行
: J$ C( y! z+ ^7 X( xORG 0003H ;外中断0中断程序入口
/ X, n2 i, I0 ] u+ P( o: m6 }RETI ;外中断0中断返回. _8 v, h% a2 I- T
ORG 000BH ;定时器T0中断程序入口% ?* ^0 z X' g& h" ~) J8 k
LJMP INTT0 ;跳至INTTO执行
5 H* e6 l0 q. _ORG 0013H ;外中断1中断程序入口! _6 f$ j- m1 O
RETI ;外中断1中断返回
+ `0 l; {3 L, eORG 001BH ;定时器T1中断程序入口
+ D; O4 v, g9 _7 [8 g& z) oLJMP INTT1 ;跳至INTT1执行3 Y T3 e: U1 r' \) z) X6 {
ORG 0023H ;串行中断程序入口地址
6 {6 i. j' b' uRETI ;串行中断程序返回: C& g, y, e( \ i3 g
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$ o, \$ ^; a V# n
;; 主 程 序 ;;+ p: C- E0 z* F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 U! N8 s; m8 a4 j
;/ P6 ?+ [( s9 s) H
START: MOV R0,#70H ;清70H-7AH共11个内存单元7 {# K8 |% t& \" u/ z1 r) _& h! B# s
MOV R7,#0BH
6 g1 j+ [7 N( |8 K. {# M X;clr P3.7 ;) b3 n7 M2 ]0 q& ?
CLEARDISP: MOV @R0,#00H ;
. Y. f* p Z; T: SINC R0 ;7 q; j% g( w1 @, Q( b
DJNZ R7,CLEARDISP ;2 ^9 g9 ]" ?1 O) v9 ]7 P9 r
MOV 20H,#00H ;清20H(标志用)
0 j. y1 Q6 [; ^0 JMOV 7AH,#0AH ;放入"熄灭符"数据9 V# l' G9 `0 [3 ], i
MOV TMOD,#11H ;设T0、T1为16位定时器
. i* W9 ~2 ] z$ H# I/ {; KMOV TL0,#0B0H ;50MS定时初值(T0计时用)
, x& q! ^; l3 eMOV TH0,#3CH ;50MS定时初值; n( I" ]8 n! t& O' `
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
! D, y$ S' T' @* ^MOV TH1,#3CH ;50MS定时初值
& [' [, x# V9 E v9 v, { X/ a3 XSETB EA ;总中断开放2 `1 Z( G6 i4 K
SETB ET0 ;答应T0中断) x1 d6 A$ w1 @5 {8 K( B
SETB TR0 ;开启T0定时器: j4 O+ p K' G, \. ^! z
MOV R4,#14H ;1秒定时用初值(50MS×20)
3 r* ^/ w/ K( LSTART1: LCALL DISPLAY ;调用显示子程序+ I2 p9 E7 N) i3 X8 D' x6 U
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
% X' d1 [. Z) k( d. W& gSJMP START1 ;P3.7口为1时跳回START1
" e9 I5 x$ T6 g9 m+ l: WSETMM1: LJMP SETMM ;转到时间调整程序SETMM4 i- w- | T8 R& n8 ]
;( o% `) T5 P6 A6 }* o
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5 X$ L6 ]8 f( w4 J0 D& v
;; 1秒计时程序 ;;8 b" U" x3 P& R2 V3 D
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 n+ T1 b. {5 e, X7 f; X
;T0中断服务程序
. H# U/ Y, H* `INTT0: PUSH ACC ;累加器入栈保护
6 \3 s! i/ o" GPUSH PSW ;状态字入栈保护) Y5 e( r5 g8 D6 N
CLR ET0 ;关T0中断答应
4 n9 ]( X* |! X/ l) [5 D+ @) xCLR TR0 ;封闭定时器T0
9 m. o# b8 a0 w% s8 c+ \MOV A,#0B7H ;中断响应时间同步修正% a/ Z7 |6 J; V
ADD A,TL0 ;低8位初值修正
. K) L! @5 a3 B* [MOV TL0,A ;重装初值(低8位修正值)& Q0 f, }' N" w& l0 O+ D1 Q: s2 l
MOV A,#3CH ;高8位初值修正% F, P5 L6 ?( h. V* i2 p9 o$ D" e
ADDC A,TH0 ;
+ a; [* l+ n) A* c9 P6 M, Q) UMOV TH0,A ;重装初值(高8位修正值)
/ {+ ~ W5 a7 R+ U, KSETB TR0 ;开启定时器T0
+ h& d3 l, }% `/ H5 dDJNZ R4, OUTT0 ;20次中断未到中断退出9 f9 o5 J. z3 r3 t% h3 f
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值5 D1 n) c/ M# L. l
MOV R0,#71H ;指向秒计时单元(71H-72H)
; s- U+ I) M2 F. N* aACALL ADD1 ;调用加1程序(加1秒操作)
' S8 \4 w: w, E, ], sMOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
3 ~/ k! Y% {# q- z' u: bCLR C ;清进位标志
8 U3 o9 z& E; l, sCJNE A,#60H,ADDMM ;. W3 B9 V7 d' [' ^* e9 d
ADDMM: JC OUTT0 ;小于60秒时中断退出. ~$ i" n% O$ L+ c
ACALL CLR0 ;大于或即是60秒时对秒计时单元清0: ]4 A0 x7 }$ y6 |/ v
MOV R0,#77H ;指向分计时单元(76H-77H)2 T+ m" X: ]. i8 H/ }1 a) l+ K) d
ACALL ADD1 ;分计时单元加1分钟/ v6 x$ I. v/ {" T+ ^3 ^
MOV A,R3 ;分数据放入A
: ]' W( f5 ^6 G7 y- lCLR C ;清进位标志1 {& j- ]" d- {# k* f4 j5 J9 g
CJNE A,#60H,ADDHH ;, [; M# n& E2 W1 Z6 V. `+ ?' S; e
ADDHH: JC OUTT0 ;小于60分时中断退出0 e# `& b" c9 ]+ v) n7 C
ACALL CLR0 ;大于或即是60分时分计时单元清0
, l; B# Q5 z% W A$ J; d ?# JMOV R0,#79H ;指向小时计时单(78H-79H)! `; h8 b$ r6 e, a. ]. ^* i/ I
ACALL ADD1 ;小时计时单元加1小时
# T: R3 \. J* fMOV A,R3 ;时数据放入A" K: |4 O, l9 k
CLR C ;清进位标志7 g9 r3 i9 B9 j4 U% l
CJNE A,#24H,HOUR ;. w' ?$ l: O! L2 I9 J/ Z1 J
HOUR: JC OUTT0 ;小于24小时中断退出
8 h$ Y/ R B; Z0 j! DACALL CLR0 ;大于或即是24小时小时计时单元清0
* M( Q) m' T3 D9 j+ M/ A! h9 WOUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移 G6 X, a1 l+ S8 s
MOV 73H,77H ;入对应显示单元
3 T& i ]( s3 o i- ]MOV 74H,78H ;
, R, W. ]8 Q9 F# `( s" ZMOV 75H,79H ;
2 x: V6 ^6 N# tPOP PSW ;恢复状态字(出栈)
9 | f5 T" S FPOP ACC ;恢复累加器
C6 X4 G# ^1 L% v* i& k9 ySETB ET0 ;开放T0中断
. n: o* Y4 |5 f6 U5 gRETI ;中断返回9 e) q; z0 R- p- H+ f; T
;
! y5 _$ }& c$ H8 u$ B9 w4 c;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;! ?1 v1 R( l) ^# @. l0 z' ]
;; 闪动调时 程 序 ;;
. M( z0 Q! O( u% m5 O$ |;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
! K& h/ D7 d% x- [;T1中断服务程序,用作时间调整时调整单元闪烁指示) N% ~1 b; h( a* G
INTT1: PUSH ACC ;中断现场保护
2 u9 r) a# j7 y; Z' G4 YPUSH PSW ;
! N ?0 f4 a) E2 C6 _MOV TL1, #0B0H ;装定时器T1定时初值9 S6 E' ^. J0 Q3 k& j& m2 T9 c
MOV TH1, #3CH ;
0 F( A! x" L' ^& LDJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)' g* n7 l1 b' |0 z
MOV R2,#06H ;重装0.3秒定时用初值
7 T$ {" c1 b# wCPL 02H ;0.3秒定时到对闪烁标志取反4 d Y- j! o' m# w; J
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
! R; r* m& a4 P( MMOV 72H,76H ;02H位为0时正常显示
6 f/ S+ ^ w9 D" C& gMOV 73H,77H ;
; Y; e+ u* o+ g% u: i- NMOV 74H,78H ;; [. z( c8 q0 x p; R. U, S5 V
MOV 75H,79H ;
+ p2 s% A) }% s& g; zINTT1OUT: POP PSW ;恢复现场, F! p1 f! U8 g
POP ACC ;4 p4 A3 c. `/ _
RETI ;中断退出4 K& I5 H1 |% a$ ?4 c$ { B, J
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
' X, p3 M' h. b0 T2 p4 sMOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
) l* c& j; j; I8 t+ _/ h9 l3 FMOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
' ?6 ^3 }( x6 y5 DMOV 74H,78H ;
4 G( N) p% X" \+ M* `1 s2 lMOV 75H,79H ;. G9 _; O) Q6 u( |. ?4 V' Z' G
AJMP INTT1OUT ;转中断退出; i$ H8 Y5 c0 i+ S0 b* l: [ N! M
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时( x0 s" S6 b. p3 C
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示$ B- ^. k- i: m/ U. |$ {4 f: Y
MOV 74H,7AH ;
; Q6 l0 K; D1 [9 K* ~7 n! [1 `1 iMOV 75H,7AH ;
+ X& y& {( b' s( s( K9 zAJMP INTT1OUT ;转中断退出7 b' ~: d" [. n5 o
;0 G* }! d! t7 U; Z
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 j# F3 V( g( ]! J;; 加1子 程 序 ;;
/ y5 u' l7 e- J1 D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ {. g5 Y# b% f4 q8 J% i3 |& C;
* C9 w: l& Z" I% ?& c: _$ ]/ UADD1: MOV A,@R0 ;取当前计时单元数据到A" c9 s) }" I: a
DEC R0 ;指向前一地址, {( w+ u/ J% J3 |( d# i* {9 ~
SWAP A ;A中数据高四位与低四位交换
! O& W/ U4 T8 i0 J8 OORL A,@R0 ;前一地址中数据放入A中低四位
' R* D6 e! _3 `/ \+ e8 P, t r8 ZADD A,#01H ;A加1操作
& S" e" b5 L j b3 H LDA A ;十进制调整7 {0 `/ |0 Z8 ]2 ^( [
MOV R3,A ;移入R3寄存器) Q H' `. C: q- d0 Q) X. {( w$ S! D
ANL A,#0FH ;高四位变0- Z/ f( }6 n3 h3 V7 p1 f& J
MOV @R0,A ;放回前一地址单元
0 s. D$ ~7 i9 N$ r dMOV A,R3 ;取回R3中暂存数据
$ e0 [6 h1 \/ y2 v, wINC R0 ;指向当前地址单元0 x: f8 z7 P4 L! ]% u
SWAP A ;A中数据高四位与低四位交换
1 }4 @3 _& h/ M+ v0 P. G$ U$ SANL A,#0FH ;高四位变0
5 ~0 o: _! K/ | A" R hMOV @R0,A ;数据放入当削地址单元中+ k+ X" J( R* J H
RET ;子程序返回
W& [4 |% |# `;; o: X/ H9 z; o( Q: e: T
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 l, ]! o: U3 N) y$ F( y
;; 清零程序 ;;
& i% a$ f5 P( D, b. Z;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; p6 V1 E1 M* r3 E( e2 m1 P" `;.............
. m+ z& M+ z c8 y' P+ ^; l" X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
# W0 a* {3 v5 U9 U# M;; 时钟调整程序 ;;
' j3 F' W/ e: Z8 q- J C/ ]8 D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4 k7 o1 v' L3 a& C" Z) Y |6 M7 e
;当调时按键按下时进入此程序8 G2 o1 Z; @, w5 ^
SETMM: cLR ET0 ;关定时器T0中断
5 ?4 H9 T0 }5 FCLR TR0 ;封闭定时器T0
3 @1 j% a: ?) [LCALL DL1S ;调用1秒延时程序
- }/ U: d2 f X. N/ Q- U9 u# tJB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)
- ^% f+ u, o" m3 Z1 ?MOV R2,#06H ;进入调时状态,赋闪烁定时初值: l0 B2 s, \ V
SETB ET1 ;答应T1中断
' ~% a4 r- e& `9 I: o! V/ OSETB TR1 ;开启定时器T1
t. S$ y$ h) ]1 ~7 I2 V. {SET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待
/ e+ [' z2 _; ~& r! Q. `8 KSETB 00H ;键开释,分调整闪烁标志置1
- K4 A& Q$ b8 z1 x7 j; tSET4: JB P3.7,SET3 ;等待键按下
: L* B1 {' `# e! yLCALL DL05S ;有键按下,延时0.5秒
- S( e3 r0 O- e- J8 t% l% j [JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
7 G, N& C" s# n8 p1 L' pMOV R0,#77H ;按下时间小于0.5秒加1分钟操作( b5 U& {& h. z0 d. X( C. t
LCALL ADD1 ;调用加1子程序
6 e- a# {+ e! B% GMOV A,R3 ;取调整单元数据8 e: N# a# i: l
CLR C ;清进位标志
5 z% p {3 C$ b- r8 K+ W3 ~CJNE A,#60H,HHH ;调整单元数据与60比较" C- P6 W4 k" |* c. v
HHH: JC SET4 ;调整单元数据小于60转SET4循环8 |3 t( _# p4 Y8 k
LCALL CLR0 ;调整单元数据大于或即是60时清00 Q3 v, G/ f# z2 j% G
CLR C ;清进位标志
3 ^3 W6 V. S0 k/ L- G* j) }3 KAJMP SET4 ;跳转到SET4循环" G# ~9 d; H* U1 R& H# T6 E1 _, B- c
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
: |3 x! z E' E4 F1 g/ v- vSETB TR0 ;开启T0定时器(开时钟)
9 z5 |( @' T$ a% h" FCLOSE: JB P3.7,CLOSE ;无按键按下,等待。
}# m* X$ H ~/ l1 o. l6 ILCALL DISPLAY ;有键按下,调显示子程序延时削抖3 [* r2 }" D0 {- s9 Y F
JB P3.7,CLOSE ;是干扰返回CLOSE等待
7 U# y' L' P# ~* I' \WAITH: JNB P3.7,WAITH ;等待键开释
* K) C7 {6 x" R" _9 N+ g4 E5 ~LJMP START1 ;返回主程序(LED数据显示亮)7 ~ n+ r; V, \1 @5 _# n; c( e4 d" k
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
& R( |, O. _9 r% n6 USETHH1: JNB P3.7,SET5 ;等待键开释) ~: d* J) w! [* c2 ^# v" X* a
SETB 01H ;小时调整标志置1! o0 ?: T) u% T* \" Y m* P# {
SET6: JB P3.7,SET7 ;等待按键按下1 P* \; k5 D1 i" }3 @5 ~
LCALL DL05S ;有键按下延时0.5秒8 |8 k0 v2 T; h( o/ j
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
- k$ z5 y% V% N* n% K0 `0 QMOV R0,#79H ;按下时间小于0.5秒加1小时操作8 q; J1 H! b( T) l; z! ?
LCALL ADD1 ;调加1子程序! m) n# L# B5 g5 ~
MOV A,R3 ;! ]6 r9 P) M( z
CLR C ;
" o/ e+ g7 b+ i, J* O# uCJNE A,#24H,HOUU ;计时单元数据与24比较 u) ?+ o0 Y r, e
HOUU: JC SET6 ;小于24转SET6循环
; c( R: y6 |- m4 [$ M2 `LCALL CLR0 ;大于或即是24时清0操作
, l, |# ~1 o% o4 u- l' L' bAJMP SET6 ;跳转到SET6循环
4 S8 {, c* J" W( ~, ^' Z% ASETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释! z+ M! Z2 U! T& p7 b; _
LCALL DISPLAY ;延时削抖
{% n' L! j' d. J. VJNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
, L0 `' y$ J) b* L! ]CLR 01H ;清调小时标志; ^/ F( X8 ~# q* Z3 _4 n
CLR 00H ;清调分标志
& C4 Y0 c: c5 T+ J. U' FCLR 02H ;清闪烁标志) W) R- Z& t" J
CLR TR1 ;封闭定时器T1, a g% S1 [ a' a$ Q' Y; [* F
CLR ET1 ;关定时器T1中断9 k8 i% ` t, I2 e, |) D
SETB TR0 ;开启定时器T0
; M9 A/ l$ `; i4 \# bSETB ET0 ;开定时器T0中断(计时开始)
% k$ _7 I9 N; n- x$ b! qLJMP START1 ;跳回主程序
9 A+ i# M1 p1 aSET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
1 A' t! x" ~1 d7 n% L0 q0 A0 @AJMP SET2 ;防止键按下时无时钟显示/ f% i( Q/ r" _3 p" v
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用* M2 _4 m9 m' H- @' I! W9 ?
AJMP SET4; V8 b( A; Z0 p0 m
SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)" K3 ^9 W8 t. q% s; X- E
AJMP SETHH1 ;防止键按下时无时钟显示- h8 L! u5 @* c# z
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
( @& a$ X- n! t. oAJMP SET62 M8 ^' \& _. C
SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
( e$ y* O/ L9 M4 L/ \ Z: RAJMP SETOUT ;防止键按下时无时钟显示
: }/ O* `' }8 c/ }9 r$ o;5 u7 G$ X* a" m6 V, U
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 D! a$ z$ ~! r S R;; 显示程序 ;;
: C/ p O1 P9 J6 l& S6 r. g1 |! P;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: w+ ^7 ^7 W8 j! u- D$ b' d. L
$$$$$$$$$$$$$$$$$$$$$$$$$$$+ N: {) d! }% Z1 T
;1MS延时程序,LED显示程序用
$ X0 ?* ~0 f- U8 ]; K* z9 vDL1MS: MOV R6,#14H; l# q6 k2 l$ k) ^- a2 w
DL1: MOV R7,#19H- {) t q+ b: B1 G, @: t
DL2: DJNZ R7,DL2- {* s1 k7 |7 j$ E
DJNZ R6,DL18 ~. M0 P* L/ ]
RET
- {; w0 J! e/ ]: J0 m7 x;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
7 E& } [& b# L0 X2 ^& cDS20MS: ACALL DISPLAY
6 i, \/ y l" @$ z$ TACALL DISPLAY
+ m) f( U4 R. t- _+ }ACALL DISPLAY7 b1 h& b4 s& m9 `9 W# `) F
RET2 b2 t8 K& G( f: R! m" V
;延时程序,用作按键时间的长短判定
! q8 Z) R' E. O L* nDL1S: LCALL DL05S
9 u6 S3 P3 I y7 j* iLCALL DL05S
# A- Z1 v! |$ {% {, [ \ H# w5 z* FRET j! c# A( ]7 D0 ~; r; K" ?
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
- i: X0 M/ A& b5 r# i% t; ?DL05S1: LCALL DISPLAY
" |8 l* x* G! sDJNZ R3,DL05S1& R4 ?' J" b2 c0 `- o
RET
; R4 ~1 q) H; T1 h) e3 X2 wEND ;程序结束
: \( \% N! [# Z% l7 O9 z |