51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 / r9 i: V1 H3 s: a# I( |$ |' Z
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 1 ]1 ^1 l% c W* g. S M& N
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 * V W5 K( ]8 t# r
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
9 q' R4 N# A i3 i5 i k2 g( A3 J6 o! x6 B% c% E7 f
1 U0 Q1 I7 d4 @2 y1 Q6 Q
Y2 H s1 A7 g: E 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。
1 V9 l0 M' ?9 J- I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
* [, I+ m0 R( t3 \;; 中断入口程序 ;; (仅供参考)# V" c& I% W7 S- Q: h0 k8 [ G
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;! M! c7 `2 C& n) D; C" {
;: i# Y: b+ j, m2 j$ Z
ORG 0000H ;程序执行开始地址% q( A4 e: J l) h
LJMP START ;跳到标号START执行
& D: ~' M# w; h! H( aORG 0003H ;外中断0中断程序入口
b0 }: C8 d* RRETI ;外中断0中断返回 ^" F. h. l7 M' ~9 \" n- @
ORG 000BH ;定时器T0中断程序入口0 h }7 F$ @0 ^, g1 b
LJMP INTT0 ;跳至INTTO执行
8 K2 c7 L) z3 P: gORG 0013H ;外中断1中断程序入口
4 m& Z0 R& Y/ a, a; aRETI ;外中断1中断返回
X3 g& b# o! n. `2 y* _" E1 cORG 001BH ;定时器T1中断程序入口8 T6 L! U. N0 K9 l& U$ d! j' M5 n
LJMP INTT1 ;跳至INTT1执行& D- P6 A) ]) A: E. P
ORG 0023H ;串行中断程序入口地址. V$ t( M+ {8 W: i
RETI ;串行中断程序返回5 v3 i* \9 ^7 w% F! \
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
* \) k" f5 E5 Q0 w7 S0 O3 H;; 主 程 序 ;;/ h0 e) o* w4 q0 X6 w# a0 B, Q
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;* N! p8 c/ V/ t" O
;0 J+ ~& k, ^4 M
START: MOV R0,#70H ;清70H-7AH共11个内存单元
. @, G; i4 _9 n* eMOV R7,#0BH
. |, @; |* d) A3 V5 ]$ b;clr P3.7 ;
) o0 F4 y! K& K% E: G0 OCLEARDISP: MOV @R0,#00H ;- q: ?" J* H6 \* _3 N, D4 R
INC R0 ;
: S G+ K0 u& LDJNZ R7,CLEARDISP ;% }' ~$ v+ n: Z5 h
MOV 20H,#00H ;清20H(标志用): G' v( ?% `2 @7 U
MOV 7AH,#0AH ;放入"熄灭符"数据7 u# M5 c( m1 f% ~4 ]- @( C- b7 n! n
MOV TMOD,#11H ;设T0、T1为16位定时器
7 \( j, R; c4 o H6 rMOV TL0,#0B0H ;50MS定时初值(T0计时用)
2 Y$ |& z( o. ]- }MOV TH0,#3CH ;50MS定时初值+ r# F9 A$ e% D# q% x
MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)7 H$ [/ Q. m( j& K8 N' O
MOV TH1,#3CH ;50MS定时初值1 U3 J& ]* e2 }0 X
SETB EA ;总中断开放
8 U N/ @0 {% Y9 r# a/ KSETB ET0 ;答应T0中断0 |$ `: d. O! v$ M) e9 P, @2 c3 l
SETB TR0 ;开启T0定时器
7 |' e4 b8 p* y. x# IMOV R4,#14H ;1秒定时用初值(50MS×20)
9 z s& E2 m. |7 JSTART1: LCALL DISPLAY ;调用显示子程序; J9 Y0 C: z6 k: _
JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
% H/ d C; g8 Z W8 O, e8 OSJMP START1 ;P3.7口为1时跳回START15 R# ?+ l% q) o( @( ~6 E7 V: H0 x; Q5 h
SETMM1: LJMP SETMM ;转到时间调整程序SETMM) s/ t( c- h8 M# |( f
;0 j6 G8 Y6 r/ A7 X& Y4 I
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
. i3 A" T; D7 H( g4 b H;; 1秒计时程序 ;;& a" [0 m; H3 V% d9 L2 s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6 x c7 U- O* @4 U
;T0中断服务程序 b0 [% e% d8 {8 x3 ^
INTT0: PUSH ACC ;累加器入栈保护6 F: g M8 O. Z: d! W
PUSH PSW ;状态字入栈保护+ r, D5 C( C6 l8 w
CLR ET0 ;关T0中断答应7 D% ]3 g2 O" R
CLR TR0 ;封闭定时器T01 ^' N# X# S6 ?8 g/ {* V+ h
MOV A,#0B7H ;中断响应时间同步修正
4 z6 i y) F" H) Y5 QADD A,TL0 ;低8位初值修正0 A& K/ E; _' A$ c9 e
MOV TL0,A ;重装初值(低8位修正值)! R' I5 d+ ^- d
MOV A,#3CH ;高8位初值修正
e) R( f( }# E: i0 D; _3 W9 aADDC A,TH0 ;( J) e/ e) J+ H6 k: I4 [$ g
MOV TH0,A ;重装初值(高8位修正值)
7 ]6 p% B7 [# b+ I& ZSETB TR0 ;开启定时器T03 }: w& |: ~* r p
DJNZ R4, OUTT0 ;20次中断未到中断退出; G- t& w3 M3 j6 N4 k# K4 i
ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值
5 O x* M9 c; l) N# E _MOV R0,#71H ;指向秒计时单元(71H-72H)
2 i/ f. b# P8 c% M9 aACALL ADD1 ;调用加1程序(加1秒操作)
( F+ ~0 U* E2 U% S {MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)
& V" {7 x& t! z- B2 U' ]! F0 {7 qCLR C ;清进位标志
, |2 m2 }* j9 V: g( C6 P+ W+ b- HCJNE A,#60H,ADDMM ;
3 v" S" w' _6 a- Y) S" pADDMM: JC OUTT0 ;小于60秒时中断退出
: O' m7 s) @) t0 pACALL CLR0 ;大于或即是60秒时对秒计时单元清0
' w; b0 `: l! Q' r- s% O" HMOV R0,#77H ;指向分计时单元(76H-77H)
. X O8 e) _0 o4 D3 vACALL ADD1 ;分计时单元加1分钟
, g* `( u ]9 OMOV A,R3 ;分数据放入A2 b. @& J) H4 N# L. l% l
CLR C ;清进位标志5 [% q4 u" M+ V& t
CJNE A,#60H,ADDHH ;
8 x1 O& N5 G4 QADDHH: JC OUTT0 ;小于60分时中断退出" b2 v' k( }% L5 }2 ?2 g. f* V
ACALL CLR0 ;大于或即是60分时分计时单元清0
/ J5 p# @# a; @. WMOV R0,#79H ;指向小时计时单(78H-79H)
' b5 y5 D7 U% EACALL ADD1 ;小时计时单元加1小时; R2 p: W4 R) R6 L
MOV A,R3 ;时数据放入A* \1 L+ x: [: E; i9 |
CLR C ;清进位标志
N- X7 N) w' P7 o: t+ X9 {% jCJNE A,#24H,HOUR ;: b/ s; w, g1 d4 n7 U4 _
HOUR: JC OUTT0 ;小于24小时中断退出& ?2 K( A; y. _
ACALL CLR0 ;大于或即是24小时小时计时单元清0' f; |) F3 J, v" a# J
OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
3 {* n9 ~5 N( z& R6 uMOV 73H,77H ;入对应显示单元
" m9 f( ^% N7 RMOV 74H,78H ;9 G" O4 ~+ n, S0 e, b
MOV 75H,79H ;
* g) [9 l# t: t5 T- `- EPOP PSW ;恢复状态字(出栈)
3 i( @5 T& S) P$ lPOP ACC ;恢复累加器. C5 q b% \; r4 A+ k6 N+ Q5 E
SETB ET0 ;开放T0中断9 w# e$ f% w7 g: u/ t2 B0 |
RETI ;中断返回
. c" H @: `" @8 Z;
Q6 C8 Y l' r/ J1 z;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
) u* c9 G3 t+ C# B6 }7 N" q* f;; 闪动调时 程 序 ;;, ]3 E" T/ q+ z+ F' y' e
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
* ^( I7 Z. {7 z;T1中断服务程序,用作时间调整时调整单元闪烁指示
9 D4 q0 _0 I6 O) P- y! V7 \INTT1: PUSH ACC ;中断现场保护! g) |" T- t$ g, C2 d8 d1 p
PUSH PSW ;
7 B8 u0 H7 k2 ~6 }' I7 ~) lMOV TL1, #0B0H ;装定时器T1定时初值" k. o9 a" \4 u! T/ d! ]. H" t+ q
MOV TH1, #3CH ;# |! G( r- K8 z% \+ G( U- W1 i
DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)
3 w. |. X8 @! P& g" BMOV R2,#06H ;重装0.3秒定时用初值
' ]& l" z6 `" h+ l5 T8 A; rCPL 02H ;0.3秒定时到对闪烁标志取反! j; B) B6 s, i8 @1 h
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭") ~1 d6 @3 p/ D
MOV 72H,76H ;02H位为0时正常显示1 L, u6 _5 o. w% \) I' V# b* k7 I
MOV 73H,77H ;. d5 E% s! b- Y" c- h) N
MOV 74H,78H ;9 j* s) R/ S/ q" b4 _9 h
MOV 75H,79H ;
8 n+ ^& q9 b% B9 x- L" D" y' p7 xINTT1OUT: POP PSW ;恢复现场
8 l+ L6 U3 u& jPOP ACC ;
4 a- l* d7 l: t* |2 gRETI ;中断退出3 U- X2 J9 `8 {
FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制8 b \& z8 U, _# J E5 s
MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分
# K$ m u8 t/ z* f) p) W' mMOV 73H,7AH ;显示单元(72H-73H),将不显示分数据1 N6 D1 M* y D3 T i: c
MOV 74H,78H ;* C3 G4 x/ H3 D
MOV 75H,79H ; c& i9 Z% i( J/ d& R4 X% k# j# ]" C
AJMP INTT1OUT ;转中断退出: y8 i! R, q' C2 g2 y6 {! c3 e$ k
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
# i/ d4 C3 ~; |" a9 XMOV 73H,77H ;显示单元(74H-75H),小时数据将不显示
' O# D8 I, {. o9 i% W- x HMOV 74H,7AH ;
2 U( u; ~, W0 X8 aMOV 75H,7AH ;& x" K! j( D! @! S6 U8 S
AJMP INTT1OUT ;转中断退出 @& s0 t# n' h( ?% i
;
4 o% @+ ~/ m# B% V4 x( {;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;% d9 f3 z8 u' v- o8 t, i
;; 加1子 程 序 ;;
" J5 q9 P5 V) e! L3 I, r;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;% s, b/ H+ K) U5 \$ k9 E7 q4 s" T
;0 s3 `' g* I$ {% |) i: V
ADD1: MOV A,@R0 ;取当前计时单元数据到A
) N/ ? C8 _4 Z. _$ o* qDEC R0 ;指向前一地址# _" y, F T! e* {- h7 r
SWAP A ;A中数据高四位与低四位交换
0 o e0 j' L0 Q0 O/ v2 I& c$ bORL A,@R0 ;前一地址中数据放入A中低四位8 K9 _& a6 C5 y O
ADD A,#01H ;A加1操作: l4 U. b5 ]- c6 R3 D( v5 B4 R9 \
DA A ;十进制调整5 O% J% H/ b* X1 D
MOV R3,A ;移入R3寄存器+ s0 o9 I9 I: H
ANL A,#0FH ;高四位变0
+ G% V; b/ L& r' F* MMOV @R0,A ;放回前一地址单元
) ]; t8 d5 N v, c# DMOV A,R3 ;取回R3中暂存数据
: {1 i& T8 I! ~6 l' E# a: {INC R0 ;指向当前地址单元
! s4 h' q. r/ ^6 N: _SWAP A ;A中数据高四位与低四位交换 z1 n1 @. D" }# O, F% M* o
ANL A,#0FH ;高四位变0
% l+ x" d3 X) C% M6 FMOV @R0,A ;数据放入当削地址单元中; [- ^7 _0 a# ^* I& k9 Q f' ~
RET ;子程序返回- m: _' ]! Y& W- i) p
;: s8 d0 w1 _) k9 L% |* ~
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;. D& X5 Y3 H; J! ~8 s2 x
;; 清零程序 ;;0 V+ n: [0 g0 k4 A$ J. h- m% s: H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9 R% i: @5 C: U$ U
;.............
* C1 R4 b9 W* b& F& L- \;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 d8 e7 b U/ V
;; 时钟调整程序 ;;
( d" s4 i8 h6 @1 X0 O;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7 Z5 O3 q, n2 a$ V$ Y
;当调时按键按下时进入此程序9 }8 f+ ^, z) x
SETMM: cLR ET0 ;关定时器T0中断
; C# C) a% q4 e& ^' }CLR TR0 ;封闭定时器T03 I, l0 _: X$ i% f
LCALL DL1S ;调用1秒延时程序9 z6 m9 N! H ]0 a( K- U% R
JB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)1 C" P/ j: p8 {; K3 u" q, c( z
MOV R2,#06H ;进入调时状态,赋闪烁定时初值
4 I% ?& w5 a# m; v+ E' M$ DSETB ET1 ;答应T1中断7 i; K) z2 d7 l1 j6 k! _1 N6 D
SETB TR1 ;开启定时器T1- ^! l$ e: |4 L
SET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待6 J) w/ p1 d. K! m7 W% ~$ q% d
SETB 00H ;键开释,分调整闪烁标志置1. H; D ^6 [- Z. |# k
SET4: JB P3.7,SET3 ;等待键按下- w; {! p3 \9 c# N1 ?$ b
LCALL DL05S ;有键按下,延时0.5秒
% i; D7 G D% }, G: uJNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态
4 x, |/ q2 ~8 } l% wMOV R0,#77H ;按下时间小于0.5秒加1分钟操作1 E( ^# G6 S2 Z+ X/ M
LCALL ADD1 ;调用加1子程序2 ^0 J- t3 R) b( S$ G" P
MOV A,R3 ;取调整单元数据% r+ W) ?6 s, Z# h$ b- D; G
CLR C ;清进位标志" Z% d9 Y- O8 ~ ]
CJNE A,#60H,HHH ;调整单元数据与60比较/ z* c( @* J/ \: h$ B
HHH: JC SET4 ;调整单元数据小于60转SET4循环
* q" f4 j$ ?7 Z* \LCALL CLR0 ;调整单元数据大于或即是60时清0% x" L2 X$ G5 W# h
CLR C ;清进位标志
3 K: `$ y4 @8 ^& u5 }* P' y0 @+ J+ ?AJMP SET4 ;跳转到SET4循环& X0 t5 h; Q# h5 U# {* s8 i M6 g
CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断+ x( \9 y: g. H
SETB TR0 ;开启T0定时器(开时钟)
# _& k( P6 b! g) h, hCLOSE: JB P3.7,CLOSE ;无按键按下,等待。
0 R2 I3 R" F( S6 yLCALL DISPLAY ;有键按下,调显示子程序延时削抖4 \4 Q+ x N! t' `0 @: ^; o/ |' S
JB P3.7,CLOSE ;是干扰返回CLOSE等待1 p8 s0 K4 U2 X5 K
WAITH: JNB P3.7,WAITH ;等待键开释! `+ t3 w% ~2 U: l- f
LJMP START1 ;返回主程序(LED数据显示亮)
" Q/ q% m5 F z2 k NSETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
V9 {( F3 t% Z. J6 ~* ~# K; k7 iSETHH1: JNB P3.7,SET5 ;等待键开释
8 S ]4 _, r# K) z' m: f% DSETB 01H ;小时调整标志置1! w( n2 ^2 M! [( B, z! V8 O6 I
SET6: JB P3.7,SET7 ;等待按键按下
) t$ ]2 k7 I( t& c! g! }7 TLCALL DL05S ;有键按下延时0.5秒/ H6 }" Z. E' b
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整/ P. ]8 ?6 b: A" ^$ S+ ~" O
MOV R0,#79H ;按下时间小于0.5秒加1小时操作1 u% a8 ~7 m6 N, L
LCALL ADD1 ;调加1子程序. Q5 Q; j/ \( l5 n# J
MOV A,R3 ;
. e8 Q1 V% |0 ?: A9 VCLR C ;
, k6 {1 A* C. p/ z" g0 R4 QCJNE A,#24H,HOUU ;计时单元数据与24比较8 z G' F$ u6 g- L% o, l/ j
HOUU: JC SET6 ;小于24转SET6循环
5 g" b+ r& L r- ]0 |9 G3 qLCALL CLR0 ;大于或即是24时清0操作
* k" K- |0 o3 r5 _# }3 ~) ZAJMP SET6 ;跳转到SET6循环
0 @$ }: u, g: ^0 [/ S& kSETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释
/ G3 [( }: f" V& S- Y5 N+ }( iLCALL DISPLAY ;延时削抖
* ?) b$ J( }+ @) v. f @" H2 XJNB P3.7,SETOUT ;是抖动,返回SETOUT再等待6 z0 Q+ t, {& k/ n
CLR 01H ;清调小时标志+ K4 P. I; k4 t5 _' d
CLR 00H ;清调分标志
% v( S* q! z, g. ], }3 sCLR 02H ;清闪烁标志
# T: P8 j5 R3 RCLR TR1 ;封闭定时器T1
+ d' F3 b- q1 A" E2 C+ ECLR ET1 ;关定时器T1中断
i; [' I) j3 {8 }+ n) nSETB TR0 ;开启定时器T0, z; G. i2 W! E8 u; q$ x' o
SETB ET0 ;开定时器T0中断(计时开始)
5 C9 O% I$ [' ZLJMP START1 ;跳回主程序
5 H' f( O/ A. m0 _3 P: ^! g3 ~SET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)1 \' T+ K4 {* ]6 v4 m3 S5 n% k
AJMP SET2 ;防止键按下时无时钟显示& |+ x# y( J9 _! Z/ \ ?3 H4 }
SET3: LCALL DISPLAY ;等待调分按键时时钟显示用
) P! f6 t; X7 n% IAJMP SET4
: P1 D" M4 w8 n( uSET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)3 z2 j# B _1 D/ B E6 H) D
AJMP SETHH1 ;防止键按下时无时钟显示, Q* j9 E2 a6 c8 @ B3 K- ?* u
SET7: LCALL DISPLAY ;等待调小时按键时时钟显示用: j G8 |5 X; O0 N6 @: h }
AJMP SET6
9 J1 V1 w; a8 H3 K& ~2 _ B3 X( NSETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
p( z) S3 g4 Z" Y" {. v8 yAJMP SETOUT ;防止键按下时无时钟显示
: }1 }* l6 H1 C' ^' }5 [;) j1 p$ [5 A B8 f$ n5 o$ g
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; g3 n8 j& `. R
;; 显示程序 ;;
' d' f* v$ I4 n+ F- \;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
9 O( U) |' c) |. ?2 N. ^, e) T+ `$$$$$$$$$$$$$$$$$$$$$$$$$$$
% {( S' X5 e1 k;1MS延时程序,LED显示程序用 _, y6 {' \7 l- }4 j0 r
DL1MS: MOV R6,#14H
7 j1 Q4 x! Z, v# J- N+ _# c4 KDL1: MOV R7,#19H
Z0 D& @5 p; H( ?/ iDL2: DJNZ R7,DL2
6 h0 y+ u/ G* Q$ l/ y5 gDJNZ R6,DL1
5 }# A) \; {2 b% Z$ DRET* ], l; a; _/ y
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象+ f$ G+ ?- U! K1 q1 n! w i4 J; T4 B
DS20MS: ACALL DISPLAY* E. _' J$ d: _: b) N
ACALL DISPLAY7 u" f: r9 F' G% g( ]7 C1 B
ACALL DISPLAY
3 v2 d: {9 p( f: R6 I' GRET
3 R1 B& L+ e+ S- E; H: Z W;延时程序,用作按键时间的长短判定
+ w. p, F4 F& S! C n7 rDL1S: LCALL DL05S
8 p: P% C) `+ P+ s8 Q, b }" \LCALL DL05S1 R1 t% ~1 V0 O/ C( Z
RET9 p7 Q0 q( [6 M3 `" K0 R9 r; |% M
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒) X! r0 ]" ?& s5 K* t1 |
DL05S1: LCALL DISPLAY
/ p4 [5 [' N) K# l, a2 R8 KDJNZ R3,DL05S1
R+ W6 U5 H/ U8 U; |% CRET% B2 ?- e/ f: U: @1 A
END ;程序结束
$ r! b4 c; ~( Y2 q+ ~4 _9 m |