51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 / @5 M3 n5 i" ?" n1 q
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 % C* W! V4 n5 z3 C9 F
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 & g# ?9 c* U, n4 q8 L) y6 S
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
. L) W) f5 q! Q4 r) E) G8 K
9 @/ g- y! e* k
% I3 i% W' V7 t1 q3 p" X E* f
3 u( Z: q6 F; e1 H: F 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
6 _9 d, O! a+ X% @7 u3 a" _( q9 [;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
* J0 Z- U* v" r7 ]# a( R. l;; 中断入口程序 ;; (仅供参考)) s$ `6 Y% m1 y; X, Q
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; G8 J) {7 G* G# R4 [. D$ u+ \
;
4 a5 [( N4 H, X- `ORG 0000H ;程序执行开始地址
5 |* l% ]8 C; g/ O# W+ L7 ULJMP START ;跳到标号START执行
4 n6 N. j# Z7 |( R z1 {ORG 0003H ;外中断0中断程序入口+ z$ }7 V- S+ |4 k V2 w
RETI ;外中断0中断返回2 M' E4 i' G" o( b( g" t8 a4 F
ORG 000BH ;定时器T0中断程序入口: M8 R3 Z% |9 a5 l% S
LJMP INTT0 ;跳至INTTO执行
; G9 V& Q1 |# S0 J8 C2 i* M0 i& hORG 0013H ;外中断1中断程序入口
3 Q3 p! s' ?# ~" KRETI ;外中断1中断返回8 B) ] z7 x# ~# r
ORG 001BH ;定时器T1中断程序入口0 v7 K4 @1 r/ J
LJMP INTT1 ;跳至INTT1执行
8 _, A! j8 Q& J* Y. V) x0 XORG 0023H ;串行中断程序入口地址
5 x% Q- D+ c7 _& |3 N1 ^RETI ;串行中断程序返回
/ f( t1 d1 s8 c+ S8 O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0 ?; {2 D; ~0 v# B! I6 Y;; 主 程 序 ;;: f" H0 Z8 ^$ B c/ {& Y
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 \/ ?6 @: h$ B6 q. l L, G# ^;4 w* R& x, G1 F2 y
START: MOV R0,#70H ;清70H-7AH共11个内存单元
: t' \! `' ~% E. B& I% MMOV R7,#0BH 0 S5 N7 q0 S0 \$ Z
;clr P3.7 ;& h# h2 q' B3 d7 C$ v
CLEARDISP: MOV @R0,#00H ;/ c. d- i2 a R! ~
INC R0 ;
1 C5 x) [7 P: N3 q/ v& Z) kDJNZ R7,CLEARDISP ;
3 A4 ~# U4 n! u, r$ X4 l8 tMOV 20H,#00H ;清20H(标志用)/ T0 n- [9 g( b
MOV 7AH,#0AH ;放入"熄灭符"数据 D1 S' j5 v0 Q: U; v$ \
MOV TMOD,#11H ;设T0、T1为16位定时器
. ^" h% m) w7 F1 n s. UMOV TL0,#0B0H ;50MS定时初值(T0计时用)6 w% M M) L0 |
MOV TH0,#3CH ;50MS定时初值
- o- }& e/ \' g: b3 F( ?MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
) w% e7 a w3 `) d0 s& PMOV TH1,#3CH ;50MS定时初值1 t: ^0 B7 X# e6 B5 }) ^% X
SETB EA ;总中断开放
5 W. }+ h/ Z# qSETB ET0 ;答应T0中断% ?; @4 o1 N- `
SETB TR0 ;开启T0定时器( q) y5 c/ P4 L4 K! f6 v
MOV R4,#14H ;1秒定时用初值(50MS×20)
5 W8 n, B. \2 w. ?START1: LCALL DISPLAY ;调用显示子程序8 G {0 ]9 ?; L- ^3 |
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
1 A6 I, m0 E7 T' G7 g) S9 s. w) E# p# DSJMP START1 ;P3.7口为1时跳回START1
) m' @# E+ B% G, ]5 ]4 ~SETMM1: LJMP SETMM ;转到时间调整程序SETMM& }6 O( R, h8 Q1 q" z5 L
;4 D/ t1 b, h L W6 R, d9 K
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 k* i6 n4 K, G+ g
;; 1秒计时程序 ;;
1 B- Z0 Q# |+ J7 S3 J V( x;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ P. b4 ]1 t8 H1 F( d2 O;T0中断服务程序0 a l2 D& ~# I4 Z
INTT0: PUSH ACC ;累加器入栈保护2 ~% W* X8 s0 }; R
PUSH PSW ;状态字入栈保护
+ D% z' H& @; ACLR ET0 ;关T0中断答应
' s* M4 J. m- ^0 ^0 ~. XCLR TR0 ;封闭定时器T0
. N# H O1 G# C8 Z) iMOV A,#0B7H ;中断响应时间同步修正
7 V2 y: W1 @: iADD A,TL0 ;低8位初值修正
+ z6 K. y* \/ {MOV TL0,A ;重装初值(低8位修正值)1 E: e$ A" m8 r' Z2 V
MOV A,#3CH ;高8位初值修正! @; @" i, s5 k4 X
ADDC A,TH0 ;3 ]) W; \# @! n7 e& o
MOV TH0,A ;重装初值(高8位修正值)# l& C5 H( w5 s% L# J
SETB TR0 ;开启定时器T0: T7 R" K8 ?: A" h$ J, O% L
DJNZ R4, OUTT0 ;20次中断未到中断退出
6 h7 x, R9 W) d8 ]ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
+ n* B5 {' f1 {MOV R0,#71H ;指向秒计时单元(71H-72H)* k. c3 e" O8 W$ a: K) W
ACALL ADD1 ;调用加1程序(加1秒操作)
' B8 k* c/ d2 a1 W$ [6 B6 E QMOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
4 }5 Y# m4 O* B3 M8 t cCLR C ;清进位标志
% Z* l2 n# W a) f. e- TCJNE A,#60H,ADDMM ;# A- l& Y. D2 l
ADDMM: JC OUTT0 ;小于60秒时中断退出
- K1 w* f2 P) X' H- iACALL CLR0 ;大于或即是60秒时对秒计时单元清0+ ]6 _9 ~7 f1 Y+ W+ J
MOV R0,#77H ;指向分计时单元(76H-77H)
" w7 y5 q. [% U3 a) O' H2 FACALL ADD1 ;分计时单元加1分钟& i, _ c( B! H- j7 k
MOV A,R3 ;分数据放入A
/ R* O) x! Q# H) P& K3 yCLR C ;清进位标志 b. C# O0 t7 B; X% W9 K
CJNE A,#60H,ADDHH ;
7 o, p2 K( i9 C$ JADDHH: JC OUTT0 ;小于60分时中断退出
' ^0 t5 D( G% x5 p; {2 {5 r' OACALL CLR0 ;大于或即是60分时分计时单元清0* _) _# q+ y2 ^& z+ o% H9 x2 R; j
MOV R0,#79H ;指向小时计时单(78H-79H)& x# o$ m1 k$ X# E) \2 C8 K
ACALL ADD1 ;小时计时单元加1小时9 x: u" @. ]4 f
MOV A,R3 ;时数据放入A
0 v7 H/ o$ x+ {+ c+ ?, ~- lCLR C ;清进位标志% n6 L, m: U* {. U- \
CJNE A,#24H,HOUR ;
$ M0 S4 A5 y/ I( GHOUR: JC OUTT0 ;小于24小时中断退出
0 i8 v, u+ J' _$ V; |9 cACALL CLR0 ;大于或即是24小时小时计时单元清0
1 v+ f( ?$ w1 N* W8 c8 K" W. MOUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移( [) ~* K. X1 C9 \ v
MOV 73H,77H ;入对应显示单元) Q1 y9 i( M B3 d% D; g9 u
MOV 74H,78H ;$ ~5 G: R* v& E9 u( N
MOV 75H,79H ;
2 F2 n( v/ ~' M* VPOP PSW ;恢复状态字(出栈)5 R7 ^7 j j* Q- z
POP ACC ;恢复累加器: ]) H" J x2 }. H
SETB ET0 ;开放T0中断
8 H' t" M, w9 f! S/ ]5 \RETI ;中断返回# ^" b& ~- I# L" U; a1 H5 _- ]
;
4 Y! f9 T& U0 ~* K' p;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5 q0 j9 ?1 i; W9 b6 [& t3 k4 R# B
;; 闪动调时 程 序 ;;
) ]5 c, ]$ U: p( ? v0 w v;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;, k$ J+ c- I! e9 Q: {: z
;T1中断服务程序,用作时间调整时调整单元闪烁指示/ _3 P! Z* c9 j' N% D) V1 C0 O
INTT1: PUSH ACC ;中断现场保护3 N0 J0 I2 M8 U& F7 I+ Y
PUSH PSW ;. v: h/ ]. Z3 @$ a! B+ q
MOV TL1, #0B0H ;装定时器T1定时初值/ ?3 f3 Z& @8 F/ {/ `# Y
MOV TH1, #3CH ;
5 t! W! G0 ~$ X+ E& C9 oDJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
& o' q ?/ ] qMOV R2,#06H ;重装0.3秒定时用初值. o: u* \3 b% K# z# b0 k5 A
CPL 02H ;0.3秒定时到对闪烁标志取反8 X% h! Z: x3 P- w
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
# i/ h8 q- _$ Y* IMOV 72H,76H ;02H位为0时正常显示4 I* Q3 S. B7 s9 X
MOV 73H,77H ;
& a6 V/ B( O4 u7 a8 h5 f( yMOV 74H,78H ;
, J" X9 T7 z. C4 T" \MOV 75H,79H ;
- B/ N3 i/ B$ @, A8 W$ g3 e! uINTT1OUT: POP PSW ;恢复现场
/ |: r! M3 T/ G* ?POP ACC ;
2 a) R) t8 X* p9 wRETI ;中断退出
6 d, L+ X% M9 P4 l8 }3 e% nFLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制1 C) n4 i& n$ w
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
/ f, o" T+ N; z2 Z6 NMOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
9 I a* }; j3 o3 gMOV 74H,78H ;
: q3 b; T7 B: z7 R6 T4 FMOV 75H,79H ;
5 ]2 I. |" K& `4 j; q; X) ^6 G) B. vAJMP INTT1OUT ;转中断退出
- H, |1 ]; x7 b! U" `/ `7 UFLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时5 H* ^/ n- c E! `0 S W. x& |
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示
( W/ S# w1 X2 A! B: G cMOV 74H,7AH ;& |# N2 F6 M$ L, U1 B
MOV 75H,7AH ;6 n& }$ J" }( N4 W4 p/ R. e
AJMP INTT1OUT ;转中断退出: \, p( b2 L4 U, U
;1 j! R& B$ o7 R' Y% S: g; U, w
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;& t, l& I; q! z
;; 加1子 程 序 ;;. v3 i0 E! |. f% Y6 E7 T6 v2 e
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;# q* G, O% V% x! l. z
;% ?7 \7 l* _8 {7 c0 J
ADD1: MOV A,@R0 ;取当前计时单元数据到A' p" E# L, u' f( ^
DEC R0 ;指向前一地址
3 O4 N6 R! q( W4 p: x" jSWAP A ;A中数据高四位与低四位交换' t7 s7 z. J+ _
ORL A,@R0 ;前一地址中数据放入A中低四位% N7 }0 Z! Y6 o9 Q! E
ADD A,#01H ;A加1操作+ A, E+ ?" c* |, O7 f- \
DA A ;十进制调整7 W4 R+ d% N* C/ z* {( k
MOV R3,A ;移入R3寄存器
! c) {" b8 t9 UANL A,#0FH ;高四位变00 n6 r5 ~: M' K( f7 u& W
MOV @R0,A ;放回前一地址单元7 v1 E( L2 ]1 e3 Y
MOV A,R3 ;取回R3中暂存数据/ X# H: `/ o7 P j5 q, c6 h3 N: A
INC R0 ;指向当前地址单元
7 K; ^- A# d4 `: J+ l5 HSWAP A ;A中数据高四位与低四位交换
3 h9 b; O7 ^3 X5 J7 I1 p' w& hANL A,#0FH ;高四位变0
: c v/ |4 L2 aMOV @R0,A ;数据放入当削地址单元中* E. Z7 b; W n0 [9 ]
RET ;子程序返回5 v, |; c% d+ x) p3 f$ \
;* D9 o H9 K, G" C* w+ V' c4 m
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$ z' s4 f+ l( t9 v9 E
;; 清零程序 ;;& W" R- `3 B7 l" f3 `5 ~
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
: j* I, i# N, S# p, c8 G4 D4 M: J;.............
F" D8 {9 M7 f: h0 x;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6 u% j/ L+ h4 y' A0 [$ c( }# b3 n
;; 时钟调整程序 ;;( |# }$ Y9 _4 e
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$ x2 L% F! D. n& m* s* Q- e+ t' D: J;当调时按键按下时进入此程序, x; [$ t) W q
SETMM: cLR ET0 ;关定时器T0中断
9 ^0 X( I/ p8 ]CLR TR0 ;封闭定时器T00 m X6 e/ F7 b6 X P
LCALL DL1S ;调用1秒延时程序
0 l0 U0 I# ?2 a9 z4 B* [) yJB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)# G: g# _# [: v7 Z
MOV R2,#06H ;进入调时状态,赋闪烁定时初值 Z4 S' X3 Z7 r) r" T9 j
SETB ET1 ;答应T1中断8 R9 ]- H2 V! ?8 d4 O5 G
SETB TR1 ;开启定时器T10 e. V$ ?" H+ w! p j/ a' ~
SET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待
q# D; s1 e; J" d! b2 RSETB 00H ;键开释,分调整闪烁标志置1
+ ~- ?0 h: u7 `6 oSET4: JB P3.7,SET3 ;等待键按下2 Q: J+ B5 U$ l
LCALL DL05S ;有键按下,延时0.5秒
1 n/ w- ~ J% _' lJNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
f5 _* J* S' {$ T5 K) RMOV R0,#77H ;按下时间小于0.5秒加1分钟操作
. H; X! b3 w U) pLCALL ADD1 ;调用加1子程序
) v7 U& `: d1 }4 y7 ] wMOV A,R3 ;取调整单元数据) Y% ^( D8 M, `0 u1 Q! f0 ^
CLR C ;清进位标志
1 l- m, h: O1 ]2 v/ VCJNE A,#60H,HHH ;调整单元数据与60比较3 r" t: f5 F# u* H0 X- M* x7 ?: j
HHH: JC SET4 ;调整单元数据小于60转SET4循环* C' E/ [+ f6 S% n- {
LCALL CLR0 ;调整单元数据大于或即是60时清0, g% t) |; A$ w
CLR C ;清进位标志) M' T2 v. A0 I" u5 q' x7 O" D
AJMP SET4 ;跳转到SET4循环1 G: A8 Z9 y2 g: \
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断
6 |+ J4 Y( `! Q! vSETB TR0 ;开启T0定时器(开时钟)
4 i; z, R: B! {& ?! y) O: c7 p6 \4 iCLOSE: JB P3.7,CLOSE ;无按键按下,等待。
) p$ V: s: u! G, E" G5 S9 dLCALL DISPLAY ;有键按下,调显示子程序延时削抖
) Q4 ?$ r) w0 o2 g4 S& T% gJB P3.7,CLOSE ;是干扰返回CLOSE等待
1 o: {" G8 q0 N t: \WAITH: JNB P3.7,WAITH ;等待键开释 A2 q8 p1 n9 G$ Z1 z2 v
LJMP START1 ;返回主程序(LED数据显示亮)+ X! }" ]) e+ [+ x; j l/ F1 I
SETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
5 G! J1 O# S$ n2 ?$ A Q ESETHH1: JNB P3.7,SET5 ;等待键开释
+ z; C" h4 O5 L9 C3 w5 W( y4 FSETB 01H ;小时调整标志置1
5 t" _. B4 e2 _SET6: JB P3.7,SET7 ;等待按键按下) R2 _# E: H0 y7 E% s
LCALL DL05S ;有键按下延时0.5秒. V; v K( A2 }
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整) M; g0 `" R7 d4 N8 Z
MOV R0,#79H ;按下时间小于0.5秒加1小时操作. F7 [, u/ {8 j8 M4 O6 o) s
LCALL ADD1 ;调加1子程序7 N1 d9 S3 {1 \+ q
MOV A,R3 ;
0 {: g V7 W$ ~, l3 fCLR C ;$ \: N( ?: @1 @$ _! j5 W
CJNE A,#24H,HOUU ;计时单元数据与24比较) `2 C' ?5 T2 L& n9 M+ t
HOUU: JC SET6 ;小于24转SET6循环0 M% r0 P4 f& n3 P& b0 w
LCALL CLR0 ;大于或即是24时清0操作
: P7 ~% k; [6 D& `7 x* |- IAJMP SET6 ;跳转到SET6循环2 l6 s9 y# w- w6 b# U+ E
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释
8 L/ ~$ N6 f* m# `LCALL DISPLAY ;延时削抖% ?1 `" _% x# e7 c
JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
, N4 b4 I& H, Y/ ^5 tCLR 01H ;清调小时标志
' b# j4 l. ]0 m1 Z$ c$ G0 kCLR 00H ;清调分标志$ b( D4 R. q8 b$ o/ j
CLR 02H ;清闪烁标志
# K# p T3 ^& ~CLR TR1 ;封闭定时器T1, q1 x0 ~$ W1 {, r @. Z
CLR ET1 ;关定时器T1中断, e' A7 Q4 n1 d9 G T( O8 Y. y, q
SETB TR0 ;开启定时器T0, e# P5 g2 W8 M3 {* t5 S+ P
SETB ET0 ;开定时器T0中断(计时开始)
# [: |/ W$ U6 Y% U) ]LJMP START1 ;跳回主程序
2 D6 q4 x& n' ~% V$ M0 c0 m8 YSET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
n2 I5 _1 [& n" r1 ?" h! OAJMP SET2 ;防止键按下时无时钟显示6 s9 i0 b' T2 L
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用7 _2 v2 J: o8 J, @8 o% P
AJMP SET4
; E3 v( `8 ?$ {' H1 W; SSET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)- H0 I+ \% @2 P' a2 z
AJMP SETHH1 ;防止键按下时无时钟显示
$ x. L6 W# A4 KSET7: LCALL DISPLAY ;等待调小时按键时时钟显示用- P+ X) T q% F. Q
AJMP SET6( n( b9 a C4 b
SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
' ^7 M* T* }9 n5 i* _$ f) U6 mAJMP SETOUT ;防止键按下时无时钟显示
' |4 g! }0 ~/ f;
% c2 V" Q0 }0 }2 l5 z" R;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
% D+ u6 I( c2 W;; 显示程序 ;;
$ A4 N$ I# ?) l) L$ ~6 h$ m" w: y;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 h% U% f9 ]6 @' g7 e- u
$$$$$$$$$$$$$$$$$$$$$$$$$$$+ ? F& h$ @6 f: u+ T" c
;1MS延时程序,LED显示程序用) M' W- x- M; ~/ S& w& I3 \0 p
DL1MS: MOV R6,#14H
( y6 z9 b% z+ M+ Y9 F6 w. ^: XDL1: MOV R7,#19H
5 P9 L3 j) | s" Y0 X8 u- dDL2: DJNZ R7,DL2
# B5 v' S# y* l8 }" i* T! ZDJNZ R6,DL1
- E' E/ o7 w8 |RET8 H$ S+ D* U0 S
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
) `6 F4 z R: m+ RDS20MS: ACALL DISPLAY
( \. M( J, {- D ~& [ {ACALL DISPLAY; Q' m* |4 h* x* T" U8 [% e: F
ACALL DISPLAY
( u4 A [( Z6 YRET0 W0 x; t5 j. u5 w4 w
;延时程序,用作按键时间的长短判定+ {4 r- Y, W$ q0 x
DL1S: LCALL DL05S
4 _% S- _3 q8 k: JLCALL DL05S
. l! r M" R8 M. l1 j- P8 A% mRET, o. Z$ n3 ]1 V% l
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
T. B( v8 _; _ O# vDL05S1: LCALL DISPLAY
& w D% O ^3 u$ RDJNZ R3,DL05S1
/ ]5 _! |1 v% c" i) T% O3 l4 _RET
/ U# v1 U p+ d5 _! Z- ^5 G& mEND ;程序结束
* ~+ d5 e, T( c Q# h. h' B& H. L |