51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 8 w4 E+ `* g$ r8 `+ j
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 ; S( y3 g. v) b% t E; k- W
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。
9 a1 q9 f1 v& V1 e+ g 6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
1 _/ M. ^2 Y3 ?$ K' h/ m/ H$ H2 l, S
5 d0 ~8 o' @4 e- Y/ i$ X. F / @. E8 e: ]2 W {; o5 K* Z
, E6 x7 X, ]. G! C# p( `
以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。# H1 _6 m* b) a2 j" l
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
b! z5 u+ [8 p0 C! ~;; 中断入口程序 ;; (仅供参考)' [3 y& N- F7 n: v9 w* d: z( |9 ^- u
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
& _" v, g3 S& Y) O% x; g1 E/ V;
# f5 x: x: L; C/ O+ kORG 0000H ;程序执行开始地址% R' p& p; o6 Z% a+ P
LJMP START ;跳到标号START执行
2 }7 M) w v& R5 T5 EORG 0003H ;外中断0中断程序入口( R9 k& {9 r, d2 b
RETI ;外中断0中断返回- l+ \) D1 u- ], j7 N7 t5 _4 H
ORG 000BH ;定时器T0中断程序入口4 L' d, A% x* V5 F3 a6 n
LJMP INTT0 ;跳至INTTO执行
1 B* M/ a' `( f; f* ]ORG 0013H ;外中断1中断程序入口
4 v1 P) T+ z7 M5 pRETI ;外中断1中断返回
3 ]* P' S; ^) NORG 001BH ;定时器T1中断程序入口1 g L; _# c) y2 e7 p! I. e
LJMP INTT1 ;跳至INTT1执行
' ?9 O$ _( {) ~/ T) r9 sORG 0023H ;串行中断程序入口地址
0 l# c* ?" L DRETI ;串行中断程序返回
1 D8 H+ C/ c+ a2 }2 R0 g;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
# Q( Y" Z G s! ?$ I9 t. K) n;; 主 程 序 ;;; V$ L, x1 m6 L6 W. \; N
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 X) x) p: m q1 r2 @7 [/ Z' O
;# D" Y3 T% L( r* F: V& `% K1 G
START: MOV R0,#70H ;清70H-7AH共11个内存单元
( i, {+ T; W7 N: \" x% OMOV R7,#0BH 2 f9 V7 ~# _9 k6 y4 X( z/ p; }
;clr P3.7 ;
4 m! a$ J/ ]& k! a x# `. xCLEARDISP: MOV @R0,#00H ;7 L# Q/ h( d( H; U) p
INC R0 ;& v/ f7 F& ^& }2 q. ?$ s" G
DJNZ R7,CLEARDISP ;2 \* o' F8 A! [! ?1 M$ ^
MOV 20H,#00H ;清20H(标志用)0 a* ?7 i! G5 \( i) T0 v7 o+ D; m) M
MOV 7AH,#0AH ;放入"熄灭符"数据5 L7 J' ]' e- b r/ ?
MOV TMOD,#11H ;设T0、T1为16位定时器
/ n7 O; u( f: a) O4 L0 b8 JMOV TL0,#0B0H ;50MS定时初值(T0计时用)
4 m4 g& Y/ i: A0 T$ @* z- k2 cMOV TH0,#3CH ;50MS定时初值
/ Y5 n$ `4 U; N( e$ ~. }MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用); y" N* F7 @, c. C
MOV TH1,#3CH ;50MS定时初值
2 L! e- f- n; Q( X) v3 w6 @' DSETB EA ;总中断开放* j$ G% W# m9 i; Y: }' Y
SETB ET0 ;答应T0中断
% _/ b6 S: ^ c' L. s" dSETB TR0 ;开启T0定时器 L7 V; k, m5 }8 ~, ? \7 w) |$ N
MOV R4,#14H ;1秒定时用初值(50MS×20)8 w3 S; f7 J& G2 ^8 }
START1: LCALL DISPLAY ;调用显示子程序
`" r' P: X( m6 ^5 A( _; X0 M/ ZJNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
# p( Q4 a$ B! }" F% [4 V" F4 pSJMP START1 ;P3.7口为1时跳回START1
. J- ~, R; l6 tSETMM1: LJMP SETMM ;转到时间调整程序SETMM3 D6 [) S; ]9 A" N7 T
;
: Y+ Y) e3 d1 a5 A2 f' k" N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
" S5 ]! K# q& ]6 X5 P: T;; 1秒计时程序 ;;
3 {$ U" T4 O; T/ y8 C. H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;. j7 u- E1 K! J. S) t
;T0中断服务程序 A( [$ C) r. r4 q
INTT0: PUSH ACC ;累加器入栈保护2 [0 r" \! Y3 ^1 I: f
PUSH PSW ;状态字入栈保护
! d& [4 d z. ~+ D/ c, R1 kCLR ET0 ;关T0中断答应" P6 h# \1 ^" v0 I4 q
CLR TR0 ;封闭定时器T0
0 ]4 c: O) p9 N& c$ ?1 pMOV A,#0B7H ;中断响应时间同步修正
9 I: D& N" H5 [; fADD A,TL0 ;低8位初值修正 X+ Y) ]* U0 E0 n' I0 H; U" o/ i
MOV TL0,A ;重装初值(低8位修正值)/ K6 j$ g& {6 y& d, B
MOV A,#3CH ;高8位初值修正% n; d0 j1 \% Z' b
ADDC A,TH0 ;' Q# Q. q/ a4 d. W
MOV TH0,A ;重装初值(高8位修正值)
5 i6 H. S2 u3 \6 m( V* q' r( XSETB TR0 ;开启定时器T0
; O& U2 R, |: j. X+ b/ j2 K; }DJNZ R4, OUTT0 ;20次中断未到中断退出
* L" R3 x" }: S4 x. u6 cADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
# f: l9 e8 I2 ?9 y- |) n2 h% yMOV R0,#71H ;指向秒计时单元(71H-72H)
1 k8 z4 |' l% @6 ~$ j8 P, RACALL ADD1 ;调用加1程序(加1秒操作)3 [$ W6 ?. Q$ K! k |0 X* c
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
/ B& J$ z' N$ WCLR C ;清进位标志
1 H+ ]4 p% Y# G8 C. _CJNE A,#60H,ADDMM ;! x4 `+ L/ G: n x3 l/ c
ADDMM: JC OUTT0 ;小于60秒时中断退出
/ M+ { k) o& z, X6 l$ OACALL CLR0 ;大于或即是60秒时对秒计时单元清0/ `* A l& X9 u, b
MOV R0,#77H ;指向分计时单元(76H-77H), m- c9 ]0 d! z5 ~& ?1 H# R ^
ACALL ADD1 ;分计时单元加1分钟
3 q$ j( S; _: L$ @: I; e' WMOV A,R3 ;分数据放入A9 F* M# u1 R( s z* z
CLR C ;清进位标志
9 b- f2 @7 |: {2 ^CJNE A,#60H,ADDHH ;
- f/ y! S. t: E' P) I) ]ADDHH: JC OUTT0 ;小于60分时中断退出# s& G, L: |$ ^! G* n4 z8 K! F
ACALL CLR0 ;大于或即是60分时分计时单元清0
9 f& o$ ^ L) B5 e( J( A9 r! ?$ dMOV R0,#79H ;指向小时计时单(78H-79H)
+ C5 K% |8 D) F. K8 qACALL ADD1 ;小时计时单元加1小时
/ t* E5 T. ~+ B5 gMOV A,R3 ;时数据放入A
3 @3 @8 k7 q7 s: m2 l8 z8 E' P8 u' O& WCLR C ;清进位标志
) S' X2 `8 c {( qCJNE A,#24H,HOUR ;
6 k( W2 d' ^; j W& R: |HOUR: JC OUTT0 ;小于24小时中断退出& A$ r5 g1 n O# o
ACALL CLR0 ;大于或即是24小时小时计时单元清0 W5 \! `6 D9 k7 r3 v% X
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
+ i! l r5 N4 g, G2 B) KMOV 73H,77H ;入对应显示单元; I% I( T% x/ \6 V
MOV 74H,78H ;8 `1 N9 B" H# V3 L$ _: o
MOV 75H,79H ;; ?3 t; M0 Q- D: u3 O% ^
POP PSW ;恢复状态字(出栈)
& Q. n6 k6 @) g+ iPOP ACC ;恢复累加器' S, G; I) P- ]9 D
SETB ET0 ;开放T0中断
+ a1 i9 |# N6 R9 w8 f+ MRETI ;中断返回
4 A6 F! f e7 n0 O' [;" [& m z4 k* O% b) K( K6 b
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
. q6 f ^6 n; z6 q5 b- j;; 闪动调时 程 序 ;;6 x% d' d8 q2 k" `! p# ]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 [6 t9 t8 z- q;T1中断服务程序,用作时间调整时调整单元闪烁指示 i/ N' a& E' \ ~) b. n' Q T
INTT1: PUSH ACC ;中断现场保护
& W0 y' z7 L K6 b$ ]# K2 u' i' dPUSH PSW ;8 a0 g5 W4 N4 B. M3 I0 z5 b6 l
MOV TL1, #0B0H ;装定时器T1定时初值
p9 X" A: ~1 G6 V* e4 ^: e( BMOV TH1, #3CH ;
3 e+ H: c" y- b- [' t D# W( hDJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)% L$ [7 o( T( H. @
MOV R2,#06H ;重装0.3秒定时用初值2 Q8 T2 R1 r7 O6 S W
CPL 02H ;0.3秒定时到对闪烁标志取反( L: G ~3 n( j
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"
! O0 Z8 v: u' t+ t$ R& h4 g0 @; DMOV 72H,76H ;02H位为0时正常显示
! K2 y/ ]+ p {; SMOV 73H,77H ;
3 h+ a" J7 a# U; L- _% w0 iMOV 74H,78H ;- u8 g# F. k' T6 i
MOV 75H,79H ;) \3 E) [* U+ o/ g/ f
INTT1OUT: POP PSW ;恢复现场
v# ^4 m, w5 i/ [8 GPOP ACC ;
4 t+ T. K4 ~+ I3 I4 \6 ^- [7 ^ fRETI ;中断退出1 B+ m# ?3 O& M
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制, f. {( U$ A! u" \* j/ a( r! F
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
, S3 [' \5 \& g0 J) _MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
7 b! Q7 U3 l, _ c0 Z0 VMOV 74H,78H ;
; E6 Q" D5 E% v4 a% O* e% H8 V% xMOV 75H,79H ; g* w' c* d% f7 H( M
AJMP INTT1OUT ;转中断退出
! o- L5 F1 X5 B9 D; {FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时1 [+ e0 W& ?" R7 A2 r
MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示9 K* X! E% Y& [: i3 v
MOV 74H,7AH ;
" k& ^& Q& r! z/ BMOV 75H,7AH ;" K! F% M) R2 i7 e& S
AJMP INTT1OUT ;转中断退出+ G2 b. @2 d- |9 k& V& B
;
4 _$ }9 X% l6 Q3 O X; d;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: G1 O9 n! w0 a' H- v3 x/ W! H/ r
;; 加1子 程 序 ;;
% l% b# r7 c- X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+ }2 ^# D8 i. o$ d2 j+ h
;9 G8 c/ `6 Q+ X, }2 H5 s
ADD1: MOV A,@R0 ;取当前计时单元数据到A% K0 a' \% R% g, r% V
DEC R0 ;指向前一地址
* y" D$ e- b5 g' qSWAP A ;A中数据高四位与低四位交换" ]5 c* W1 L u; f) t2 E/ v. Z
ORL A,@R0 ;前一地址中数据放入A中低四位
8 I$ j, X* w$ l0 C& {# }: {$ qADD A,#01H ;A加1操作
8 _9 O9 T: K" N: S# [1 @DA A ;十进制调整
1 b' q4 X- ~: Y1 UMOV R3,A ;移入R3寄存器% s/ R% O1 }% J% `
ANL A,#0FH ;高四位变0% v. \3 ~2 M6 ~2 J
MOV @R0,A ;放回前一地址单元0 Q- g% s" ]# ~4 j+ a6 B2 e
MOV A,R3 ;取回R3中暂存数据
- x/ ]2 x; c; KINC R0 ;指向当前地址单元+ q$ n+ @" L. U# }
SWAP A ;A中数据高四位与低四位交换
9 `8 e5 h. p4 N( i% rANL A,#0FH ;高四位变01 X' a- F4 L' W5 t" p1 [& `
MOV @R0,A ;数据放入当削地址单元中2 F5 q, G& C2 d7 ^
RET ;子程序返回
# K$ y8 s! s& D;
Q+ h! ?' ]2 o# \7 q;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
& g0 N) w" a/ x;; 清零程序 ;;
$ ]0 [ Y7 r% L3 s) u;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 o* U& \$ S- k0 `: c1 M- D ];.............$ C1 s _. v- R0 s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 ~2 ?2 O$ q9 a- D5 v. @0 ~;; 时钟调整程序 ;;
" A6 g& h0 |; J;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;: o5 M4 K! H+ G5 S8 e0 x: x' o
;当调时按键按下时进入此程序
: y n* ?2 a; {7 ^7 m1 K! {) y f8 ISETMM: cLR ET0 ;关定时器T0中断4 @5 P4 b5 T+ x7 q- m% r; _
CLR TR0 ;封闭定时器T0& k: a- d/ z. O3 A S
LCALL DL1S ;调用1秒延时程序 t& z8 H$ {6 y
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)+ S. p- |' A2 [+ G$ k$ C
MOV R2,#06H ;进入调时状态,赋闪烁定时初值: t, b% U& e7 g: Z
SETB ET1 ;答应T1中断
- n1 \& _& W* h. |6 GSETB TR1 ;开启定时器T14 Y/ s& q6 H9 D9 K! }( Y% g' Z' @5 [
SET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待5 d6 z; P( d# A7 A
SETB 00H ;键开释,分调整闪烁标志置1+ B- X$ ?8 O( O# @$ u
SET4: JB P3.7,SET3 ;等待键按下
% n( n- d: T, b( MLCALL DL05S ;有键按下,延时0.5秒
+ \' I" u# h9 h/ wJNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
8 |5 j- y0 v" c! KMOV R0,#77H ;按下时间小于0.5秒加1分钟操作4 f" N* R1 x' w! B E4 L
LCALL ADD1 ;调用加1子程序
' Y7 H3 i" Y7 nMOV A,R3 ;取调整单元数据
5 {$ q9 b: ?4 ^+ A% PCLR C ;清进位标志
% G i2 n7 n4 w( XCJNE A,#60H,HHH ;调整单元数据与60比较
$ o3 T$ q4 T0 l5 Y$ N- m! `HHH: JC SET4 ;调整单元数据小于60转SET4循环
6 {6 c: r3 l; u$ @. VLCALL CLR0 ;调整单元数据大于或即是60时清05 Y( F- K5 F, G
CLR C ;清进位标志/ ]9 _. @/ K. W% D+ u" B& i
AJMP SET4 ;跳转到SET4循环
$ D5 o: I/ q9 O9 A& ?CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断# p& k6 E$ Q" k# E; d
SETB TR0 ;开启T0定时器(开时钟)
( l$ k. l3 w5 ? KCLOSE: JB P3.7,CLOSE ;无按键按下,等待。
8 p" Q" m0 x: O9 M0 v, u; i# wLCALL DISPLAY ;有键按下,调显示子程序延时削抖- W& f! `4 A+ Z
JB P3.7,CLOSE ;是干扰返回CLOSE等待
6 H" q- F+ U( O& LWAITH: JNB P3.7,WAITH ;等待键开释
. v. G& ]0 W) D3 ^LJMP START1 ;返回主程序(LED数据显示亮)
* h, }9 e# i( f" eSETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
. }4 z" `5 Q: [" b( D7 ~. w% }SETHH1: JNB P3.7,SET5 ;等待键开释
" }% d3 c1 |9 XSETB 01H ;小时调整标志置1) S6 y( G) ^: n, ?; m. |! W8 X! R# o
SET6: JB P3.7,SET7 ;等待按键按下
- u; _* m, ]9 ?) D6 bLCALL DL05S ;有键按下延时0.5秒, A" J: G. s) H, W' A
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整
! q# A! q* }+ H4 UMOV R0,#79H ;按下时间小于0.5秒加1小时操作
$ S/ h2 t3 `3 }0 [LCALL ADD1 ;调加1子程序
; K" S) Z+ a r( F8 zMOV A,R3 ;
( S1 U, ?$ y a0 P) y* t/ Z4 bCLR C ;( M. d3 f+ b9 C" T b1 _
CJNE A,#24H,HOUU ;计时单元数据与24比较7 k+ ]0 u( {4 q/ \8 {
HOUU: JC SET6 ;小于24转SET6循环, }/ b3 @$ n3 `1 G, e
LCALL CLR0 ;大于或即是24时清0操作
; S, B. Q1 v* y+ Y; \AJMP SET6 ;跳转到SET6循环
0 ~4 k8 y6 \3 [/ a4 J/ tSETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释
. f/ I5 u; G/ nLCALL DISPLAY ;延时削抖
9 N, R- L2 K* G d$ L. u+ yJNB P3.7,SETOUT ;是抖动,返回SETOUT再等待" z- `* Q2 v8 _
CLR 01H ;清调小时标志
1 D' @( y' y7 y. b" h wCLR 00H ;清调分标志
4 u% b3 v6 Q9 b1 {# }- h3 O, wCLR 02H ;清闪烁标志
, \1 w6 d2 l- }: Z4 y! sCLR TR1 ;封闭定时器T17 B2 B( y! g w9 a
CLR ET1 ;关定时器T1中断
' C5 Z) L, R T9 p/ Y9 }SETB TR0 ;开启定时器T0
0 F* V# ]/ Z" r9 [4 E( \& o6 kSETB ET0 ;开定时器T0中断(计时开始)
: n( s+ Y: g0 `( ?# ULJMP START1 ;跳回主程序
8 a( g, A; q% w1 h- }SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
" K3 y$ H: l. ?5 O& O# HAJMP SET2 ;防止键按下时无时钟显示
3 g; P5 a% u) D5 n9 t" ?SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
! z, t1 U/ A7 p& kAJMP SET4+ D4 _# d& F0 V, e! R+ F6 `- }
SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)
6 V) A% m, ]8 m5 J N0 Y% SAJMP SETHH1 ;防止键按下时无时钟显示: m$ P; ]: c1 T% Q1 m! K8 P
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用. z- V, r: W, p
AJMP SET6
5 \- y& X2 _8 I; ?: b* hSETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待0 B l4 X6 |3 [) U
AJMP SETOUT ;防止键按下时无时钟显示- K: P" P6 |. Z; ^( r0 ^
;0 Y: d' I& p2 s+ _5 [, B
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;) Y" _3 m! a l o( e/ b
;; 显示程序 ;;
; o' l" _6 {% U2 L$ g;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 D6 V" r6 h8 d& s
$$$$$$$$$$$$$$$$$$$$$$$$$$$( ?! M; I/ _2 ~4 o( \' Q
;1MS延时程序,LED显示程序用& t, v) T* Y2 b L9 g& _! [6 J
DL1MS: MOV R6,#14H
) Q( g+ \* _: \+ z: U1 E: q0 RDL1: MOV R7,#19H( y/ T1 x" z3 Q
DL2: DJNZ R7,DL20 c' P* T$ U9 \
DJNZ R6,DL1
* ?) Z: I& e) XRET
/ E& U* e8 h% E0 ~2 B0 J;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
; P: e( Q& c7 e+ r. v- KDS20MS: ACALL DISPLAY
/ }# e$ @* `) u" a+ \ACALL DISPLAY
5 Q p2 _& I2 j8 Q* a# E6 T+ qACALL DISPLAY* Q. V5 n/ I& u* a' x/ H
RET% V' ?$ q% J3 p# H
;延时程序,用作按键时间的长短判定0 {' P! K( E. Q0 Y- g
DL1S: LCALL DL05S
! u5 y/ D- o3 W8 m# b8 P0 HLCALL DL05S
; m, R- |5 G: M7 U& T" P8 n7 ]RET
8 l: I% p, E. l, D5 _DL05S: MOV R3,#20H ;8毫秒*32=0.196秒$ J! Y& {1 N- V' {+ ^- ^& {! G
DL05S1: LCALL DISPLAY& t8 `/ h; T# H
DJNZ R3,DL05S1
5 L6 K: b$ O% h8 Q& l* K$ kRET- a6 S S- `+ w2 T
END ;程序结束2 c% S' r8 d; J5 y' y; k
|