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