51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 ) t( [2 ? v4 R8 \1 Z, V
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 $ q5 @0 Q2 t8 V( }/ k+ v" u. v
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
* F# H' h( v8 v' z- f9 W. a 6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
. j# B3 X) |8 H( G; f9 o: U$ c- L# x2 J" T
0 S4 G: U& Z# U
) c! W& Y4 p. ~; ?, m8 m! @
以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。) E5 W* h: B+ Z# W
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 _! p6 @ b1 @6 ?) t8 @& S;; 中断入口程序 ;; (仅供参考)
5 [. ?9 w# [ O5 |8 x! u% C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 m) V: l" |! M/ }0 P9 z, Q;+ B2 u6 Z; k3 _ K, n$ l) J
ORG 0000H ;程序执行开始地址$ X+ J, n9 E2 s" ]! Z" c
LJMP START ;跳到标号START执行
, w Z. D% w+ bORG 0003H ;外中断0中断程序入口! G$ E0 }, y. ^
RETI ;外中断0中断返回
; }5 h% D( p6 g6 BORG 000BH ;定时器T0中断程序入口' i% i" p3 P) A$ u$ l1 z
LJMP INTT0 ;跳至INTTO执行; u1 l" ]9 f5 z$ `& O( y2 @+ F
ORG 0013H ;外中断1中断程序入口. y6 D x0 P- H h+ F4 b+ G8 e9 U5 E
RETI ;外中断1中断返回
8 @7 \9 Z& M* v/ [0 n7 kORG 001BH ;定时器T1中断程序入口
# O# [9 K1 }9 Q6 K# rLJMP INTT1 ;跳至INTT1执行
+ t y( p* M4 }ORG 0023H ;串行中断程序入口地址 R$ D. J! {, b' O' z/ S
RETI ;串行中断程序返回. L ?3 R/ z' j% r
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$ M1 F, @( W U3 M
;; 主 程 序 ;;
2 W! Z/ @8 R1 J [0 b* j;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 M8 J$ |+ a7 w& _0 |3 D7 v. K7 q;
& I0 I# v$ ?' v: m* I- kSTART: MOV R0,#70H ;清70H-7AH共11个内存单元
8 u5 N: J3 |1 [, JMOV R7,#0BH
+ t9 C! f, f6 r$ \* `9 v;clr P3.7 ;
# s2 _! K& v2 M3 Z% Y VCLEARDISP: MOV @R0,#00H ;
, W5 ^$ t/ L c7 B/ z3 hINC R0 ;2 u* L& K& O9 N. P' M' k2 k9 e/ I8 L
DJNZ R7,CLEARDISP ;% p3 l0 ]# Y8 \( Z$ t1 l; X
MOV 20H,#00H ;清20H(标志用)
6 P: R! T1 g& a6 \5 sMOV 7AH,#0AH ;放入"熄灭符"数据$ I; k* N. F7 i# A) j/ E
MOV TMOD,#11H ;设T0、T1为16位定时器: x+ y- b) N3 G8 p
MOV TL0,#0B0H ;50MS定时初值(T0计时用)
% E% ~1 f7 k7 J& @- ^3 RMOV TH0,#3CH ;50MS定时初值
& Z( A1 _8 \# N$ k) o) k& X: z1 fMOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
9 N9 r4 X, j% b+ |2 F' mMOV TH1,#3CH ;50MS定时初值
+ ?+ [. B8 x8 V* u# hSETB EA ;总中断开放3 T5 k% S8 d3 F- d
SETB ET0 ;答应T0中断
4 ~5 L9 U; K) z6 USETB TR0 ;开启T0定时器/ T6 h+ U, X/ u
MOV R4,#14H ;1秒定时用初值(50MS×20)
0 h' k6 {& K/ b) k9 m3 wSTART1: LCALL DISPLAY ;调用显示子程序* J! ~1 W" m$ Y7 v0 X
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序 ; l. u0 B" e4 o3 o
SJMP START1 ;P3.7口为1时跳回START1: q9 x6 b3 S3 E* Z- E8 C
SETMM1: LJMP SETMM ;转到时间调整程序SETMM
: a4 K. B5 L2 \+ C4 q;
0 p5 z3 S! t, ?;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" X$ E7 ?& l$ H- G
;; 1秒计时程序 ;;4 _# W2 D: q/ p- t" L0 G
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9 _& `) W( W7 J: k
;T0中断服务程序0 f. l9 _6 k( [0 C
INTT0: PUSH ACC ;累加器入栈保护8 U2 a6 [, }( c* }! o1 ]0 w
PUSH PSW ;状态字入栈保护
& l0 e2 m# Q. t% X* C0 X: HCLR ET0 ;关T0中断答应
0 H6 O- a+ @7 c3 P2 KCLR TR0 ;封闭定时器T0
; l v! ]& ]8 T% a- _; A6 Y( fMOV A,#0B7H ;中断响应时间同步修正! O: z G/ @; h3 V& ?+ g( C
ADD A,TL0 ;低8位初值修正2 R' ~/ r& r" s2 k) g
MOV TL0,A ;重装初值(低8位修正值)
) ?3 K, ]' a# d1 s" H' ~MOV A,#3CH ;高8位初值修正
, b8 \: }/ V7 i4 hADDC A,TH0 ;0 i' [' H; b( x% @
MOV TH0,A ;重装初值(高8位修正值)- X3 D* k+ G X% B6 a; c8 S3 g1 }
SETB TR0 ;开启定时器T0
# s9 E5 P4 P6 P8 ^" n" ZDJNZ R4, OUTT0 ;20次中断未到中断退出
7 K6 m$ E$ g% g: I, w! gADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值6 n6 |& E5 M# k) _7 I. B3 g1 o0 ]
MOV R0,#71H ;指向秒计时单元(71H-72H)- t% A- Y' p4 l
ACALL ADD1 ;调用加1程序(加1秒操作)
5 s; R' P4 B: v; bMOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
! O" _/ j4 b2 @1 @, ACLR C ;清进位标志2 _/ _. v7 r- q
CJNE A,#60H,ADDMM ;; u. ~1 u5 m3 }% M e) ~
ADDMM: JC OUTT0 ;小于60秒时中断退出
' K+ @$ ?, w9 NACALL CLR0 ;大于或即是60秒时对秒计时单元清0
8 o3 [1 f5 f: {1 qMOV R0,#77H ;指向分计时单元(76H-77H)6 o2 d! ]% \1 _( Q1 k9 h
ACALL ADD1 ;分计时单元加1分钟% F) e4 f2 l: M5 X
MOV A,R3 ;分数据放入A! Q0 W8 d6 q3 | o# W P) V* \3 y) d
CLR C ;清进位标志6 H E* n) E% `0 U
CJNE A,#60H,ADDHH ;+ j- q* {" k; Z0 I9 }
ADDHH: JC OUTT0 ;小于60分时中断退出/ ^- W4 ?* S9 c3 _2 Z) ^, D# u
ACALL CLR0 ;大于或即是60分时分计时单元清0
3 Y6 q+ i- d8 P( D% xMOV R0,#79H ;指向小时计时单(78H-79H)
: ]0 m, T5 k" c$ n+ n) aACALL ADD1 ;小时计时单元加1小时, F- o' T& X" r+ [
MOV A,R3 ;时数据放入A
- q- b: s9 J5 w1 d F* h: ^ CCLR C ;清进位标志
! F) ~7 z' K& `4 v6 NCJNE A,#24H,HOUR ;
/ t7 O; M6 N) l. S" l. FHOUR: JC OUTT0 ;小于24小时中断退出
" M5 c+ Y2 h# o3 b$ MACALL CLR0 ;大于或即是24小时小时计时单元清0
; a+ b6 x l. qOUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
! h9 Y, s" G* D8 R/ W9 iMOV 73H,77H ;入对应显示单元7 c2 y5 e7 u3 ^) Z1 R% i" k
MOV 74H,78H ;
3 E! X# X6 Q/ Z% d" aMOV 75H,79H ;, \' E. N4 O/ Z1 A _
POP PSW ;恢复状态字(出栈)
, o p0 K# D' k& `. q# yPOP ACC ;恢复累加器! s H+ g$ I3 X& [( Y
SETB ET0 ;开放T0中断
: @1 }; p- H+ h; b; { CRETI ;中断返回
+ B$ c1 v$ m, I4 L+ S! p;* s3 o% Y& B' S
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 N0 |: m4 o$ e d# m Y# R) E0 p;; 闪动调时 程 序 ;;2 p) [! E4 S/ x+ y$ M* m
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
& d- Z' C& \- Y;T1中断服务程序,用作时间调整时调整单元闪烁指示4 d' O$ c& w* R! T$ w2 r' d
INTT1: PUSH ACC ;中断现场保护$ x- m+ _' Q% s2 C) i+ a2 C8 Z
PUSH PSW ;
9 Z8 r9 @: D9 Y+ S k5 ]MOV TL1, #0B0H ;装定时器T1定时初值
' o+ h* t2 ^# s7 d6 J* XMOV TH1, #3CH ;( D6 {% c! {9 S: L. y# R% Y c
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
& @' M* a# `9 g9 KMOV R2,#06H ;重装0.3秒定时用初值) X' Q) ?9 u& e2 O a
CPL 02H ;0.3秒定时到对闪烁标志取反+ w, w' H; z8 c' C
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"- Q2 J6 |, n5 m1 y4 x( L0 {- t
MOV 72H,76H ;02H位为0时正常显示 A5 V2 I, L* h2 B, `2 W
MOV 73H,77H ;: } J' w3 R6 E2 k' Y w0 n7 c0 h
MOV 74H,78H ;5 f: \3 X; \ d: f8 L* p' q/ r
MOV 75H,79H ;( @1 Y0 b4 y' w" g b! v
INTT1OUT: POP PSW ;恢复现场
+ E/ A9 p$ d; l2 TPOP ACC ;2 | l4 O6 \# _% F* g
RETI ;中断退出: s8 g6 {, r9 a0 _% c( {0 m5 R: H
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
9 r: z8 S" c/ L" Z! K: x6 Z: iMOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分/ e; g8 H( M a/ _
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
4 ^1 T( ?' t0 |8 RMOV 74H,78H ;
% Y ~3 I, w7 M eMOV 75H,79H ;6 N \$ V' I a0 x8 e4 H
AJMP INTT1OUT ;转中断退出
$ z8 o+ {+ {4 i, M I) E! l# vFLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时4 q+ v. ]3 v% i, V2 Z4 {2 c
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示2 q8 S7 y/ ]' ~* c+ n
MOV 74H,7AH ;
/ Y7 k2 }5 U3 r% f" `MOV 75H,7AH ;
! M& h, ?: h$ @6 _7 w J aAJMP INTT1OUT ;转中断退出% |0 d. P& G( d; N; L4 U- ]) s
;
0 V$ S: o/ [6 Z/ _' v;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;' x# q2 B: A7 x; \! Y9 u6 m3 s! L( K
;; 加1子 程 序 ;;8 A0 v$ }( f4 l: H1 X! g
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/ E S4 d8 {3 y$ B) h: u;
h' V! M0 |3 {0 J4 |ADD1: MOV A,@R0 ;取当前计时单元数据到A5 X6 p8 ^. H7 _3 Q
DEC R0 ;指向前一地址' t. v4 b; h# X
SWAP A ;A中数据高四位与低四位交换, w" w; y4 K; c8 t$ C' N
ORL A,@R0 ;前一地址中数据放入A中低四位
3 o1 \, c8 W% X) OADD A,#01H ;A加1操作
* L- m0 t. b( M# n$ x" W5 LDA A ;十进制调整
7 D" U' w* F1 [; j& a3 \MOV R3,A ;移入R3寄存器% [' N* ]; K4 Z; Y% G, b
ANL A,#0FH ;高四位变0
- i; G. l" b( RMOV @R0,A ;放回前一地址单元
2 j7 J: c \8 P0 f) N; ?MOV A,R3 ;取回R3中暂存数据1 q% ?4 c" H& X9 N2 i, \) K
INC R0 ;指向当前地址单元6 S* j; H/ P G! z3 X% U6 Q
SWAP A ;A中数据高四位与低四位交换; d6 \$ g9 M, b8 S8 n
ANL A,#0FH ;高四位变0
, k7 [+ A8 h( \* s, ZMOV @R0,A ;数据放入当削地址单元中% ^; a2 H) V3 D
RET ;子程序返回
% a+ b2 ]/ {$ a1 L" J4 W;- K/ q5 R9 K) @# r ?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6 |' e* z5 b9 X6 [0 p
;; 清零程序 ;;) E/ [6 e# Y) B" ]5 i
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;. s* D/ g& ~/ f
;.............1 c* ]5 Y% x7 A
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 o/ c: B% `, l% [ q$ v;; 时钟调整程序 ;;0 Z) z/ N! p# k; h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 f4 @; F( y, _& s
;当调时按键按下时进入此程序: j0 o; H0 S/ M: L* U6 K
SETMM: cLR ET0 ;关定时器T0中断8 a( s* W [! `
CLR TR0 ;封闭定时器T0
; j4 u- T3 N% I0 [' V/ TLCALL DL1S ;调用1秒延时程序# ~7 _8 L9 s: i
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)
! W% i1 @$ H3 `* ]! L% xMOV R2,#06H ;进入调时状态,赋闪烁定时初值
$ E. w+ {: j) m; O1 ISETB ET1 ;答应T1中断
0 b3 m) x' e: x) @SETB TR1 ;开启定时器T1
2 d& r' g( S1 p" Q' HSET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待" m% P, |. K7 x8 B( q/ e2 o. x
SETB 00H ;键开释,分调整闪烁标志置1
8 J! b' Q, \+ [) }SET4: JB P3.7,SET3 ;等待键按下$ [3 f0 w3 F+ ]" Q) R
LCALL DL05S ;有键按下,延时0.5秒
4 q' s3 A1 b, L* ^- `3 t* UJNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
# M9 s+ a" v. E& nMOV R0,#77H ;按下时间小于0.5秒加1分钟操作8 }6 \+ n) t' W# b, K" V8 @
LCALL ADD1 ;调用加1子程序: t0 q3 H. r& E8 F9 B
MOV A,R3 ;取调整单元数据
% T3 j2 o6 p' S9 K2 FCLR C ;清进位标志/ Q! u/ x }& w, `- ]+ L
CJNE A,#60H,HHH ;调整单元数据与60比较. l# z2 l& w2 x
HHH: JC SET4 ;调整单元数据小于60转SET4循环
- U6 w/ g; F& ?5 A# OLCALL CLR0 ;调整单元数据大于或即是60时清0% f$ r% a& [+ }
CLR C ;清进位标志5 y( m0 z# v2 e
AJMP SET4 ;跳转到SET4循环
; G( t, f; s2 L5 X) ACLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断& f) T* A P2 z! ~8 F* q6 g0 m
SETB TR0 ;开启T0定时器(开时钟)
- o' I; c* M! z& T' D* ?) J8 ~CLOSE: JB P3.7,CLOSE ;无按键按下,等待。0 L" H( l; P) G3 k. y1 k/ ^% d
LCALL DISPLAY ;有键按下,调显示子程序延时削抖% h* [- @2 ?: `1 G
JB P3.7,CLOSE ;是干扰返回CLOSE等待. z \3 H% X1 r' C, F
WAITH: JNB P3.7,WAITH ;等待键开释
. u: B! a# S+ U' k+ ~LJMP START1 ;返回主程序(LED数据显示亮)
7 W* Z# W4 U" M" i( DSETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
7 p4 c4 ?* [3 ]. ^% Q2 L# fSETHH1: JNB P3.7,SET5 ;等待键开释
( n- w% ~5 p$ J. ZSETB 01H ;小时调整标志置1
6 j8 }; N Z0 g; ?$ W1 K9 A0 ^0 lSET6: JB P3.7,SET7 ;等待按键按下
/ z! m3 K5 d! N5 `2 fLCALL DL05S ;有键按下延时0.5秒
, Y7 r+ n$ F. L: DJNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
0 R$ L) U/ x- k$ T1 U0 BMOV R0,#79H ;按下时间小于0.5秒加1小时操作
! m4 E. v+ W8 W1 G, Y& f% C& c* [LCALL ADD1 ;调加1子程序
6 }$ J; G7 V# R5 W1 F$ o4 C( I RMOV A,R3 ;9 {" x1 n9 X* d8 ?
CLR C ;* n& B, f/ n I- q/ }
CJNE A,#24H,HOUU ;计时单元数据与24比较
& K, S% _$ R3 I5 ?/ B9 K: j9 U, {& E- FHOUU: JC SET6 ;小于24转SET6循环
7 x6 d; b" w( w( K. M% TLCALL CLR0 ;大于或即是24时清0操作
7 O/ W2 b, k! N5 r8 L& cAJMP SET6 ;跳转到SET6循环! g& B$ f; g, ]; c+ Z' j$ O' |
SETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释/ H6 C0 z% @5 |# h2 ]
LCALL DISPLAY ;延时削抖
% k1 |# n; }$ x0 A$ D, y% s% \: `JNB P3.7,SETOUT ;是抖动,返回SETOUT再等待
! F( u5 E g( {$ n, w* S# bCLR 01H ;清调小时标志
P) c- P2 d0 `- {' {# kCLR 00H ;清调分标志
* B& X v" z6 ]3 S8 `8 v+ lCLR 02H ;清闪烁标志
* V" |% F2 G4 s1 Z/ D- rCLR TR1 ;封闭定时器T11 A. u c7 d5 W/ u0 u
CLR ET1 ;关定时器T1中断8 Y' e$ s+ Q+ O I$ H
SETB TR0 ;开启定时器T0
$ b, e5 B$ |8 ?) I8 O. R. ySETB ET0 ;开定时器T0中断(计时开始)
" B4 K+ u8 F% M J/ ELJMP START1 ;跳回主程序
5 B9 d' h% K" [; o# e1 c" HSET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
- l& H- U b* Y) w% F9 uAJMP SET2 ;防止键按下时无时钟显示
7 D( z0 \2 l1 ^/ NSET3: LCALL DISPLAY ;等待调分按键时时钟显示用2 g$ c# r9 i% U) I1 S
AJMP SET4* d, `: d. \. o4 P& J; }# K" O
SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时). s; h/ I) @5 M# k4 Q
AJMP SETHH1 ;防止键按下时无时钟显示
2 i# Q: m0 F+ a8 m8 SSET7: LCALL DISPLAY ;等待调小时按键时时钟显示用/ e' Z! k$ |+ w+ j1 X6 k9 W
AJMP SET6$ N7 ]" K+ r* H
SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待0 N% w6 u7 y) y+ @# ~: y8 ]
AJMP SETOUT ;防止键按下时无时钟显示/ ~' ?! `: u4 V6 Z, }- Y, g
;
! Y* q6 G! k2 Q& G( P;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$ W) n6 L# \2 L$ u6 w! C q% B8 {* M
;; 显示程序 ;;. l3 \5 B/ l: o
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7 V5 Z4 F7 i/ I% {. W4 e$$$$$$$$$$$$$$$$$$$$$$$$$$$
+ c+ ^/ v, \7 U7 y5 c: w2 g+ F9 |;1MS延时程序,LED显示程序用2 n+ z+ C/ w# v- \
DL1MS: MOV R6,#14H: V8 J( Q: f% Z8 I4 o X: b7 O: r
DL1: MOV R7,#19H9 ~% J4 Z2 `, s- E$ V5 g
DL2: DJNZ R7,DL2- t- t! c& L8 g. x1 ^+ }
DJNZ R6,DL1( U4 q" x; Q1 E: Z% F
RET
$ {9 t |3 i7 p$ R;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
- ^1 V# E- C ]7 k# U: tDS20MS: ACALL DISPLAY! V0 v1 K: ?6 W" j2 P1 y
ACALL DISPLAY
/ L! K6 W& g- T( d" ZACALL DISPLAY+ }0 I, ~7 v5 h) n
RET& l0 t. v E2 c5 \0 F( G' b
;延时程序,用作按键时间的长短判定. y6 `; c+ Z! Q: \: E
DL1S: LCALL DL05S
4 w: h7 {( B/ F3 j. c% Q5 PLCALL DL05S
& }( s+ b! B8 N# ^, g$ U" rRET
2 r5 Y3 W, ^( L( B+ Q: O; @DL05S: MOV R3,#20H ;8毫秒*32=0.196秒; a$ V: |! p& A. N5 {
DL05S1: LCALL DISPLAY, \# D; _* H' s$ o/ Q
DJNZ R3,DL05S13 G4 r3 {; p2 i9 @2 |# C5 c
RET! D: Y' m6 X) X1 K4 M C
END ;程序结束3 s) p3 O& H8 ] v
|