51单片机作的电子钟程序在很多地方已经有了介绍, 对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序, 基本上可以说51单片机就掌握了80%。常见的电子钟程序由显示部分, 计算部分, 时钟调整部分构成。 * A" b, }2 d. v: x4 M0 I! @* F
时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。10秒位到5后,即59秒 ,分钟加1,10秒位回0。依次类推,时钟最大的显示值为23小时59分59秒。这里只要确定了1秒的定时时间, 其他位均以此为基准往上累加。 5 e" b: ^5 B% h% Z- Y
开始程序定义了秒, 十秒, 分, 十分,小时, 十小时,共6位的寄存器, 分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。 " v3 u/ i2 p, z9 O8 y
6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。![]()
! Z! J' h% u+ O' h4 g% e3 U! j2 l1 R7 e! o- I! Q
: k/ ]6 j3 C4 q, t4 n& X, p
* ]" n6 s$ r, r) G( t 以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。( t/ f. A2 g4 G9 Z$ h: r6 P
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8 C, A$ Z- Q- d6 ^# L;; 中断入口程序 ;; (仅供参考)
y8 Q- a3 D8 J# D+ ~" ?. N;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;. J. k m. x9 k7 J6 n$ k
;" i( g. `$ a. y4 F
ORG 0000H ;程序执行开始地址
9 C9 [" r. p7 R# Y7 VLJMP START ;跳到标号START执行
# z P+ \% `7 k! {# N9 V/ zORG 0003H ;外中断0中断程序入口8 I* N& @; ?& H2 P7 @$ L
RETI ;外中断0中断返回# K. N' R! w ^' o4 G$ n0 m
ORG 000BH ;定时器T0中断程序入口. j" g! V1 g3 W
LJMP INTT0 ;跳至INTTO执行8 g, x' E; y7 D3 O+ x, f
ORG 0013H ;外中断1中断程序入口6 \' V- P0 p( P3 v# n
RETI ;外中断1中断返回& G% R9 v9 R5 u; I
ORG 001BH ;定时器T1中断程序入口, p9 M+ z7 ~3 T+ x% z
LJMP INTT1 ;跳至INTT1执行6 q8 Y! u& S1 x: a$ m' S1 @0 R
ORG 0023H ;串行中断程序入口地址
9 W3 a$ T, l8 E( [RETI ;串行中断程序返回
2 h. l; R" p) Q* W$ l) @) V;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 @) E4 C& _' q;; 主 程 序 ;;
1 F5 L9 [" ]2 M;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;* z# o0 @* ]0 c. {8 B' p
;* ~' I7 Q n1 ?1 V
START: MOV R0,#70H ;清70H-7AH共11个内存单元
% r/ n! j) z2 @$ M/ v4 p' t ^MOV R7,#0BH ; S! N9 Y$ |3 _! l8 I& @3 v3 ?
;clr P3.7 ;
! f/ m$ f" ^- v! a" u4 f8 X) BCLEARDISP: MOV @R0,#00H ;, l2 g! e* O8 ^, d( U/ X; w5 v: B" M$ i
INC R0 ;$ F" e$ c0 G3 w" I, b
DJNZ R7,CLEARDISP ;
2 W- R. f) r- R- [4 B, A, HMOV 20H,#00H ;清20H(标志用)
' e' j6 F8 c: N' q, R2 M) AMOV 7AH,#0AH ;放入"熄灭符"数据# A ~* U8 i9 v/ X
MOV TMOD,#11H ;设T0、T1为16位定时器
5 e% t7 {1 L7 X vMOV TL0,#0B0H ;50MS定时初值(T0计时用)
) v$ `8 H# Z/ i% ]! h5 xMOV TH0,#3CH ;50MS定时初值
9 ] e, B* _: l$ q7 ^( U; g% nMOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用)
% o: Y& c: r4 u- G8 dMOV TH1,#3CH ;50MS定时初值
$ N: M6 D. C* `- O3 h/ [SETB EA ;总中断开放
3 t; T, ]8 o% Q0 s2 O5 hSETB ET0 ;答应T0中断
$ ^. Z/ b1 y, iSETB TR0 ;开启T0定时器
% q9 m4 Z' e2 E7 MMOV R4,#14H ;1秒定时用初值(50MS×20)
, f1 r; x( y+ h, t: V9 qSTART1: LCALL DISPLAY ;调用显示子程序
. w9 j8 |5 v& v0 S3 HJNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序
- a0 D/ M e( |8 @/ [SJMP START1 ;P3.7口为1时跳回START1
: a1 x. M- X* GSETMM1: LJMP SETMM ;转到时间调整程序SETMM
3 Y" Y9 m, s; C7 a;# x& U, V" A- X" p
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 t2 A8 j8 s) Y7 V;; 1秒计时程序 ;;
# N1 o. l. A- F7 J! @& f- n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
) p. ]5 ]$ b! y& \/ l;T0中断服务程序
c' j$ y) X* l1 }INTT0: PUSH ACC ;累加器入栈保护( R/ X# V V# H i% v
PUSH PSW ;状态字入栈保护* }, R$ b( ~0 K1 M& N2 z: O
CLR ET0 ;关T0中断答应) b V! M/ V$ P6 I
CLR TR0 ;封闭定时器T0
z. f. j E, J1 F/ m% PMOV A,#0B7H ;中断响应时间同步修正
; A# L9 e& r: I6 h3 z- SADD A,TL0 ;低8位初值修正
9 s4 n1 J8 Z5 \& k9 P8 }0 ]MOV TL0,A ;重装初值(低8位修正值)
) ~8 q% @2 J2 R& C/ P z( DMOV A,#3CH ;高8位初值修正, e: e; p6 v7 |6 a7 [' r9 c
ADDC A,TH0 ;9 R: |; f$ c2 h) h
MOV TH0,A ;重装初值(高8位修正值)
; u' d$ r& r5 X2 _$ d9 ]6 d' RSETB TR0 ;开启定时器T00 n6 v4 l$ _0 R0 g$ A4 n" T- x
DJNZ R4, OUTT0 ;20次中断未到中断退出
x g1 G; [4 F3 kADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值' u* \0 `& ~8 H* w" @6 |9 x: v& W
MOV R0,#71H ;指向秒计时单元(71H-72H)
7 l- V1 J& \2 V- U/ zACALL ADD1 ;调用加1程序(加1秒操作)8 T3 v9 d* k. B6 H
MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)# ^2 b D9 T% n4 C! _4 I U1 ~. C
CLR C ;清进位标志
: n, x. F# w9 uCJNE A,#60H,ADDMM ;
& t8 b! o& g0 [. l/ q# @ADDMM: JC OUTT0 ;小于60秒时中断退出1 a+ t4 t" e' ]2 _1 N
ACALL CLR0 ;大于或即是60秒时对秒计时单元清0
/ x% L4 L* W" s+ r3 UMOV R0,#77H ;指向分计时单元(76H-77H)) U% t- K; s! j) C- G9 v
ACALL ADD1 ;分计时单元加1分钟
+ H) h* I; p2 G8 V. nMOV A,R3 ;分数据放入A. ^+ `( {9 W9 Z e. {! t- c6 V
CLR C ;清进位标志' t: n2 x- X) }& B# i+ `8 W
CJNE A,#60H,ADDHH ;8 \2 R$ F8 f: B
ADDHH: JC OUTT0 ;小于60分时中断退出
: a% `+ W. ?: D( N, mACALL CLR0 ;大于或即是60分时分计时单元清03 E1 Y( Y. M! w6 k' {
MOV R0,#79H ;指向小时计时单(78H-79H) w1 _/ p( |7 |. [& W( Y' d
ACALL ADD1 ;小时计时单元加1小时
3 [% _4 J1 j. g) Z) L2 rMOV A,R3 ;时数据放入A) z y1 S0 H4 A
CLR C ;清进位标志
5 p& O3 B3 Q! s+ c7 I: WCJNE A,#24H,HOUR ;
) n! R5 B4 y+ x9 lHOUR: JC OUTT0 ;小于24小时中断退出& r: F: s* b6 v# T
ACALL CLR0 ;大于或即是24小时小时计时单元清0
7 F3 J4 u1 \3 f2 NOUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移
0 C" T2 R$ p% ^# @3 T+ R& sMOV 73H,77H ;入对应显示单元
5 s: [' C# I0 F' g& Q) S* JMOV 74H,78H ;
5 r2 f/ T: |- G6 d% XMOV 75H,79H ;
# y! r+ {" ]3 p" M6 }: P& O/ aPOP PSW ;恢复状态字(出栈)
}8 L4 I, S6 h. rPOP ACC ;恢复累加器' T+ H K& q; D4 A; x5 W
SETB ET0 ;开放T0中断 A% \ O0 w. s9 b2 Z' m
RETI ;中断返回( U u V s; M$ w$ N! P
;
5 o3 U9 j1 e2 w/ |2 Z& };;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;* B" i5 C6 j s8 [- X0 Y6 h$ P7 }
;; 闪动调时 程 序 ;;
5 F4 d" o) A! `/ K( c2 B3 b;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 @ N1 Z! j' {, J;T1中断服务程序,用作时间调整时调整单元闪烁指示
- G! n, C1 w QINTT1: PUSH ACC ;中断现场保护2 v: u# x) Z% f! P: E
PUSH PSW ;
3 B+ N0 _; g, KMOV TL1, #0B0H ;装定时器T1定时初值
3 {5 X$ p! E/ H( m. j3 cMOV TH1, #3CH ;
* P* N4 g3 V) tDJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)% c. t) p) x" J( Q4 h4 X
MOV R2,#06H ;重装0.3秒定时用初值: z( {! X! j$ [, M3 ~- g
CPL 02H ;0.3秒定时到对闪烁标志取反6 T" D7 t. H; v9 W- T
JB 02H,FLASH1 ;02H位为1时显示单元"熄灭": L+ B O; y! d o9 Y
MOV 72H,76H ;02H位为0时正常显示9 d; g! H. ^& ?- N
MOV 73H,77H ;
: K3 i* @& Q0 xMOV 74H,78H ;
" j; g, O; _) v$ x7 }# D2 {# oMOV 75H,79H ;
& n- R; p' |! ` C% ]6 Y* eINTT1OUT: POP PSW ;恢复现场
# l9 p `% K( WPOP ACC ;1 ^6 i" W: J/ ]0 o, @- b' p& g6 b
RETI ;中断退出
" W. y3 {1 B$ qFLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制
9 @4 J. F8 T8 V. J" ]MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分' g7 b# r# b) {/ T
MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据
3 u8 U) m( q5 |' f' LMOV 74H,78H ;8 T8 W5 K6 r8 w+ }0 e
MOV 75H,79H ;5 W0 p4 H1 S7 u. `! q4 w
AJMP INTT1OUT ;转中断退出8 b* i* A. r* S- j, D0 \) \
FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时
7 g0 u: x' n" C" p7 ~MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示9 C6 o4 M# L! w# S7 E: D, |
MOV 74H,7AH ;( e3 G- v S0 t1 H
MOV 75H,7AH ;
, y6 y' c3 F$ u8 U2 `7 E& o/ SAJMP INTT1OUT ;转中断退出" g: P2 G* g" i {! w/ j2 X
;+ m7 }0 x6 `$ d' V1 V; N
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
* w/ u3 }2 h3 S, U* w- f$ L;; 加1子 程 序 ;;1 [; r2 D- B- u1 G, B0 ^# \5 U
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X1 @, m. b' Y5 g0 b l
;1 N" T" V# e/ P2 s, p; f9 j5 C0 F8 @
ADD1: MOV A,@R0 ;取当前计时单元数据到A. p# R* y# I. y# P9 C$ @: `: \
DEC R0 ;指向前一地址
& k2 v0 L% i% I/ ~2 s- cSWAP A ;A中数据高四位与低四位交换9 n/ Q/ U9 i% H2 L
ORL A,@R0 ;前一地址中数据放入A中低四位- ~5 I9 o. g r, H
ADD A,#01H ;A加1操作! @9 P/ v8 n( ]+ [9 ~7 c0 Z
DA A ;十进制调整% _ [! |! i: k" Z5 I. ^
MOV R3,A ;移入R3寄存器
* y% X' a4 h$ t! T$ XANL A,#0FH ;高四位变0/ |7 M+ d% t( ?# m6 E* q: {
MOV @R0,A ;放回前一地址单元
4 |2 S- |' ~! iMOV A,R3 ;取回R3中暂存数据
# \5 a r: X* M6 _( OINC R0 ;指向当前地址单元, X) w! r5 }/ { B* z6 l
SWAP A ;A中数据高四位与低四位交换5 y+ \/ n% a& R# Q9 l& @* y
ANL A,#0FH ;高四位变0
4 x! ^3 c* B, Z% \6 Z* f) S0 e" GMOV @R0,A ;数据放入当削地址单元中2 |" F7 Y- M3 D, `2 Y( }
RET ;子程序返回5 l+ T+ h! M0 t5 O
;
. L$ t E r n0 A4 M;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; I$ S" x+ J% [9 b3 w7 e$ V) S
;; 清零程序 ;;/ }1 j2 }& l" J
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 \2 G' W3 F/ j" @# U;.............7 n( a# @8 j5 n `$ v
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;( i5 y; z( N# _1 z3 [7 G! A& J
;; 时钟调整程序 ;;
6 I$ l* a0 f' y6 ~) {;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3 i" k# Z" D( c7 ~9 k: k* j;当调时按键按下时进入此程序' I( t$ g# d+ x8 u. J' k+ M
SETMM: cLR ET0 ;关定时器T0中断
- h) v9 y% B0 `$ P+ \/ k+ m6 PCLR TR0 ;封闭定时器T0
! |$ R% p- U- S% v9 _/ k" o$ ZLCALL DL1S ;调用1秒延时程序
2 C/ e5 l6 w9 I; X2 f& Y' WJB P3.7,CLOSEDIS ;键按下时间小于1秒,封闭显示(省电)
( D% o* |; V$ f5 D4 ?4 B# |MOV R2,#06H ;进入调时状态,赋闪烁定时初值4 i; Z! t4 P. O) }/ n
SETB ET1 ;答应T1中断
% n% I' x% X4 T+ CSETB TR1 ;开启定时器T1) e8 |+ u: U. ~- F
SET2: JNB P3.7,SET1 ;P3.7口为0(键未开释),等待: Q( H9 K7 _6 u" Y
SETB 00H ;键开释,分调整闪烁标志置1# \0 u4 y/ h" Y7 z( n
SET4: JB P3.7,SET3 ;等待键按下
# p' m4 C3 @2 _$ C5 {" o0 I# P& L: [LCALL DL05S ;有键按下,延时0.5秒
/ u- Y" G* R, ~9 s3 [JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态7 w+ A1 `) `8 V" E+ f' a
MOV R0,#77H ;按下时间小于0.5秒加1分钟操作
4 v3 ]! Y. h% P GLCALL ADD1 ;调用加1子程序
* E* f7 q3 ?5 x6 W# t2 A) PMOV A,R3 ;取调整单元数据 r7 {0 V9 Q* _2 v* ~* O/ S" A
CLR C ;清进位标志
2 Y0 M1 }8 v7 E6 B9 mCJNE A,#60H,HHH ;调整单元数据与60比较
$ L5 v: ^2 a g: f2 m; n/ X+ pHHH: JC SET4 ;调整单元数据小于60转SET4循环) p' I: Z% f- ^. W9 g
LCALL CLR0 ;调整单元数据大于或即是60时清02 j4 r$ f3 Y# T
CLR C ;清进位标志! g9 t1 r, s- K8 g* J' j9 k
AJMP SET4 ;跳转到SET4循环
& \7 w0 w/ J6 |+ ]1 ECLOSEDIS: SETB ET0 ;省电(LED不显示)状态。开T0中断! q ~6 Q1 V5 {' n' P
SETB TR0 ;开启T0定时器(开时钟)
% s8 K9 f! V. T k( X) w- xCLOSE: JB P3.7,CLOSE ;无按键按下,等待。
4 s! |! A @) r& ^5 qLCALL DISPLAY ;有键按下,调显示子程序延时削抖, n# D k( q# r8 s1 k9 x
JB P3.7,CLOSE ;是干扰返回CLOSE等待
( {9 F p& S: C* Q# IWAITH: JNB P3.7,WAITH ;等待键开释3 m0 Q- W' e$ F, K
LJMP START1 ;返回主程序(LED数据显示亮)
0 l1 b v+ Q. r1 L; E4 [- l) a4 g5 PSETHH: CLR 00H ;分闪烁标志清除(进入调小时状态)
d$ m A0 E) g: ~" JSETHH1: JNB P3.7,SET5 ;等待键开释
. V6 S j; w9 ]. B1 hSETB 01H ;小时调整标志置1
: s9 n7 l, o' }4 |8 F5 T, [: R% }6 G% qSET6: JB P3.7,SET7 ;等待按键按下. ]$ Q, C& l, H* E$ m
LCALL DL05S ;有键按下延时0.5秒8 _# ~" M# d8 N, a) P' t9 m0 _. R
JNB P3.7,SETOUT ;按下时间大于0.5秒退出时间调整* Q; D- G* t3 m
MOV R0,#79H ;按下时间小于0.5秒加1小时操作' f; v" n) V! F
LCALL ADD1 ;调加1子程序
Y: ? X# H1 z+ U" AMOV A,R3 ;% H6 l1 j; L) c# i* W: Q) l8 x$ J9 [
CLR C ;: `* `' g( _9 O6 d
CJNE A,#24H,HOUU ;计时单元数据与24比较- c' }" U* z7 \. {% ~& |! w
HOUU: JC SET6 ;小于24转SET6循环7 P7 d1 a, g# p. t/ [) Q! @" J
LCALL CLR0 ;大于或即是24时清0操作
& w' S0 K; o8 r1 CAJMP SET6 ;跳转到SET6循环
1 }5 H7 j/ m* SSETOUT: JNB P3.7,SETOUT1 ;调时退出程序。等待键开释
4 j: U, P$ t9 i3 fLCALL DISPLAY ;延时削抖
" } D, m+ d% Q/ x9 W1 nJNB P3.7,SETOUT ;是抖动,返回SETOUT再等待 h$ ~% T6 P( R3 {# _# d& ^
CLR 01H ;清调小时标志
, q; u$ w1 W4 `% k/ P/ [; K3 T2 RCLR 00H ;清调分标志
! O6 z+ O0 m, x0 S' R! x( ]CLR 02H ;清闪烁标志
' r5 t3 C# ~( m/ ^; LCLR TR1 ;封闭定时器T1
" N$ M1 |% T' ]CLR ET1 ;关定时器T1中断
" z. b5 k8 B* i9 gSETB TR0 ;开启定时器T0 r8 \4 K: Q3 b* F- f
SETB ET0 ;开定时器T0中断(计时开始)! m7 Y, W2 M8 k; a) {' l# m
LJMP START1 ;跳回主程序
% c4 {; X5 b5 Z% ?2 iSET1: LCALL DISPLAY ;键开释等待时调用显示程序(调分)
4 ?+ g; P8 R& c! A/ t! N$ IAJMP SET2 ;防止键按下时无时钟显示
6 [6 m$ l8 y( ySET3: LCALL DISPLAY ;等待调分按键时时钟显示用
! f `9 f7 [5 n9 CAJMP SET49 F% ?% `( m i' ~) y" I- ]: r
SET5: LCALL DISPLAY ;键开释等待时调用显示程序(调小时)
8 g# U" R- f, X9 S! v7 bAJMP SETHH1 ;防止键按下时无时钟显示
) b9 H9 a+ x$ u. P$ FSET7: LCALL DISPLAY ;等待调小时按键时时钟显示用) L- _; J1 }. E1 d2 O
AJMP SET67 `) j$ U4 |- m# Z7 J
SETOUT1: LCALL DISPLAY ;退出时钟调整时键开释等待
) K- b/ j7 U6 ]' p$ V6 w6 t% ^AJMP SETOUT ;防止键按下时无时钟显示; z) J- Q: Q. v
;
& H4 n8 V) Y5 j;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1 n6 h( n, h+ w! S. };; 显示程序 ;;
6 `- ~# T5 J: h8 i& x" o+ p& k;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;% S. C7 b! E0 G5 m
$$$$$$$$$$$$$$$$$$$$$$$$$$$( n* h( `3 c x4 d+ l
;1MS延时程序,LED显示程序用1 G) } [% ?1 _, [3 g7 v! J0 |
DL1MS: MOV R6,#14H6 r I# a( A0 _2 `# V
DL1: MOV R7,#19H6 b! O8 U. i1 c% ]8 n
DL2: DJNZ R7,DL2/ h Z/ t! k7 F! P* d2 \% ?
DJNZ R6,DL1
5 u2 u# j; v; C {0 J! ?, qRET* C A6 a# T! r# G. C
;20MS延时程序,采用调用显示子程序以改善LED的显示闪烁现象
& m8 R a" c8 I3 @. }* QDS20MS: ACALL DISPLAY
2 b4 N4 u, [2 e* ^) I4 f& EACALL DISPLAY) q6 p7 ~1 d* Z4 P) B" `0 j
ACALL DISPLAY! ~* C! `* E" `
RET6 m7 j" B2 }/ k8 Q
;延时程序,用作按键时间的长短判定2 z$ W$ g" |- U
DL1S: LCALL DL05S
4 Q, n( |7 K4 ?+ J1 h1 `LCALL DL05S
: |- H) T+ j0 X. E! x! ^& G) G+ uRET, H, w- c' l6 M# ]/ G, @7 F, Z* r2 s- H
DL05S: MOV R3,#20H ;8毫秒*32=0.196秒
9 j0 o# n* W; T7 k3 f& BDL05S1: LCALL DISPLAY) j: k, P$ s+ C: u
DJNZ R3,DL05S1; \" O) |5 g' e
RET
3 P+ z3 _3 ]: c/ D' |2 c7 WEND ;程序结束* D) \: G0 _ q, I. V) x
|