|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
单片机数码管单片机时钟实验 C语言和汇编语言2个程序8 G8 Y' B2 L( t1 U& G8 C
; Z- a1 P6 C. E8 ^$ W) M6 W# z3 i6 P1 W& K7 J# ]) ^% C
单片机数码管单片机时钟实验 C语言和汇编语言2个程序 还带Proteus仿真/ I8 ?2 c: S |) Q4 f' |6 }
单片机汇编语言程序:6 z" ]& e/ ~/ s7 d
/ V( L& H2 y8 ^
, C" G5 X, Q) A0 [& z;-----------------------------------------------------------------
5 U- `4 e7 k0 h: \4 Q" C ;文件名称:SZ10-3.ASM h& T' m9 S8 }* v( {2 W& E
;程序功能:带倒计时的闹钟
- S0 r& R# F% ^& d3 F$ u& d ;----------------------------------------------------------------
9 @0 ~6 A* V1 d* Y;******************* 闹钟(含插入倒计时)程序部分 *******************6 x% ^1 V$ ]' J) C9 R
% a# t" A6 T- m6 a/ f" v4 |# D4 @
% X1 {" F) H, s ;----- -------- 程序初始化 -------------
. K% Z# w; @/ y) |+ | ; 定义存放计时单元地址
" `' i- _4 t: N b/ k5 A. e ALB EQU 20H.0 ;闹铃设置标志
5 h7 I& c3 f; j- n5 s- \2 K BUF EQU 30H ;30~33H 连续4个字节存放显示器数据
& G0 N) U6 N/ J( r: W HOUR EQU 34H ;存放小时变量
e+ a: `$ P5 c( d MIN EQU 35H ;存放分钟变量7 Z; G& z3 t2 ~1 \+ U, u# z2 I& ?. k
SEC EQU 36H ;存放秒钟变量) s& \8 C( x' V7 D, E
DEDA EQU 37H ;存放5ms计数值1 h6 I/ Y8 `+ \- F
HH EQU 38H ;闹铃设置小时变量/ j3 A/ A5 U# k& v0 H1 ^4 V. w
MM EQU 39H ;闹铃设置分钟变量6 Y2 v; X2 w5 x/ g0 B6 b
;………………………………
+ M% r* H# ], |( n& R SEC0 EQU 3AH ;存放旧的秒数
8 g8 U( d% p- ~: k1 k$ d) A MM_D EQU 3BH ;倒数时间分钟数
$ i' i- x* P- X SS_D EQU 3CH ;倒数时间秒钟数5 L: Q: k# p0 _' a
;………………………………6 i4 o, B; k' ]: g- z" X/ ^% M( p
;按键输入引脚定义
: @9 ^+ c/ v, a3 W C% F' n K1 EQU P2.4 ;按键K1引脚定义
1 o, m- {( o4 G K2 EQU P2.5 ;按键K2引脚定义8 p8 }& P& P4 V+ ?% J
K3 EQU P2.6 ;按键K3引脚定义$ e/ L' U5 l6 |; S; u* B' j4 M
K4 EQU P2.7 ;按键K4引脚定义& W5 f. Q- w' |' U. f8 c
1 ]& i0 g9 ]- I0 B2 b/ g5 o. p ;蜂鸣器和指示灯引脚定义
8 o T+ A* s, U+ r7 m SPK EQU P3.7 ;蜂鸣器控制信号引脚定义
% i" m: |& d1 T+ e; w; [' W. y WLED EQU P3.0 ;工作指示灯引脚定义+ K7 L8 z; e6 Y9 b3 @9 Z. {& y
) S0 v+ X! S$ l+ G: j
;程序开始执行地址 + o U% `' h2 t( s) Y0 ^
ORG 0H ;程序代码由地址0开始4 n; n& m2 k) J# z
JMP MAIN
* o6 }6 D0 h0 J( F# X ORG 0BH ;定时器T0中断地址设置9 t6 o2 _$ ^ O3 y4 i
JMP TO_SRV" J# { T3 @/ p* m. U
$ X( Q6 Q9 F: x v3 }- v3 r, C e( n& }) Y0 r; `
;-------------- 主 程 序 ------------
% L1 m7 b: n' y , [1 B+ c+ p9 D4 G& H. ^
MAIN: ;主程序
8 ?* h0 V* D# {) u$ X7 M$ B$ r7 b CLR ALB ;清除闹铃标志 ) a3 U2 ?+ I8 @+ R+ i' g
ACALL BZ ;蜂鸣器连续两次鸣响5 P8 S" Y# i# q, i& ]
ACALL BZ $ s7 G9 ?& S s7 l6 O
ACALL LED_BL ;LED 闪动,表示程序开始执行
, E* i8 a! ~+ X- r2 F ACALL INIT ;初始变化量5 A' |- n) i7 ^# o6 N
ACALL INIT_TIMER ;设置定时器
' O6 b* B8 G$ g& N
$ [& u% p5 V( _( `+ a5 R) ]( \ ;加载显示器初值数据 y i; J E. ~
MOV A, #0C0H
: [% w+ r$ g ~ MOV P0, A . B W! J% R9 s% t" \/ A$ Y9 w
4 ]; g( j2 n( b6 E
;无穷循环
3 Z/ N: k. W! k% X7 z, E' v+ ~ LOOP:
0 P2 J9 H7 j7 r/ o c6 u3 o) L, X ACALL CONV
4 W0 @ \1 j8 \: I$ Q- n) w ACALL TIME_PRO ;检查闹铃时间 , F( h. U8 I1 c( R& \6 G
ACALL DISP ;扫描显示 $ X, e/ f4 x5 V( i
$ V# i* E( y6 _* C4 X
: _3 P, l5 B/ A% S ;设置走时时间* B# B) j) F$ m# j
JB K1, M1 ;未按下K1键,则继续扫描
5 o. R, f! L* B( V0 x( k8 p' E6 F ACALL LED_BL ;LED闪动/ y: q, J( Y7 L/ [2 J+ P6 D$ d
ACALL SET_TIME ;设置目前时间9 Z* b8 C$ ^; W& b1 O$ k
JMP LOOP ;跳转到LOOP处运行
$ i8 l0 n3 {9 B0 o, R ] u( Z% e( F" E
;设置闹铃时间
; r( U/ c( e. u8 c1 T M1: JB K2, M2 ;未按下K2键,则继续扫描
$ n4 R0 A+ h% W/ d ACALL LED_BL * o& N0 |& E( b$ z# A
ACALL SET_ATIME ;设置闹铃时间# W8 U# p' P* `; h6 k
JMP LOOP ;跳转到LOOP处运行3 [: f& e$ T. K0 G: s
- U5 H0 u% @8 P$ F0 l2 `
;设置倒计时间, g" Y I. w. y3 ~9 ^+ F4 w
M2: JB K3, M3 ;未按下K3键,则继续扫描
/ ~; s k, T }6 Q# W/ O: Y& `0 ^ ;…………………………
, F, K f0 S2 t% E! \, ? ACALL LED_BL / m& C- z, W3 C2 r; f9 L# C! _
ACALL DOWN_ATIME ;设置倒计时间# f* J: N& _$ T: M* R- W3 Q2 ?2 J
;…………………………
6 k% @- q% I$ x# q5 U3 h. V+ H JMP LOOP ;跳转到LOOP处运行
4 c! N' n/ ?% }! Z# G% X* [
* `3 Y; m) N$ P. m5 s; {9 v M3: JB K4, M4 ;未按下K4键,则继续扫描2 T7 c5 T3 M# J* Y
CPL ALB 7 D9 }/ @& W2 J* g V$ z
JNB ALB, M314 h/ ]$ Y2 g `7 V# H/ q0 d, q. @6 ^! j
8 ]! A" \* O' S+ O1 p" k, D ;闹铃启动连续3次发出响声" G" u! W9 T2 u" B3 w
ACALL BZ
. y5 Y ?4 q" t* r$ g7 ?4 D ACALL BZ
$ D' B5 ]4 {/ \2 u ACALL BZ
! N4 a: o5 ?, p JMP LOOP ;跳转到LOOP处运行
! C9 }+ I, w3 o* v! ]0 m
) D" V0 r6 z: y7 n6 c( b" R d7 y, g0 O" r9 |8 c f. [! @7 G* w5 l
M31:
( ~- c, R+ w4 Q/ w/ e& `/ R ACALL BZ ;闹铃停止,发出一声响
/ e" k* F, P, a. e9 \2 ^ JMP LOOP ;跳转到LOOP处运行
# j. k' A; \4 B" |2 b
+ T7 j, S# @- q! D0 P) o! X! v; g
; O& a7 u4 a4 \ M4:4 o3 ?5 [/ F8 f' T! K; ~0 @
JMP LOOP ;跳转到LOOP处运行0 u- Q2 ]/ j/ m5 V( I* B- O
( V' y5 \8 D# \- x/ h3 b ;----------- 实现走时功能的子程序 ----------: ]* X8 a, V/ I1 _2 z9 J
8 g3 B, `; c6 i$ n1 b
9 }+ ^. q' Z/ q i7 _/ ~$ u ;使用定时器T0模式0计时
; l7 ? T8 x$ w INIT_TIMER: ;初始化定时器,使用定时器T0模式0计时$ C4 }* o5 h0 i2 S! {
MOV TMOD,#00000000B ;设置定时器T0工作模式00 m/ u) E- S3 t5 W" d
MOV IE, #10000010B ;启用定时器T0中断产生
( G4 T3 B( J8 q# T2 k8 x) {; { MOV TL0, #(8192-4900)MOD 32 ;加载初始化数据$ W: C k' i& `6 n; R; V
MOV TH0, #(8192-4900)/32 $ L# r) ]1 t* m; i- @; j3 ~+ ]6 V
SETB TR0 ;启动定时器0开始计时
' v* ~9 ~: P3 t" z ^8 z RET
3 p+ _8 R# @% N ;-----------―――
! _2 C) R" H6 x5 T3 ~5 B6 `' [. @5 l/ y ;中断服务程序$ l) l% n. B! n. R' H1 x$ M
TO_SRV: ;定时器T0计时中断程序每隔5ms中断一次" N: d* `) ?+ Y, }3 o& `
PUSH ACC ;将A值压入堆栈
4 y9 M8 ~3 S5 A0 J5 X! p MOV TL0, #(8192-4900)MOD 32 ;重加载初始化数据
) n& e* d9 b8 ?2 d MOV TH0, #(8192-4900)/32
, q$ D# `7 }; c3 _$ {: y% i INC DEDA ;加1 6 t$ Q$ E+ f! a! n1 v$ k, Q- X, O
;秒输出
. Z+ M, w/ m# B MOV A, DEDA; |, t' H- b! a/ R
CJNE A,#200,TT1 ;是否1s到了; z8 b% G( K4 P9 Q6 W; W1 l
MOV DEDA, #0 ;计数值清07 x2 N; S) N: y2 r# t
CPL WLED ;LED灯亮灭变换" ^0 X) _$ u; \& Z# Q/ n
INC SEC ;秒计数加1
# b6 v6 }( i c: |: z& g MOV A, SEC2 M5 E7 t- M3 {0 n$ y( o8 w" T
CJNE A, #60, TT1 ;是否1min到了5 d0 [. }% V) H% N' i% E2 K
;分输出- T8 ^, T2 c) g: j+ [# F$ G& n
INC MIN ;分计数加1
. {# b0 ^/ O1 K0 N' b, x3 i MOV SEC, #0 ;秒计数清0
6 `- a k9 ]( q9 i& h; ]+ ~7 m MOV A, MIN
4 J4 X& L( C' [, E+ O CJNE A, #60, TT1 ;是否1h到了/ t( A. [ Y0 p8 J- g1 b
;小时输出& N% y* z6 H) P8 C- a3 L
INC HOUR ;小时计数加1
5 s3 s3 Q& A' F8 e. X/ L MOV MIN, #0 ;分计数清0
) D8 m" u0 g9 g4 F MOV A, HOUR
1 [, x5 ~$ G" Q& A# ^8 ^ CJNE A, #24, TT1 ;是否24h到了
8 D0 {, Q# X, a7 R( T' }2 p MOV SEC, #0 ;秒钟变量清0
2 {+ l: P. S! H2 J MOV MIN, #0 ;分钟变量清08 c; f6 H6 `2 a, I5 G2 l8 e) }
MOV HOUR, #0 ;小时变量清0
" o$ i" H( b/ R5 G TT1:
- F6 H/ g/ w+ ` POP ACC ;将A值由堆栈取出
. Z' u1 Q3 c) l- q! R RETI$ F7 `8 }8 ~, G1 Q
( G; T. M! N7 |; V# Q5 D8 b" O5 A
& Z( \6 _; U& G) z ;------------- 实现显示功能的子程序 ---------
% f' R0 o1 f" b2 h8 Y! c. z& A9 L' A$ ^& `+ y" u
) A; T5 x) N, B- P6 J
" R/ R @3 n% H& B CONV: q' j- r+ f) A! [9 w& K
;转换小时数据! q) @: g. c; a6 }+ x
MOV A, HOUR/ [+ [2 k/ x# S7 A* Y, I# X, `! ~
MOV B, #10) I6 u- ]2 e( R$ c: g1 Y; ^( ^$ x
DIV AB" R4 W8 n0 _" {8 p: J
MOV DPTR,#TABLE ;查表转换
" I' i e4 v8 ~( z* Z MOVC A, @A+DPTR: r* e5 [5 c2 z1 h6 z0 ~) t
MOV BUF, A
* W* [. u2 a1 i) d0 K! R1 _$ \ MOV A, B
7 R* d+ F- X- f MOVC A, @A+DPTR3 }, d# u& B- b8 E+ L9 b+ [" Z8 Z
MOV BUF+1, A
+ n( e( ~/ S) k0 D$ M0 _2 [ ;转换分钟数据
9 d7 m0 ]$ q1 I' }& |4 i MOV A, MIN
) Q/ t# _0 Y' A% X MOV B, #10# i4 K j$ p4 ^
DIV AB: C0 ]% w# [3 O' t+ T2 v
MOV DPTR,#TABLE ;查表转换4 s; |" W8 J0 t( F
MOVC A, @A+DPTR* H7 U0 u& n# q8 J
MOV BUF+2, A
" L% g* P" _6 {. } MOV A, B: \( x2 v- _$ \, T2 j
MOVC A, @A+DPTR
& X. O4 ^/ l9 p MOV BUF+3, A, X+ n2 U! S8 U9 J/ s& D4 p
RET
$ r/ G2 U+ K* e4 X: \ / i6 H. [; Q9 l+ q
;字型数据编码表3 b& @1 y$ t2 p7 t
TABLE:
3 \# U$ R+ a3 h DB 0C0H,0F9H,0A4H,0B0H' |" X. ~# ?3 L' M
DB 99H,92H,82H,0F8H
! C" b* ~. j* L4 J; J DB 80H,90H,88H,83H
& Z* L# G8 F6 _% R DB 0C6H,0A1H,86H,8EH
. X9 F& p) I4 a! ^3 Y; a$ I/ r
8 L; Q( r, Q! _+ t ;-------------- 扫描显示子程序 -----------% Z |& m) b. k/ k, x
;扫描显示- Z9 ]1 D0 g) G; ^ b5 B
DISP:% C4 g7 Q; n& Z I8 ]
MOV R0, #BUF ;指向显示器显示缓冲区起始地址8 }. ~5 n; ?1 O+ P0 @9 F* |* h8 Z
MOV R2, #4 ;循环执行4次( j" m" F# B7 D& L- \
MOV ACC, #11110111b ;加载扫描信号初值11110111B
" u( F" z2 J" ^/ G/ [6 a S1:5 a$ ?" G0 R& I
PUSH ACC- ?" x9 i& X; I3 ]
MOV A, @R0 ;取出显示器数据
; t9 C1 x b9 A. S: X MOV P0, A ;由P0送出一位显示器数据
6 ~- ~$ Z' N2 C; f; E% ]3 S POP ACC2 I0 g! ?0 F; q0 }$ R
MOV P2, ACC ;由P2送出扫描输出信号 * J3 [% Q7 h0 ^
MOV R5, #2 ;延迟一段时间
- |: ?2 J" g3 O- t7 R& E ACALL DELAY) U3 l( |1 P" ~9 F5 }& b
;改变扫描码 EX:XXXX1011 ?& ~2 S: q7 ?2 d9 p/ C6 y* {
RR A ;累加器A向右移动一位
+ y: q) G! ?6 }0 C' d# G r INC R0 ;显示器显示缓冲区地址加1
* _/ V: `7 s6 k. m5 s2 n1 h/ Z DJNZ R2, S1 ;判断是否继续执行循环
0 G$ J9 k" i! f- T RET; x: s2 q% J0 j/ }4 I+ c
3 a @8 T( F0 w: l; L- f3 r; R
;------------- 实现调整时间子程序 -----------
9 d* S. u$ f E8 P: L" Z* |
7 W, v$ M9 S0 ^, B% a9 p/ _! g! v$ @
;设置目前时间7 r% u6 j* {8 G8 t+ @! P
SET_TIME:
2 k. ~; w/ i$ P0 j CLR TR0 ;定时器工作暂停
1 ^$ s% j5 l0 Z# C- h9 T" l6 @( G MOV SEC, #0 ;秒钟变量清0
5 A9 c! P. F, x) |9 d. m L0:6 v }/ W( \+ b" [1 j( K4 S" \
ACALL DISP ;扫描显示% k1 q8 k! y2 C) G+ q
v+ x/ L& ]. R9 j0 M
JB K2, L1 ;未按下K2键,则继续扫描7 j2 t B0 W/ P/ T: m" \
JNB K2, [ DISCUZ_CODE_2 ]nbsp; ;按下,则等待放开
4 H$ u& {9 W* k2 o e' j U ;K2小时调整
) K& A9 e! J7 A4 f$ j6 y: D0 p( A INC HOUR ;小时计数加1' ?& e1 t% w+ m q, z( ]2 I8 O$ T9 d
MOV A, HOUR
$ O0 v5 b+ C5 m9 C- U CJNE A,#24, L11 ;是否24h到了
. j o1 \' M W MOV HOUR, #0 ;小时变量清0
8 d% {/ P/ h% R" c) B L11:
3 u( i# ?9 d2 D% t6 T/ ~3 B( j ACALL CONV ;转换显示数据
6 K: D5 k6 W/ x5 l3 Q; s ACALL DISP ;扫描显示
' T9 _) V- q. r/ A: D3 N JMP L0 ;跳转到L0处执行
& b4 g. Y" {0 {8 a) A+ U 6 p/ q2 ]+ U Y4 h
L1: JB K3, L2 ;未按下K3键,则继续扫描
5 J f+ |* L$ X- ` JNB K3,[ DISCUZ_CODE_2 ]nbsp; ;按下,则等待放开* M. }$ _8 e# a6 F! O- x! k( ]2 A
;K3分钟调整1 p/ T& R7 k" O4 j7 o
INC MIN ;分钟计数加1
2 ]0 X4 A1 }. a MOV A, MIN $ e0 }% h O( h2 t5 k3 ?
CJNE A,#60, L21 ;是否60min到了7 W. J) C7 ?2 U9 @9 `
MOV MIN, #0 ;分钟变量清0( h/ s2 h' [* r- k$ W% D6 f
L21:
/ p0 O" ~, H2 q ACALL CONV ;转换显示数据
; n% z6 V# ^+ Z! W0 L" X ACALL DISP ;扫描显示1 `1 S) p8 Q2 ?$ X; d
JMP L0 ;跳转到L0处运行
# i' h1 R7 p- M! K: S! m9 L1 L: S' W % Y' p- @/ S2 Y7 n/ Y4 k4 P6 i
L2: JB K4,L0 ;未按下K4键,则继续扫描 G& m6 i" q2 j% h% b
JNB K4, [ DISCUZ_CODE_2 ]nbsp; ;按下,则等待放开2 d4 @3 I ]/ |; d6 K
ACALL BZ ;蜂鸣器鸣响一声+ n7 V3 C; [0 a" Q+ H- M4 n
;K4设置完成3 C& V6 ~' b: D/ W: H' Y
ACALL LED_BL ;LED闪动/ p1 s2 [. l4 @6 K- v) _. [4 F
SETB TR0 ;启动定时器
& z8 s( H7 X; J; ?9 h; @) ` RET
3 y; y9 J! \( M/ g3 ^
# a2 l# d5 z9 u6 T9 B, {
" A" ?( D' o, H" ^9 G b ;------------- 计时单元清0子程序 ----------- G+ s# d2 f; S o. {, K
; v! k2 R* n+ b4 ~
; |) t5 T' t1 k9 Q3 C( |
;计时单元清01 O2 E" h2 y/ C$ m0 c- e, e# [
INIT: 5 L5 ]# f, K2 n' [- N$ @0 M6 T
MOV DEDA, #0 ;5ms计数值清0
3 R) N* X v8 r9 f) C8 m$ U MOV SEC, #0 ;秒钟变量清0, f2 O( S/ P# @/ a7 d
MOV MIN, #0 ;分钟变量清09 Z3 ~- j; ]9 d8 }2 B4 K) l* O
MOV HOUR, #0 ;小时变量清08 Y' w; g$ c$ \- W; k& o
RET
/ l. w- Q( V6 U5 Q0 ` t; ~; a7 J5 _: H' Z
6 ~5 d" } P) H. Q" u% P2 m
; ------------―蜂鸣器鸣响一声子程序 ----------
0 E$ b7 ^+ M! L m) P6 h6 B ;蜂鸣器
, u; r1 u, h9 ^, ~, A* _) i BZ: ;蜂鸣器鸣响一声
: c' u6 Y8 j4 A2 A8 e, ]/ F- J6 J MOV R6, #250
1 [: I4 n x" n* j( d B1: ACALL DEX
% f$ w9 s" \4 }" l; c4 q# G CPL SPK1 g" z S+ C& M- E8 ~7 h
DJNZ R6, B1+ z, s: g8 V: M1 b% c% D; y, @2 o5 h; Y
MOV R5, #50
0 _& { g3 d% [" y ACALL DELAY7 F& s. I# M% T* `# C8 r8 s
RET' m1 y4 F+ {# R8 [9 S3 |) E4 `8 [* i
B: |- j0 z- X
;-------------工作指示灯闪烁子程序 ----------: h% J* B8 w6 `! V
;工作指示
/ |8 c/ x) b; @1 V. O LED_BL: ;工作指示灯闪烁
& n& \/ N! Y8 h# u! Y# j+ W MOV R4, #6# y6 s% e8 T( W8 `
LE1: CPL WLED ;位反向
* e; d5 w5 ?+ N- U MOV R5,#25
: W, K. G8 I2 C! n. l! t& c7 m ACALL DELAY ;延迟50ms
2 W! _- ~( o4 l# ~/ r- X a DJNZ R4, LE1
5 o) I* B+ C! l: x8 u, N5 Y2 N. M4 T RET
# ~# e; O" J1 t( Y# h+ q
8 J9 p$ a! F* t0 d1 @. t5 v9 x& v8 M0 j! L0 ]# V0 m+ T+ i A
;-------------- 延时子程序 -------------+ w+ V4 g ?! z+ S. X4 r2 P
" h( ^0 ~- v7 {* c
1 z; R6 f% l2 t& `1 X' }: R6 q( W ;延时子程序) l# z! I/ T5 T$ [5 w, h$ Q) \
DELAY: ;总延迟时间R5 2ms/ L& z0 |% y& O) L) j/ L
MOV R6,#10
- v" C) e( s1 f D1: MOV R7,#100( P; E5 d* o( L2 i1 y
DJNZ R7,$
/ F1 D B2 q& b DJNZ R6, D1
4 g; g* S) q: {% L5 F+ \- q7 _ DJNZ R5, DELAY) z7 z" q" F! {1 L) w; Z5 [
RET
; t) F4 ]) v4 f3 v2 ~) O% ~ ;------------ 蜂鸣器短暂延时子程序-----------+ f/ l. \( J( @- G
; 蜂鸣器
. s E- _; ?4 ^* q DEX: MOV R7, #180 ;短暂延时
8 ?2 c# S# q6 d DE1: NOP
8 y/ F2 T2 y0 F& u/ [' W DJNZ R7, DE1
' z/ Q l/ f! V" u) L- X+ k RET4 a1 |4 t+ [- \( W* D
/ _7 l( K( D( b& W. j1 c0 ~5 l0 c9 ]- d
;******************** 增加定时闹铃程序部分 *********************+ P" U' A5 k# v6 O, l
( R8 H4 s; w. @
3 e8 E3 E& l6 K7 }& {+ y ; ----------- 设置闹铃时间子程序 ------------, {; N* u$ G$ j
;设置闹铃时间
+ ~8 |' G% x5 ^/ I SET_ATIME:
+ I) }5 ~3 x4 u7 }2 _* {# l MOV HH, #06 C: I5 p r0 }9 U0 K4 V
MOV MM, #08 j y" D& J& _- g7 D5 g
ACALL CONVA ;加载闹铃时间数据
& c) O7 i# i/ r2 e N0:7 b4 K2 {3 `6 z2 u' z" ^
ACALL DISP4 o5 o2 P9 l% S. T, u( X, D. n
;----------- X; q' ^5 J4 h5 L
JB K2, N1 ;未按下K2键,则继续扫描
! Y. }0 R; J7 w% ]8 H1 Y1 v1 } JNB K2, [ DISCUZ_CODE_2 ]nbsp; ;按下,则等待放开
4 ]9 B. q, h4 R* @ ;K2调整小时
. D. k% _0 [( r6 d' ?# f6 j4 [ INC HH ;小时数加1# m' o" l, X/ i
MOV A, HH! f9 p ?% c& a I* x# z7 C8 g9 C( ]
CJNE A, #24, N11 ;是否24h到了
; y% S O1 b! L" `% E# _ MOV HH, #0 ;小时数清0) h# H s! j2 @3 {2 I5 s
N11:; d0 V/ f% j: A& C) S7 z ]2 B. y" s
ACALL CONVA ;加载闹铃时间数据
# x7 b8 s$ t0 u3 B0 e# w ACALL DISP ;扫描显示" T) e G4 c% ] G
JMP N0 ;跳转到N0处运行
9 W( q9 j) f9 C6 J8 B8 t ;------------
0 Q/ Z7 W( w7 m N1: JB K3, N2 ;未按下K3键,则继续扫描0 `0 W$ h" h! e$ x0 _- m% T+ z
JNB K3, [ DISCUZ_CODE_2 ]nbsp; ;按下,则等待放开
* N* a/ }7 j; k ;K3调整分钟/ P6 v( h- q1 ^. T4 H6 K) X! L! k; S9 e
INC MM ;调整分钟数$ k' \3 m$ U( p8 V r
MOV A, MM ;分钟数加1
7 C7 x L) G7 m+ @' G6 R$ ?$ H n CJNE A, #60, N21 ;是否60min到了3 P) d: i; l) ]- }+ o
MOV MM, #0 ;分钟数清0+ Y M- ?+ G: v6 N- z9 R8 i' M. L
N21:2 q8 ^2 |" E: u; H$ h4 R: K
ACALL CONVA ;加载闹铃时间数据) Y( R* f% x1 P) T7 G: @
ACALL DISP ;扫描显示4 w& L# @, a! u. M: F3 M! p
JMP N0 ;跳转到N0处运行
" V n9 u1 y' l4 D) X ;------------8 u! p1 C5 V* c* V/ I$ q
N2: JB K4, N0 ;未按下K4键,则继续扫描& C, P/ s- d% w! D1 R p
JNB K4, [ DISCUZ_CODE_2 ]nbsp; ;等K4键放开
. j* N: v3 z: @3 \ ;K4设置完成
) _: E3 d, n M( G9 B4 s* B ACALL LED_BL ;LED闪动
( Z9 m+ u/ Y( x6 ? ACALL CONV ;加载现在时间数据& n1 o( r8 D# v& t S& ^) j
RET2 ~: I4 e& m( M
$ x5 ~4 _- a! @- H+ M
% C/ q+ X& k' U" U. z* i' g7 l ; ----------- 加载闹铃时间数据子程序 ----------
( D; m* {1 I W: c& R0 n- Q1 J- J# e: v7 R4 T
; d( [) g# C) C" S& q# E
; \/ h+ o, q. O4 F CONVA:
6 v+ @/ u7 C6 |0 A$ N0 S3 _ ;转换小时数据
+ @+ L- p5 b. \" F9 r+ B MOV A, HH7 P2 K& y2 p$ `+ f8 v) o
MOV B, #10
- S* y+ E- S+ \* l9 X+ B$ y DIV AB
# z3 N& }8 a& q2 @/ o ;-----------
4 C6 p9 T$ Z9 v! q3 m MOV DPTR,#TABLE ;查表转换
8 e1 @4 D5 d9 _; s* V- r T6 i MOVC A, @A+DPTR
: Z" l4 z; g, w- Y- Z# m( v MOV BUF, A3 j1 M4 C( Y. v7 `& s: ^
;-----------) u" g; W Y- g6 i% B! D
MOV A, B J9 Y, m" T! o! C. s% f1 S
MOVC A, @A+DPTR8 j; X7 l6 k& P3 F3 M
MOV BUF+1, A; O* j, H# v/ `2 ?; S+ c7 A1 p
;转换分钟数据
2 D1 m( W5 q, r/ G% A MOV A, MM
' W7 ~9 k" k1 j MOV B, #10, j. `& }& T8 d+ \# u/ O) l+ u
DIV AB
: T. n8 N$ k2 A ;-----------
8 p& m4 I0 I5 \, q$ N! l MOV DPTR, #TABLE ;查表转换2 b- @& i9 j% i/ l& e+ N/ s3 }7 v
MOVC A, @A+DPTR3 s* D4 @% p: j
MOV BUF+2, A; s/ c9 g. V" S$ B! X8 I
;-----------
K5 R# j) I1 m0 C/ s* Q MOV A, B
: I |- `5 \; T7 ] MOVC A, @A+DPTR- v* d8 Z) |+ k& L6 O8 Y
MOV BUF+3, A9 Q/ F" x5 H4 W6 s; s. c0 y
RET
. z3 U1 U4 j+ p9 n/ ~
) p- y/ n$ [ Q+ n. u ; ---------- 检查闹铃时间处理子程序 ----------% O1 X% N0 [' u& x
, b9 t( w+ _; y! d1 p
- _* p) q% T9 W; ?
;检查是否启动闹铃
@2 B9 g1 S. q$ v5 X/ d+ @$ n TIME_PRO: + e* a7 u5 ?. h( n, K6 t
JB ALB, TI36 u4 ~' y1 K) A8 c; ~; @
RET& ?) v: j0 M: A
; --------------+ N1 S, j) ^6 Q5 s, O" D% f
: T9 j/ A- J0 a% f. v+ m u
" a; T4 @7 l* K# X' s; S# ?; T8 Y ;检查闹铃时间是否到了$ R" z; G/ K9 J- c
TI3:
' d/ K! ]! F9 {: B) l8 w MOV A, HOUR
; [. V/ [ w Z+ r- r; s MOV B, HH
1 d! N Q9 \5 b I CJNE A, B, BK ;检查闹铃小时时间
% ]+ N J. J- w3 Q- m- G. [: @0 R ;-----------4 F' q# D& h% X' U: X1 ~- F
MOV A, MIN
1 F# S0 c/ ]2 c2 b- _5 F- e9 c MOV B, MM9 {" b }1 g' \ z7 c8 y
CJNE A, B, BK ;检查闹铃分钟时间
! n! Y# S3 g) V. \ ;-----------
9 c1 F+ q# Z: O" I! p% Z ACALL TIME_OUT ;调用执行检查闹铃时间处理子程序8 c; `$ g0 W. U% X
BK:
8 x3 m/ k2 i. g( V RET
2 L1 F; X- m9 y+ J: n) f
+ l5 T8 x& R# t4 d7 C; [) f6 W. U2 m1 V2 A& I
;---------- 执行闹铃时间处理子程序 -----------
' [- D0 Y' x; O2 N( O3 Q. f- Y/ ]/ F' w/ N
' P4 S$ X" |* v- I6 Z TIME_OUT: ;所设置的闹铃数据到了
/ c+ I- G( ^' `: y X1: ACALL LED_BL ;LED闪动) C3 G, p) N9 Y! i! f& T2 d
ACALL BZ ;蜂鸣器发声& B8 T, O, e# T g: B8 O
;按下K4键停止闹铃 9 E/ `/ ^2 v+ N; S+ O
JB K4, X1 ;等待是否按下K4键+ P. P- r, k1 k$ H* R" _
JNB K4,[ DISCUZ_CODE_2 ]nbsp; ;若按下键,则等待按键放开
$ h6 ^# L2 V6 q5 S( M ACALL LED_BL ;LED闪动
8 s2 u+ c6 M' v e0 x9 s CLR ALB ;清除闹铃位
5 B% X h M# B/ w" E RET
0 ^* X+ X% H S- ]& \# ]7 J4 ?; -----------------------------------' f: U8 }3 }3 T3 K1 w
- ` C5 e, a# u" e7 |
;******************** 增加倒计时程序部分 ***********************
! w( m- i# n& `% x2 ~' l3 \3 F( k9 h! F4 v/ H
: c/ A/ `' x& `- P" N# k
;----------- 设置倒计时时间子程序 ---------- j2 ~ z) |0 L. M) A
;设置倒计时时间
8 @# @1 I( g" V4 i4 K DOWN_ATIME:# @+ _2 \0 A$ o+ q7 }
CLR TR0 ;定时器工作暂停- x. C+ u, V4 ]. U. D. P. F- u/ p1 O
MOV HH, #0
; T# ]- O- Q3 m+ c$ o# ^ MOV MM, #0
& i, \+ D% C9 |, M6 gMOV SS_D, #1 ;秒钟变量为1
/ R! U8 k3 Z9 g9 g/ v/ Z! u* ^ S0:
- S% o4 Q/ }- \) h/ E" L$ _$ h3 I' X( R ACALL DISP ;扫描显示
) ?! {( V+ S, F3 R8 ~ ;-----------
3 b' c2 M. B4 I5 d* S5 j ;按K2分钟数增加 % S" }0 Q- ?' j5 V8 s
JB K2, S12 ;未按下K2,则继续扫描; B" r/ F& h r% s7 V/ X# ]
JNB K2, [ DISCUZ_CODE_2 ]nbsp; ;按下,则等待放开+ X5 } T$ ^! P0 W1 V; Y2 z3 ^
" m4 @: E) e" l% I9 F8 V INC MM_D ;分钟数加14 N5 ]9 K5 A1 U6 i& y9 }7 \
MOV A, MM_D! r- }* Y5 u3 M1 C, ?# O& b
CJNE A, #60, S11 ;是否60min到了: L c& K% C. F# U# Y" X
MOV MM_D, #0 ;分钟变量清0; x1 t0 }( F3 D6 b$ W8 Z, R
S11:( j$ g, Z7 R5 W# f" A
ACALL DOWN_CONV ;显示倒数的时间
' n0 C. c1 ]& R3 |$ F2 C ACALL DISP ;扫描显示
0 ~& D7 E/ C/ L JMP S0 ;跳转到S0处运行
, e( \, A: E3 E ;------------ ^4 @, e" Y) A- r& \" J: N, O: v
;按K3分钟数减少/ H' }2 X4 }1 F/ R
S12: JB K3, S2 ;未按下K3,则继续扫描1 e8 z9 f ]* F& i5 j. F G
JNB K3, [ DISCUZ_CODE_2 ]nbsp; ;按下,则等待放开7 R- i& }! r$ a9 R% j8 }' Z$ ~4 p% j: k1 ]
& \7 v9 t& u& u# R! W) x5 q
+ c) O N4 w3 i3 j& F) x8 q DEC MM_D ;分钟数减少14 M- h1 C/ G9 d" R
MOV A, MM_D
/ b' r/ e ^8 o. \' E8 }( T* r CJNE A, #0,S21 ;判断是否为0. a% `) k& w+ p8 \# [; R# \: [
MOV MM_D, #60 ;分钟数赋值为60 \( {# a7 S$ d1 }. o1 o
S21:1 w" M+ N. `6 ]- V2 ~1 f
ACALL DOWN_CONV ;加载倒数时间数据9 L" @& l7 _( P6 q( |
ACALL DISP ;扫描显示
% g- E% W* c X; j; H JMP S0 ;循环执行. t6 _ j9 E0 E9 R
;------------
* w, G; g( r( ?) T! y S2: JB K4, S0 ;未按下K4键,则继续扫描
2 z& f% B3 ~; x' f' c1 d JNB K4, [ DISCUZ_CODE_2 ]nbsp; ;等K4键放开' z0 n0 v, L7 u/ ?
;K4设置完成
1 u q# q3 K) U7 b# f* B ACALL BZ ;响4声
2 E9 n% _# ?& j7 o2 c7 P ACALL BZ
$ h7 {- l: y/ @, o: h0 R ACALL BZ
& A3 _$ U0 P# v& u$ O( J' E ACALL BZ3 g5 X+ v4 J) X7 B" Z" Y: f& s
6 l2 A8 f. r6 H/ V1 A% z ACALL LED_BL ;LED闪动
6 d! {: B- g9 n- J- z3 |% V3 K SETB TR0 ;启动定时器. D# K( O! Y+ t5 Y
8 k2 r9 j1 C/ G" q d W; p S3:
3 H# a; e4 S/ i ACALL DOWN_TIME ;检查倒计时
6 b3 D1 ?# g6 l; Q ACALL DOWN_CONV ;加载倒数时间数据5 E/ f9 x. d/ b0 l9 X
ACALL DISP ;扫描显示
/ n/ Z6 d4 r4 P% W- A. o# Z JMP S3 7 P& _ r8 f% U
RET; F" W& I3 ^7 ^, i5 u2 ~; R
: r& K' A' C" X" H
; ---------- 加载倒计时时间子程序 ---------
( l# I2 t+ c1 h) `2 e. l5 g/ z ;显示倒数的分钟数5 Q5 w1 T- M* h, m) L
DOWN_CONV: / K3 p/ F" y N$ |# R6 R; `+ o
MOV A, MM_D8 u( ?* \1 i ~) x0 v% l
MOV B, #10 ;设置被除数
/ R% t1 W1 m% W: r2 I) ~ DIV AB ;除法运算,结果A存商数,B存余数. W3 c7 k2 F+ P: u' ?3 d1 V/ F
MOV DPTR, #TABLE ;查表转换1 e, w* g% M# i4 e2 K
MOVC A, @A+DPTR
* o* r1 J. m5 C& B+ W5 X9 ^3 N; z* \$ K+ k MOV BUF+2, A ;商数存入BUF+29 W$ V! _6 q. U% k
MOV A, B ;余数暂存入A2 @$ {1 M/ Y/ b' q2 R
MOVC A, @A+DPTR ;查表转换
, y3 V; H$ q+ P& d9 y MOV BUF+3, A ;余数存入BUF+3
7 X$ P* _$ E V' ~5 ?- w b+ ~ RET) b1 D0 o' i- ~1 c9 k
' K6 g! o. I% y2 d3 @ ;------------- 检查倒计时子程序 ------------
2 Y" f, {, a) t ;检查倒计时
# D a) ~" f+ m" n DOWN_TIME: ;检查是否倒数终止" ~* x$ Q9 O t+ V; s8 Z4 [
MOV A,SEC ;加载现在秒数
7 S ]1 n% o: X MOV B, SEC0 ;载入旧秒数, f! D w/ H$ ^& c
CJNE A, B, D01 ;是否过了1s
" s! _3 }" s, T8 N# {$ W" }) p RET
: |. O2 t m- f# ?5 K! @% d ; -----------
$ v6 ]+ l/ N7 t/ a2 y D01:% K( K% t7 m( e' |2 U" S$ w
MOV SEC0, SEC ;记录旧的秒数
# d8 f M# A' y) r/ Q) n( S* R DEC SS_D ;秒数减15 P/ _1 q' A3 |# O. h. {
MOV A, SS_D, u1 C7 w5 ] e4 G
CJNE A, #0, D11 ;秒钟数是否为0
! [( t4 k& M# M, Z6 H% \ MOV A, MM_D 6 N) j( ]* n0 S- L4 U+ T x) ?2 F
CJNE A, #0, D12 ;分钟数是否为0- g8 \3 b* i5 w8 J
;秒钟数为0且分钟数为0,则倒数终止
& a; |3 S$ Y1 _7 |/ X ACALL TIME_OUT ;倒数终了处理程序
9 x5 E" ^0 t& T0 r9 m' m JMP LOOP
& J5 ?# a4 M' x, g Y7 y4 _ RET 8 m- W/ E2 m' x) u/ I8 }
;-----------
1 D6 c8 a& K! W+ T D12:3 T9 w* u. g+ E6 j% F y
MOV SS_D,#59 ;秒钟数赋值为59
; J9 m" f% H) I% v9 Z! D' ?# f3 i DEC MM_D ;分钟数减1
/ r% O8 T5 F! y) t( h3 K, P! K, I
, E' q( V, L% K1 f! r D11:: {3 Z. ^3 [5 L/ Z" v9 T1 k: D
ACALL DOWN_CONV ;显示倒计时时间, t+ {! x3 i4 `4 `- S6 ~
RET
& N, R; B7 E5 I3 {) l/ v: | ;---------------------------------- : X* m6 U, }% t/ V: W& V
END4 [+ V0 O! z2 H4 P$ f) u+ C6 \4 _
;------------------------------------------------------------------ A* i7 c- P6 l. u9 k
' B B9 A; [5 h( C4 q
- b/ j/ \9 v' e/ D" K' I
: o' ^1 j( `) c0 |, ?! W& {单片机c语言源程序:
4 O% z! Z2 t$ x) M9 H# d// --------------------------------------------------------------------------------------( j$ r* H2 p$ ]) x
// 文件名称:SZ10-1.c
2 c# r6 b/ M; T9 _// 程序功能:单片机时钟
/ z! j/ }1 T+ Z// --------------------------------------------------------------------------------------# a l" r* U1 V" M# B' D- @
#include <reg51.h> // 包含器件配置文件
( F& ^/ _* O+ s& Q" i #define uchar unsigned char
4 n- F' \, I2 n V) ] #define uint unsigned int
3 a( O ~6 ^. j8 e char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99," K3 K* T- Q, r4 W$ p$ M) r3 x
0x92,0x82,0xF8,0x80,0x90}; // 0~9的数码管段码
7 U: [. P5 O% G6 ^- U: G# R uchar hour=0,min=0,sec=0; // 时、分、秒单元清0
; e e( l1 u7 P) F5 a0 y- N uchar deda=0; // 5ms计数单元清0 9 H1 |2 ?* {* _0 {$ `
bit d_05s=0; // 0.5s标志
7 b. H6 I) y1 ~9 b: I7 p) i uchar set=0; // 模式设定标志 ! W8 L: A. l9 ]1 y
uchar m=0;
( j; E& o4 S7 g( |6 {: O uchar flag=0; // RAM掉电标志 $ O% i+ Y8 e- X# r5 W
void delay(uint k); // 延时函数 . m9 X" x. M& r* m5 u8 E
void conv(); // 走时单元转换 : J' \% E. i; x; V8 L3 ~
void disp(); // 走时时间显示函数
: W2 _, Q7 ?7 d- K l" J//-----------------------6 c1 e8 _3 n4 @/ D* I) S7 t
sbit K1=P2^4; // 按键K1引脚定义
% [- M4 v' } h9 x/ S. Y sbit K2=P2^5; // 按键K2引脚定义, j9 u+ J/ @" n; N7 I6 j
sbit K3=P2^6; // 按键K3引脚定义 M3 ~# ?0 w- U# X( ^; R' i
sbit K4=P2^7; // 按键K4引脚定义
: n9 A( T/ [. ^# B& ?" |9 T, k/ D//-----------------------
+ Y% S* P7 J+ {0 a- S sbit SPK=P3^7; // 蜂鸣器引脚定义
h2 Z+ F$ A3 |* n& X6 I3 i9 j sbit SET_2=P2^2;
I0 O& n% u: }1 n, R9 t8 ~ sbit M_D=P0^7;# ~! i9 {) s9 S g6 \6 ]
* l; T6 K1 W0 l' M
// ---------------------------- 定时器初始化函数----------------------------& l. _1 ]1 {+ x+ ^2 V+ ?" A/ Q
' u K2 ^# v o5 |3 q( ?
// 定时器T0初始化 . R6 k+ s& I$ U7 I
void init_timer(), m$ u' c' B" Z/ Q6 A5 n3 S$ R
{
2 U- M0 `) m. M$ T" A; m. U4 _ TMOD=0x01; // 设置定时器T0工作模式为1 : j& O& W) t8 D* j. J- J @
TH0=-(4800/256); // 加载高字节计数初值
4 K* O- f `6 _! P) G TL0=-(4800%256); // 加载低字节计数初值
8 b) P5 V, h9 y- H$ I7 @ IE=0x82; // 启用定时器T0中断产生
' ~, K* i( t4 a! p, x TR0=1; // 启动定时器T0开始计时 0 N. T6 ], q% M2 R p' r5 L* B
}
$ E& X% @* Q1 k1 t
- k3 a# X) Z# w6 N// ------------------------------- 中断T0函数 ------------------------------4 ?1 `3 U# |" |( a5 `! q
5 |0 n/ g0 S; z) \" ^' E// 5ms定时中断
9 j+ j* m' R7 d% F: ~: Y void T0_srv(void) interrupt 1
- G5 d0 S: b* {% E9 K+ ^ {
: j( L0 ~! b7 b3 S# q, R TH0=-(4800/256); // 重置定时器计时初始值 / Q8 E/ a' b& F0 N% x" }+ z1 M: A
TL0=-(4800%256);
2 O% [! x7 _+ w& a+ a deda++; // 计数单元deda 值递增
$ K7 e* S7 d' j* g$ _) ` } $ J( d) J8 O: U' D" @
: a0 S; w8 A* O+ e2 |7 X$ a% s( V- d // ----------------------------- 走时单元转换函数 -------------------------
3 c1 k) ~; v: [3 S
# W; H, }* @! }; ^, P0 `% _# } // 时、分、秒单元及走时单元转换
5 _6 H$ o. l/ F, ], z. r void conv() 3 x) [0 M5 w$ e: \5 L" Q% J
{ - Y* [+ v ]! D- N
if(deda<=100)d_05s=0; // 秒位标志,每秒的后0.5s置0 ! P# o% S* p4 g% M! h
else d_05s=1; // 秒位标志,每秒的前0.5s置1
. k# s, j, O2 \, j/ D" K+ J t if(deda>=200){sec++;deda=0;} // 中断200次秒加1,deda清0 * m( d! f# _* r) _! p
if(sec==60){min++;sec=0;} // 秒满60次后,分加1,秒清0
3 M/ D* N8 y! N4 z% A& T) ]) s1 ] if(min==60){hour++;min=0;} // 分满60次后,时加1,分清0 $ O4 {0 M" m/ z4 b
if(hour==24){hour=0;} // 小时满24后,小时清0 */
1 v" G# V( [7 i1 @ }, r' G* a3 h1 F) Z( O- V
( u# K+ y, B r6 Y5 B
// ------------------------------ 走时时间显示函数 ------------------------3 V( e \6 p6 e g
/ g$ C& V8 ~+ X3 ^/ W4 R0 d' C
// 走时时间显示
7 q* s; o9 u l9 s* d void disp()& R6 s5 ]7 k1 Q- s3 z7 ]
{4 B }/ g% I1 {" Y# O
P0=DATA_7SEG[hour/10] 2=0xf7;delay(2);4 t! h! V* K* M8 Z
P0=DATA_7SEG[hour%10] 2=0xfb;delay(2);3 r0 x- Q' A' K
if(d_05s==1){if(SET_2==0)M_D=0;else M_D=1;}
* ]3 T! |$ z, U1 L) w. |; G delay(2);
( w6 ^2 p: r5 M9 S% @% t. J4 K& V) \ P0=DATA_7SEG[min/10] 2=0xfd;delay(2);% w+ \" _ w" z- k; h* k- Q
P0=DATA_7SEG[min%10];P2=0xfe;delay(2);. @! `& n6 j' j9 l9 p& p- `
}
/ L, e. A7 _; Y0 }# Q6 c$ {+ {8 O+ A
// ----------------------------- 调整走时时间函数 -------------------------
# r7 a7 }% ?3 V# l' o6 x, V9 z2 m( g4 n+ S7 Y* A! M
/* 调整走时时间 */
$ |$ r$ v; ]) s void set_time()
9 P1 X# K9 |. v S) X5 q3 e. y' Z- x {
6 ~+ ?* C/ C! @- p5 T! E uchar m;+ l% [4 v: i( \2 w5 q2 L
//TR0=0; $ B- Z! f* f% ^2 o2 H- w% ^' E
if(K2==0)delay(1); // 按下K2键,消除抖动 6 o7 e# Q2 A- c9 q5 i) m8 j
if(K2==0)hour++; // 小时数递增 4 i0 f) ~2 \+ d( W! `& U
if(hour==24)hour=0; // 小时数到24,从0开始
; W3 D: \/ g: p9 q for(m=0;m<30;m++) // 循环30次 6 G- G! Z9 F3 M& j
{( k3 Q$ r. {8 B4 t
disp(); // 调用disp()显示函数 2 T! ~5 _' X+ ], i, d( i
if(SET_2==0)M_D=0; // 点亮U2小数点(秒点)
# s3 L. _% A: r1 u6 A+ n else M_D=1;
3 T" a1 ~ ~' b9 k delay(1); // 调用delay(1)延时函数
$ m) ?* q, d% c M. W } 4 w- ]$ o6 R9 F1 {/ g
if(K3==0)delay(1); // 按下K3键,消除抖动
- A- ^% M8 } u$ H$ ^5 {5 U, k if(K3==0)min++; // 分钟数递增 % C; E6 z4 V7 b5 ` e H
if(min==60)min=0; // 分钟数到60,从0开始 7 J7 ?7 d: s- F2 Z' y- e) `
for(m=0;m<30;m++) // 循环30次 x$ ~5 Y8 c1 j& }9 ?6 e. X
{
0 I# p8 |9 F- g6 k disp(); // 调取disp()显示函数
Z# B, d* x! `2 H if(SET_2==0)M_D=0; // 点亮U2小数点(秒点)
8 o% f4 C) f! V, f* R! x* D2 J6 D else M_D=1;
6 A, F/ P+ l+ U k: \ delay(1); // 调取delay(1)延时函数
5 {, k: `/ M$ [- P, h9 a5 f. Z }2 t! C" q* v0 U5 e( F: d$ W
8 q3 ^7 l% q7 G }3 i7 K1 c; v! X
) y- i3 s& A* R/ @2 k
// ------------------------------ 走时函数 ---------------------------------/ c7 k2 j- u* _6 P& J+ U+ }+ T
/ W) m( ]$ h T y O' L. [5 p
//走时+ ]8 r8 H! |3 ^% b
void time() 5 V$ F( p* o' O* ?" b
{
. R6 G R6 M" ~! u {$ m' {, y conv(); // 走时单元转换
6 T. l# S5 H1 `- J disp(); // 走时时间显示函数
4 v6 A; ^- @) `0 E6 \( B0 P# ]; l/ M }
" E" F% T A7 ]/ E& x9 l8 J2 I$ A4 _6 S
// ----------------------------- 按键模式函数 ------------------------------
! n$ n. c0 X' U, K4 l% e* p& o2 E- T4 H) C9 V5 d
// 扫描按键次数) Y3 |$ V( W# R, X+ Z8 b
void scan_key()0 N! _* M2 A$ c0 _
{
- n4 L' \/ P+ N9 [2 _" z delay(1); // 调用延时函数
7 k# }- w* K7 k if(K1==0) set++; // 按一下K1键,set 加1
6 J8 ]4 N0 D- h! G if(set>=2)set=0; // 按两次K1键,set 为0
! e% p5 W' @# w% G: {+ [ if(set==1)flag=0x55; // set =1,flag等于55H ! C+ j9 k0 O% w8 B
F0:if(K1==0)goto F0; // 按键未释放,在此等候 ! s0 h0 j% i2 c* h# J
}3 O& B% l# [1 ^. E: R
/ p+ X2 @4 D9 n; ] //------------------------------ 延时函数 --------------------------------- % v" N' ` |" n! A9 l2 v" C( V+ ?
1 N4 R/ U+ y/ [; d //延时
3 U1 O7 h! K* K% { V* e" H* t void delay(uint k) // 总延时时间:1ms k
* C3 G& _7 ?' h; v" w# Y' r {/ q) M* F6 S3 f! J$ I& m
uint i,j; // 定义局部变量i、j
# u* o3 p. i- f. z2 u for(i=0;i<k;i++){ // 外层循环 & R2 a+ q# G' ~ A7 W% S. I
for(j=0;j<121;j++) // 内层循环
# V8 ]' B0 B8 ]9 G {;}}& e3 ?1 h7 M) B6 l8 h
}
- r4 s R% T; s, K/ y, x% F, ~' }1 x! }0 J+ b" N. s$ C# ~' v8 }
//------------------------------- 发声函数 --------------------------------
2 ?( D, v* d* M4 {2 w% X% t) q
// 发声 5 c' X: M$ n7 |& I
void fs_d ()
2 |( f' f% Q- h' A1 q7 @5 V( r { ! |+ J& M: s1 K$ E
unsigned int j,y; // 声明无符号整型变量j, y 6 `: P5 f& Y N \- u
{ ( k: q, d8 f* g) T5 i; Z
for(y=0;y<1000;y++) // 循环1000次,嘀响0.5s 1 u* H( |% b, d5 f, L
{ % a7 J+ r L( l- m
SPK=~SPK; // 反相输出 k$ v4 ^; }# ^; i: C; ^( j
for(j=0;j<50;j++); // 延时500μs; k* i1 _7 ]) K7 l6 I
}
8 e* T2 X* d8 i, ? delay(200); // 停0.2s * o9 T. z6 F7 `" f
}
; g) s" @" b, [+ ^7 y }6 [ c/ |% B/ V
; a( i) b: ]: J, s
//--------------------------------- 主函数 --------------------------------2 E8 S% g4 x1 h' q& _- k* C
0 W* p/ b) a4 Z: ~$ M, F% w //主函数# P% M' ^" {6 V( p
void main()' H- S! H3 ~ t8 H! b( g) D
{ 5 {& g6 o8 w' M% l/ S' j
init_timer(); // 定时器T0初始化
6 B* X1 v" E+ s0 c# t8 g! l while(1) // 无限循环 2 p1 \9 [" j0 c% _% P0 ^6 x& m
{
( a9 g& I6 X, n5 d if(K1==0)
9 g" _" s+ I2 M; B' p {
- n( n. ]& W- T% C' s1 _ scan_key(); // 有按键,调用按键扫描函数
% I( @& Y; L8 V7 @" A$ u+ u2 Z& Y fs_d (); , _* s( y: ^7 c# o
}
8 A( l& m) q+ M- Z& d: ` switch(set) // 根据set键值散转 + d* `4 t. p* s
{ $ ?8 [" O' D2 A
case 0:time(); break; // 走时时间程序 2 L& E( [, ^+ b) O- S
case 1: set_time();break; // 走时时间调整
7 |2 k% Y( R- d" ~: M; V+ L default:break; // 其他,退出 * B$ z) O- b9 p- u! r
}
: ~" `5 z/ h6 {& Y1 u4 a9 l4 U, V if(flag!=0x55) // 判断掉电标志
0 n. x( p& O3 i3 I1 c {
. `& m" g+ K) _ P0=0xc0; P2=0xc0; delay(200); // 点亮4个数码管 1 p2 A$ g( f* m; c( C, [
P2=0xff; delay(400); // 熄灭 4个数码管 5 U& Y( p2 G8 l& ]6 u& f- X
}
( i9 W4 S9 S( B! N" K7 S3 Q+ a, } }
' Y" ^0 L% g: T }
* s/ f6 k# n# @ X7 t
8 V T! }: G) Q3 d. f. I! b1 D…………限于本文篇幅 余下代码请从下载附件…………
( Q& l) @8 k9 O5 H: g' ?1 q0 d8 K
下载:# I5 j1 V- c$ V4 U. [6 ^, |; T
4 B( O4 n, C( ~1 Z4 c, ^
9 r$ S; p; g( |& S& q: e1 X
' t7 q9 C4 P8 `) H3 g |
|