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