找回密码
 注册
关于网站域名变更的通知
查看: 1193|回复: 3
打印 上一主题 下一主题

单片机数码管单片机时钟实验 C语言和汇编语言2个程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-11 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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- `) ]) F
5 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

该用户从未签到

3#
发表于 2019-5-20 11:13 | 只看该作者
学习学习·+ r( H+ Z2 w& k+ u6 O
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-21 22:20 , Processed in 0.187500 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表