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