51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 * E2 u6 D0 X; C4 \5 `
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。
8 }7 k8 l1 Z+ m$ J 开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 4 t( i6 G" {. j* Q7 Z% w, i
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。 / m: Q$ m3 i2 i% Z9 Y u8 S: j
. D7 [; X9 u' L5 y8 q$ ] & M g4 L2 S: h& O
/ p# z* i4 T1 I! y 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。$ s3 }2 T1 \4 g V# H. S3 E" C
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7 I( X" T7 [6 S
;; 中断入口程序 ;; (仅供参考)/ x& D# r# E1 z
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 N; s' t; F$ g+ R: i- M0 Z* w% g;
* ~9 @& l" z N3 J% z0 g$ p" `ORG 0000H ;程序执行开始地址
: B/ [) K: v$ L' O6 n6 `6 t' M" zLJMP START ;跳到标号START执行
: p; }. }' i' w; oORG 0003H ;外中断0中断程序入口9 L' x2 M8 Y% I/ I6 X6 w5 W
RETI ;外中断0中断返回9 D. d. g( e* n# W' F; t
ORG 000BH ;定时器T0中断程序入口' i) v+ c: W1 G7 {1 H, n
LJMP INTT0 ;跳至INTTO执行7 [. @. A! h- K. }( h( v7 r5 |
ORG 0013H ;外中断1中断程序入口
( w1 e" V- G! d/ Z/ QRETI ;外中断1中断返回
8 ?9 `6 U% W7 QORG 001BH ;定时器T1中断程序入口
, Q6 `7 G/ f/ B5 W+ o3 vLJMP INTT1 ;跳至INTT1执行: D, } k% P- V5 W% S2 P# L
ORG 0023H ;串行中断程序入口地址2 \7 U9 a$ j' O/ X* @0 y7 a" C
RETI ;串行中断程序返回& ^' o8 _6 U% K& v
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 |/ F3 l$ A( L# ^ };; 主 程 序 ;;
, x/ j: _ {# L t* a6 r3 J- w/ \;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
" \: H" s" B' N- k;. [. H5 J% D" A
START: MOV R0,#70H ;清70H-7AH共11个内存单元) U" X! i# |! C
MOV R7,#0BH
: I' P& F' Q* C' Z# D) Y; x;clr P3.7 ;; D" v4 n9 @: |6 d& e G
CLEARDISP: MOV @R0,#00H ;6 Y# R$ J0 b6 H' O3 h. K
INC R0 ;
- g3 j5 ^( @+ I5 EDJNZ R7,CLEARDISP ;
$ U8 T. u, y7 W0 qMOV 20H,#00H ;清20H(标志用), h6 Z. p9 ~, s4 X2 {
MOV 7AH,#0AH ;放入"熄灭符"数据5 V6 V2 W8 M9 m$ A: C' @) V d
MOV TMOD,#11H ;设T0、T1为16位定时器$ `( |# Q0 h0 I! Q& @
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
O; s9 m( F; U5 IMOV TH0,#3CH ;50MS定时初值+ X j z! A' g
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
2 ?1 L) y- J4 Y4 Y5 E( V) {MOV TH1,#3CH ;50MS定时初值8 s+ q0 Q6 @" ^
SETB EA ;总中断开放8 k, {& v+ I9 K5 X
SETB ET0 ;答应T0中断1 K: z6 i, J1 j2 j
SETB TR0 ;开启T0定时器
) V, A0 A# }# g. W& W; MMOV R4,#14H ;1秒定时用初值(50MS×20)
/ L/ {' ?/ C) w, gSTART1: LCALL DISPLAY ;调用显示子程序
! U3 w e Y% K5 ] T& ^JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
) |, x$ m, E7 B* g* U7 oSJMP START1 ;P3.7口为1时跳回START1: Y, c" F) j& c! e
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
% _6 l% V! ^) t+ i9 m;& N9 t# Q9 U* g9 ~$ {
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 g1 t8 C- j; p8 ~ G( K;; 1秒计时程序 ;;- B7 p" d: d, C6 B+ g
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; s& H7 W$ C' A, E. _( E;T0中断服务程序: J% D( o' s; e! U) F" g
INTT0: PUSH ACC ;累加器入栈保护) B o% N! f; w2 u4 N Y. @- V4 q
PUSH PSW ;状态字入栈保护: ?6 T! w9 r$ X/ R% Z1 B! F. ~
CLR ET0 ;关T0中断答应
+ S6 J* D4 Z8 L$ g& cCLR TR0 ;封闭定时器T0
2 T/ d0 s( v" ~9 @9 N; k+ NMOV A,#0B7H ;中断响应时间同步修正0 } Z Q. i3 C2 X
ADD A,TL0 ;低8位初值修正2 w1 z* ~5 b r$ u
MOV TL0,A ;重装初值(低8位修正值)
# v/ n; P6 p- M2 B/ D0 V7 ?MOV A,#3CH ;高8位初值修正; A6 [, l0 d, z
ADDC A,TH0 ;
* h) _* M6 x' f4 p9 ~. y) o yMOV TH0,A ;重装初值(高8位修正值)
1 I3 d! Y3 w* o1 s6 iSETB TR0 ;开启定时器T01 z# v8 b: n+ Z" P
DJNZ R4, OUTT0 ;20次中断未到中断退出0 o5 u" R4 x6 T* A
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
' t* j* ]- i) _# q A( fMOV R0,#71H ;指向秒计时单元(71H-72H)
) a) [* Z* K* ^: z7 ZACALL ADD1 ;调用加1程序(加1秒操作)
: }/ S! B# a, R# @( U o: f) B# J# TMOV A,R3 ;秒数据放入A(R3为2位十进制数组合). T% P+ x1 k& W7 h' q
CLR C ;清进位标志
0 |! A5 V# A/ T! ~CJNE A,#60H,ADDMM ;6 [- S& g+ x/ q, _
ADDMM: JC OUTT0 ;小于60秒时中断退出
3 F; ], X, I' x9 Y7 t ]ACALL CLR0 ;大于或即是60秒时对秒计时单元清0+ ~8 k% _) d, P1 G* U
MOV R0,#77H ;指向分计时单元(76H-77H)
. |* T. } s9 z) `. l7 bACALL ADD1 ;分计时单元加1分钟" W( y6 X" P/ l, M0 ]; X$ c
MOV A,R3 ;分数据放入A) ?; J, H* y# A" }6 y
CLR C ;清进位标志( U$ _! u7 M# R$ f
CJNE A,#60H,ADDHH ;! m8 r! E6 ]: s# O4 q3 _6 S$ I
ADDHH: JC OUTT0 ;小于60分时中断退出
! h+ w. d+ l! U" B% GACALL CLR0 ;大于或即是60分时分计时单元清02 M' Z2 S; Q- g( Z& g' P9 z% f
MOV R0,#79H ;指向小时计时单(78H-79H)
% }; h5 h$ Z$ xACALL ADD1 ;小时计时单元加1小时
3 J$ `" ~3 L7 z) Y# Q9 T( ?MOV A,R3 ;时数据放入A4 h6 D3 b3 h8 A
CLR C ;清进位标志2 y3 `. O2 {5 K6 p" z
CJNE A,#24H,HOUR ;
1 M4 n8 m9 c- [5 B$ ^HOUR: JC OUTT0 ;小于24小时中断退出2 p# O4 J S( W! k
ACALL CLR0 ;大于或即是24小时小时计时单元清08 G( X! n8 B& t" W
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
$ Q* Q9 [9 b/ tMOV 73H,77H ;入对应显示单元4 y n; z( E, |+ F7 F* G! o
MOV 74H,78H ;2 D( ?: L3 z2 U8 ?0 q' \" K
MOV 75H,79H ;
; F3 Q0 ?5 u& z( T) x) c. dPOP PSW ;恢复状态字(出栈)
2 w4 z$ A# l) f2 t- tPOP ACC ;恢复累加器
; C# b4 B; k( z7 Y Y9 n; aSETB ET0 ;开放T0中断
8 \; l6 J7 Z0 T& J* X& A" URETI ;中断返回" K% U8 x& }4 J3 l2 C4 u
;
% h8 t: p- s# ]2 M& x: };;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3 X5 i3 O2 U5 M$ Z
;; 闪动调时 程 序 ;;
0 m4 D* U0 L+ p+ D% f;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5 D4 i# r1 Y& C! C( U6 n
;T1中断服务程序,用作时间调整时调整单元闪烁指示) m# a+ F9 m- ^- ]
INTT1: PUSH ACC ;中断现场保护' j! U; v; h4 F' [! U1 V
PUSH PSW ;0 D6 o7 t7 [$ C) K: T ]
MOV TL1, #0B0H ;装定时器T1定时初值
% R+ ~) [5 f$ b v9 dMOV TH1, #3CH ;
/ m! O- k) s# z, z/ U9 _DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
0 Q9 U" p( U9 X( ~MOV R2,#06H ;重装0.3秒定时用初值" _$ V6 P+ r5 q# u' N
CPL 02H ;0.3秒定时到对闪烁标志取反
" b8 u; Z8 Z) F& b# G) N. KJB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
* y9 T! H0 O1 w9 Y% R8 L) w7 c. kMOV 72H,76H ;02H位为0时正常显示
- E5 g8 }' y0 _- l! XMOV 73H,77H ;+ s0 j5 m4 C' w! y6 m" j" O
MOV 74H,78H ;% E6 {5 U# N1 w1 @0 @7 V
MOV 75H,79H ;
* `8 M$ c8 A! v. l+ t8 |5 ?' gINTT1OUT: POP PSW ;恢复现场, b' X3 {+ s' t. I$ w' \
POP ACC ; a: x8 M+ \4 I* x1 h
RETI ;中断退出3 s# S: ]3 G% d/ V/ j+ Q4 K3 G
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制$ m. g# j1 x2 Q) w9 u6 E' H2 i. C
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分% A) e/ E, d, [) {6 Z n
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
# x* o& T* H+ z3 qMOV 74H,78H ;
; }+ V6 D9 {2 F' E! KMOV 75H,79H ;4 g" a7 s4 u7 j, a0 E
AJMP INTT1OUT ;转中断退出
: p) y" r) _; {4 g7 @- f" |2 PFLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时6 K& `' p* v! R a7 T
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示
! X4 |* U8 u8 d2 E6 a! SMOV 74H,7AH ;9 V# J; l6 ^6 m* v- \
MOV 75H,7AH ;6 K2 Q( j' ^& e. y& ] G
AJMP INTT1OUT ;转中断退出- _0 x3 e$ H/ s- L' y0 \1 o
;0 ?. {% _+ r* o ?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4 u7 g# k$ b, P6 s6 z- }
;; 加1子 程 序 ;;8 s& p$ s8 l/ h/ c" s J F
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4 e/ H) J/ b( p/ x3 m
;; I2 Q4 ^6 X" a8 E4 y5 |# d
ADD1: MOV A,@R0 ;取当前计时单元数据到A
8 N% J- h% P! q1 l" }+ V0 _DEC R0 ;指向前一地址% x9 h" u+ n& G+ Q9 W; D: J4 H1 I
SWAP A ;A中数据高四位与低四位交换
; }5 \7 p/ h, T6 g& P7 h$ ~: HORL A,@R0 ;前一地址中数据放入A中低四位9 n/ K1 O) v# Z% Y T
ADD A,#01H ;A加1操作7 S! i! G2 |! a3 J: U
DA A ;十进制调整
$ b$ E: u# K: W \8 _6 AMOV R3,A ;移入R3寄存器9 G$ N1 H* q/ Q
ANL A,#0FH ;高四位变0
; U1 [3 l0 b7 D5 G( jMOV @R0,A ;放回前一地址单元
X# F6 M6 p; T9 V) D: m) {; oMOV A,R3 ;取回R3中暂存数据
' N, y+ I+ H- ]" y/ ?INC R0 ;指向当前地址单元" ~, C# c% n& q8 O& `" Q
SWAP A ;A中数据高四位与低四位交换9 K; N: h7 R: z' U3 I
ANL A,#0FH ;高四位变0- K' v5 c' g6 t! n4 `/ S- _
MOV @R0,A ;数据放入当削地址单元中. c+ ~7 z& J: M
RET ;子程序返回) C( j. y% ?4 Z3 g
;* b/ u5 {1 k5 P. C% ?& }% Q
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;( L1 P+ w3 e! u2 P
;; 清零程序 ;;5 w, P( a" ~. W3 {; W: Z6 l# r
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
: o9 ?3 ~# U# j& X;.............! V$ M, e |. b7 }
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2 P* g0 G% l) `) \# m7 F. y
;; 时钟调整程序 ;;
# P% w' f6 O; |; O! a- J# D3 D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p+ k7 s; ^) b/ l" @% T;当调时按键按下时进入此程序
' V* W" a3 d9 @) m4 @/ [; GSETMM: cLR ET0 ;关定时器T0中断
" I h# L" p7 RCLR TR0 ;封闭定时器T0
, j7 H0 |+ o, S8 ]/ Y; u( GLCALL DL1S ;调用1秒延时程序9 E& z8 p6 R: `6 Q( J1 i5 l( u
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)3 K4 G8 ^! O/ P7 r: k" g
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
5 Z+ y8 w( q/ N$ {! G3 E5 {SETB ET1 ;答应T1中断5 t4 o- G H7 |
SETB TR1 ;开启定时器T1
7 c: F+ T: E! r. g J9 zSET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待$ G% o, S j- o+ \! s3 F& }
SETB 00H ;键开释,分调整闪烁标志置1
/ J$ ~, y( j; PSET4: JB P3.7,SET3 ;等待键按下
6 V* n; |4 ^$ E: C Q+ Q2 }LCALL DL05S ;有键按下,延时0.5秒
9 ~* W4 l- j4 B( @2 @7 R1 cJNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
3 l& s* i, a X. O3 w; D+ AMOV R0,#77H ;按下时间小于0.5秒加1分钟操作. k5 J+ i+ u" z. k" o0 L! x5 U
LCALL ADD1 ;调用加1子程序
2 [! U' Q9 a5 a9 t" q z1 P9 \MOV A,R3 ;取调整单元数据
0 k1 h7 \( b" @4 w ~CLR C ;清进位标志
! k2 Y* I' v$ |& W5 a3 oCJNE A,#60H,HHH ;调整单元数据与60比较. a9 w" L* L) J' G, q1 L. z" M
HHH: JC SET4 ;调整单元数据小于60转SET4循环
: b9 r" P0 i& m" ^2 p: cLCALL CLR0 ;调整单元数据大于或即是60时清0
1 r, a0 n$ {3 h7 s+ q" gCLR C ;清进位标志
: f2 J7 L; z3 e8 q( \+ \AJMP SET4 ;跳转到SET4循环) |' X: g, Z: G2 u( k3 \5 d1 ^8 I
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断" k. i: `% I4 A# x7 }) ]
SETB TR0 ;开启T0定时器(开时钟)1 N$ F5 A$ e: V
CLOSE: JB P3.7,CLOSE ;无按键按下,等待。
5 v. n& S/ T9 {1 m) z' P. ?; {& h' sLCALL DISPLAY ;有键按下,调显示子程序延时削抖
' E- M. Z ]/ K4 v o1 B- RJB P3.7,CLOSE ;是干扰返回CLOSE等待
2 @" x, {3 n* Q( |WAITH: JNB P3.7,WAITH ;等待键开释
" K& u/ H2 t7 a$ LLJMP START1 ;返回主程序(LED数据显示亮)
: G8 B# h7 _! N' _; \: tSETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
. l+ O4 A$ p% }: o/ DSETHH1: JNB P3.7,SET5 ;等待键开释
: C9 U: T% T) J( g# _SETB 01H ;小时调整标志置1+ K$ k- a( O: a3 c2 Q7 D
SET6: JB P3.7,SET7 ;等待按键按下& J' u" Z: X5 j+ S; Q
LCALL DL05S ;有键按下延时0.5秒9 k' } H; f" S) ?
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
5 J- B- l9 G+ n) zMOV R0,#79H ;按下时间小于0.5秒加1小时操作, q: n3 C! Y; p
LCALL ADD1 ;调加1子程序
* L- }; A6 S! J; c% U4 q' P$ P) T6 OMOV A,R3 ;
- g7 B4 R! F1 m, T$ eCLR C ;. g$ J1 B# n& d# o
CJNE A,#24H,HOUU ;计时单元数据与24比较
( `1 z8 Q: ?+ @5 ?0 `HOUU: JC SET6 ;小于24转SET6循环: ^+ K' c0 L7 N# t4 o; f, s6 D, A
LCALL CLR0 ;大于或即是24时清0操作
) a9 m! }$ S; h- q. m0 h4 KAJMP SET6 ;跳转到SET6循环- q$ N( B' R0 m. l6 w9 @, C
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释! K1 v* ]/ t7 I2 l T4 b
LCALL DISPLAY ;延时削抖
( g7 I" o3 R6 Z1 OJNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
( a G* O! y+ gCLR 01H ;清调小时标志, f: Q2 n) ?1 g( v P* {# a' h
CLR 00H ;清调分标志9 l5 x& Q+ n# N) u% G
CLR 02H ;清闪烁标志
6 P5 R0 v" @- o7 m5 d' S# LCLR TR1 ;封闭定时器T1
5 {) q( G/ q8 e! u1 l; ^CLR ET1 ;关定时器T1中断" { l; X, q. P9 K2 M
SETB TR0 ;开启定时器T02 x4 r; r0 H# B; F) K9 D
SETB ET0 ;开定时器T0中断(计时开始)8 ~: Q8 P0 W/ |, @6 q, [. b
LJMP START1 ;跳回主程序
, U U" c4 G$ b- W, Y, ~SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
* a, ~( s4 Z% U, o- iAJMP SET2 ;防止键按下时无时钟显示
, b5 S& p* u4 _7 ?; @SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
) U& O4 _1 A1 l- h u- pAJMP SET49 U0 J7 U1 j7 V9 M& v
SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)+ J7 q' `6 v+ q( y
AJMP SETHH1 ;防止键按下时无时钟显示
5 ` |% i- P1 Z0 J2 J- l5 KSET7: LCALL DISPLAY ;等待调小时按键时时钟显示用
& M3 t: _# h/ f5 W& ^AJMP SET6
$ C: o9 {0 F% D+ |' nSETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待, r% C3 v% \6 ~# B
AJMP SETOUT ;防止键按下时无时钟显示
* X, J0 c/ y0 q6 n; {: X;5 D6 {) A7 e) [+ ^5 f. _
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
. Y) ^- q- U# I- s2 u9 O;; 显示程序 ;;
7 t" R5 w$ F; S1 b' T" ];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 M. D* ?8 h5 P$$$$$$$$$$$$$$$$$$$$$$$$$$$8 E$ u2 [/ }/ E3 n( {
;1MS延时程序,LED显示程序用
" F% w. A, v& P5 S: iDL1MS: MOV R6,#14H
5 i! Z+ A* g* \& W% _8 U" CDL1: MOV R7,#19H
. J! ~2 Q O" A: _ VDL2: DJNZ R7,DL2
2 I% ~9 R& b0 ~' y4 Q# D( _DJNZ R6,DL1# B) u& v+ y. v( W1 P" t
RET3 g. i3 R+ R |1 U1 n
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
& A }( i0 M! X& I% t4 pDS20MS: ACALL DISPLAY- c- n" y8 f c$ J* o2 j3 w
ACALL DISPLAY
! M8 T5 R2 P( f) [2 LACALL DISPLAY5 {: Y- ^" U9 s* |' j% T; i
RET1 i5 k7 G/ v2 C2 `
;延时程序,用作按键时间的长短判定! B$ W, y0 o. S0 ^! T# l* K* l
DL1S: LCALL DL05S" e' X" N' {! H$ c9 B
LCALL DL05S
2 @6 @% x) ^, r' cRET
$ R! d$ A8 d! h7 KDL05S: MOV R3,#20H ;8毫秒*32=0.196秒4 P3 }- p$ ]0 m& m+ E
DL05S1: LCALL DISPLAY6 Q0 P. s7 H% `5 Z/ z2 M) f' J
DJNZ R3,DL05S1) b% ~2 M0 a& l, p' n
RET
v5 _0 M# H6 N% G g+ Q( iEND ;程序结束6 `3 N9 _1 Y4 H9 q2 E; \
|