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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机数码管单片机时钟实验 C语言和汇编语言2个程序" \, ^' E8 |2 Z0 G2 M, ~! F
7 P/ b1 {- E, X. j- Z1 _- m; h! d

/ R0 S) n$ M# b4 j单片机数码管单片机时钟实验 C语言和汇编语言2个程序 还带Proteus仿真/ _% m, \; C% \0 K
单片机汇编语言程序:
6 |& D% }" o: V4 g
* I1 c8 p( D/ B, ~+ V7 `
- {. E+ _0 R/ A# O
;-----------------------------------------------------------------% p: k$ P) R' I0 x8 C) N: V
;文件名称:SZ10-3.ASM% D) \/ d# v" a  a
;程序功能:带倒计时的闹钟1 V1 N( V! v$ f' J% A- N
;----------------------------------------------------------------8 Z: a( q  }2 k0 M$ O9 Y- q
;******************* 闹钟(含插入倒计时)程序部分 *******************
$ [' [' d2 p) [% ~! \' W
$ ?6 t7 S$ R3 X1 A  m# a5 Z

) a2 [  I5 x; s* L1 L0 W, k ;----- -------- 程序初始化 -------------# v3 g* Y8 ^* W2 h
; 定义存放计时单元地址7 O* F9 D8 u0 Q6 P) C
         ALB           EQU           20H.0     ;闹铃设置标志   7 f4 G$ Q- i% I7 Y) c
         BUF           EQU           30H       ;30~33H 连续4个字节存放显示器数据
  V4 w( o# @8 @* @, O         HOUR              EQU           34H       ;存放小时变量' U' D0 p3 J+ a# Q& ~9 N$ s
         MIN           EQU            35H       ;存放分钟变量
6 r8 j- L; T5 c9 W2 b3 P         SEC           EQU            36H       ;存放秒钟变量
$ V: @5 B' u- ?& u2 z  a9 W' x         DEDA              EQU            37H      ;存放5ms计数值
3 }9 ]  k- g: Z# W8 J         HH            EQU            38H      ;闹铃设置小时变量
9 t% F) v) O* O: Y4 C2 G, l1 R         MM           EQU            39H           ;闹铃设置分钟变量
/ m5 t3 e) z4 _5 W1 W             ;………………………………* t  \3 N1 ~9 H" Q8 {- j( s) s) ^
             SEC0           EQU    3AH    ;存放旧的秒数
0 l' h# K  ^! k/ S' L3 W1 F             MM_D          EQU    3BH    ;倒数时间分钟数2 ?# }$ G- D8 w% s/ m4 ^
             SS_D           EQU    3CH    ;倒数时间秒钟数, Y4 k4 |& q+ E5 m: u7 E8 |
             ;………………………………. f& l7 L+ ]5 e- b
  ;按键输入引脚定义
8 S/ r3 V; _+ V8 X. t  [5 U5 H          K1          EQU            P2.4     ;按键K1引脚定义3 B! h8 X, b& G) f* d
          K2          EQU            P2.5     ;按键K2引脚定义
! N0 M6 [% J9 F$ y9 k: Q          K3          EQU            P2.6     ;按键K3引脚定义8 |3 W  d# V* w5 @7 Z
          K4          EQU           P2.7     ;按键K4引脚定义+ ]+ E: N  n+ ~8 P; n# ~

  X% n7 q0 w, u% ^3 S! j ;蜂鸣器和指示灯引脚定义
) F. l9 D5 A! K3 W5 Q& q! C7 ^. W+ o         SPK           EQU            P3.7    ;蜂鸣器控制信号引脚定义* ]$ ?; u2 K( L: I# P: ~
         WLED          EQU     P3.0    ;工作指示灯引脚定义5 W, `' k  z  G4 E, d! F# o
$ n0 N* y) x5 [
;程序开始执行地址
1 V4 U1 g$ o  }: u0 d- k( T0 P         ORG       0H                     ;程序代码由地址0开始# f0 M& |5 P6 ]- {) K0 r3 b: k
         JMP       MAIN! @4 f. t. H# b5 h" X5 x
         ORG       0BH                   ;定时器T0中断地址设置
' {6 i$ p1 A- h* z6 y- x7 y         JMP       TO_SRV
9 k. P8 G" L+ ?, T* L
/ \* W' p7 Z* K* K6 w  ?+ B1 k, E4 Z

$ E+ n  U! U+ o# [6 ^! a+ E ;-------------- 主 程 序 ------------
, j5 ]* V9 A+ u- g" ^4 f. Q2 ^! ] ) i- C6 D2 r5 g( s" {+ m
  MAIN:                                           ;主程序7 T7 k5 _- a) w- D
         CLR       ALB                   ;清除闹铃标志   
9 V+ T' F  Y. ]' b; y& x# K         ACALL     BZ                     ;蜂鸣器连续两次鸣响* J6 t  x( D3 ~: @
         ACALL     BZ         
* i$ w; R. |5 M4 M* M7 a2 G         ACALL     LED_BL                ;LED 闪动,表示程序开始执行" \, j; E  X% Z& Q) h  l" j
         ACALL     INIT                   ;初始变化量0 m$ Z. [3 e4 `- \
         ACALL           INIT_TIMER            ;设置定时器
# |/ ^' v- I- b% O! Q/ V" y , }% _7 ]: B7 M' `0 V+ W$ m
;加载显示器初值数据1 H. |) l/ g$ N/ U
         MOV       A, #0C0H  3 e" _" _- D8 @3 a
         MOV       P0, A    - u2 ~- c  f% @0 s

/ T& Q- ^( a- T7 `5 J  ;无穷循环
( i* q9 F/ X2 i& V1 k" k. p' }  LOOP:                  
" v4 e# S5 `6 E0 |; C         ACALL    CONV         
. d- v6 w* I0 }. A         ACALL    TIME_PRO              ;检查闹铃时间   
$ G. L6 X9 U  S' ^8 x         ACALL    DISP                   ;扫描显示  
# Z, v* l5 _' q7 c2 ~/ h
  _! P' P' D* d* _. O! w

8 C/ b" c, _4 |9 y( x' J2 ]' V  ;设置走时时间- g  K; G  ~8 n
         JB         K1, M1                 ;未按下K1键,则继续扫描4 S( Y+ ~5 f0 a. F5 g- l0 _1 @; d
         ACALL     LED_BL                ;LED闪动
4 V( t/ Z" e+ T0 u$ Z3 I( V3 {         ACALL     SET_TIME              ;设置目前时间, T2 ^( Q. ~, t- U2 @
         JMP        LOOP                  ;跳转到LOOP处运行! k' J2 q8 M3 F9 E* l, n. A7 U
  7 k/ R' E4 Q# ~& W7 \. H) m
  ;设置闹铃时间 9 M8 t# ^) W/ K" c  i3 s) |1 K
  M1:    JB        K2,  M2               ;未按下K2键,则继续扫描
- Z9 P( q8 r$ w& h: w         ACALL     LED_BL       E2 C, \: e# p% Y, z* S0 g
         ACALL     SET_ATIME            ;设置闹铃时间. n& k- o% W. H" \6 b1 n: Z# s1 @
         JMP        LOOP                 ;跳转到LOOP处运行+ B/ `* Y) O% g% k1 C) r
  : m; z  [0 `4 U8 [, Y
  ;设置倒计时间
/ O- d: d; O/ h7 t4 T  M2:    JB        K3, M3                 ;未按下K3键,则继续扫描
& Q, s9 y6 n0 x( K        ;…………………………
) ]; b0 O% b1 ^3 `1 \3 j3 S5 g              ACALL    LED_BL
1 |1 S+ N( ~9 G' [% u" D. @: S              ACALL    DOWN_ATIME  ;设置倒计时间" |$ o1 E) c% U. h4 N* B# x, r  ^
        ;…………………………+ Y( C  Y2 K7 P7 d  K
          JMP             LOOP                   ;跳转到LOOP处运行. B# [4 j( K3 z3 n- |
  ( `# \- X6 W$ x% b
  M3:    JB              K4, M4                  ;未按下K4键,则继续扫描3 I  k" V% g9 z; x, I
         CPL             ALB         ; R2 x+ [1 [7 R. [" @# {; T" f
         JNB              ALB, M31
2 }% Q) W+ Y9 N! s( k0 k      
; t! l' V* E7 g& W  ;闹铃启动连续3次发出响声
( d# s. h% }2 |: A         ACALL     BZ! u. t8 q: n( |1 @# e4 M
         ACALL     BZ, ~* L: T0 w2 a, D  D9 r! E/ x
         ACALL     BZ
" J; B8 i  ~; C, L: G         JMP       LOOP                   ;跳转到LOOP处运行1 w) y# E9 l" v5 N" i9 H" `4 k

! j+ T/ v  p7 s5 Y: Q

, [# r; z+ o* @4 B  d  M31:
8 i9 F# l6 c  b/ {         ACALL     BZ                      ;闹铃停止,发出一声响; s: e! w3 [% h1 h
         JMP       LOOP                   ;跳转到LOOP处运行4 [: B0 Z- N, A& p+ A

  O( A! _) h/ S  F# u! X

0 Y& N/ W1 A* Z  U3 }* Y  M4:& u" d) w: c8 d5 _* }7 {
         JMP       LOOP                   ;跳转到LOOP处运行- I" i, G8 f; v0 D5 d; `, u

3 q1 a- K9 B+ C5 V3 W7 J5 u ;----------- 实现走时功能的子程序 ----------
" r! ?+ {; E* [: P0 t
4 Z" ~) g) ^- G4 Q$ Z

; g/ n2 S" F6 n. u" @; E2 k  ;使用定时器T0模式0计时
( t4 w( q! E% n. g% }: z! T) `   INIT_TIMER:                            ;初始化定时器,使用定时器T0模式0计时
  ~8 p; E7 o* \         MOV              TMOD,#00000000B        ;设置定时器T0工作模式0
9 o0 v. A7 W% G9 Q7 @3 {         MOV              IE,  #10000010B        ;启用定时器T0中断产生& y- M* ^! v1 e5 N. M5 ?
         MOV              TL0, #(8192-4900)MOD 32  ;加载初始化数据! U$ g/ g+ n+ ~& @: |8 X, Y
         MOV              TH0, #(8192-4900)/32     
3 V- I! y# S  S- N0 e         SETB     TR0               ;启动定时器0开始计时9 K3 G) g% g/ P$ G
         RET7 T8 a* e; |7 Z* P- H, ~
;-----------―――: q8 S8 A0 J: r& [. ^
  ;中断服务程序
$ Q8 N% C/ C/ V7 ^2 o  TO_SRV:                                         ;定时器T0计时中断程序每隔5ms中断一次
$ i0 A, q* s2 m; W0 ]/ y" p         PUSH      ACC                    ;将A值压入堆栈
" J, X9 V" ^5 s' T/ t         MOV       TL0, #(8192-4900)MOD 32 ;重加载初始化数据" O. o9 b6 Q6 g! V, D
         MOV       TH0, #(8192-4900)/32    " `' d2 [6 k: |/ _1 u9 m: Q
         INC       DEDA                   ;加1   
# W7 ^( C. E) y5 Q+ ^) j  ;秒输出8 P1 ]5 R1 h9 t' M7 P# U
        MOV               A, DEDA. s: B" f! S. P( \3 s
        CJNE      A,#200,TT1              ;是否1s到了6 @& i/ u; D# K2 }+ Y1 L
        MOV               DEDA,  #0              ;计数值清0
  z" _* |2 }, a: G) W: o( \3 m- S) ?8 S        CPL              WLED                   ;LED灯亮灭变换7 m0 J& i8 {8 I
        INC              SEC                     ;秒计数加1" E* ?* t; C- L/ L9 G1 H7 J
        MOV              A,  SEC
+ U# y: p" S8 v' {" F        CJNE      A, #60, TT1           ;是否1min到了" O. s/ F# A$ C9 u4 j
  ;分输出- p" p0 u) g4 e2 B, N6 x
        INC               MIN                     ;分计数加13 {  g4 r; H6 I* r; M. L+ @" Y
        MOV              SEC,  #0                ;秒计数清0* y( _- N8 q& t: P' @, j; @
        MOV               A,  MIN
' v% o1 {- _" k2 y* c. z3 B) |9 y        CJNE      A, #60, TT1            ;是否1h到了
1 A/ j- p1 i9 Z# F7 I9 M  ;小时输出! ]  Q& r2 u9 T2 N0 o
        INC        HOUR                   ;小时计数加1
6 x, n. U! u* \  Q7 H( X+ S3 i* b        MOV               MIN,  #0                ;分计数清0
, e0 E% K- j0 o! r+ U' H        MOV               A,  HOUR' A' F& J/ o" r, J$ q
        CJNE      A, #24, TT1             ;是否24h到了
6 c" U6 |: v7 k4 w* i: n/ U7 [        MOV               SEC,  #0                ;秒钟变量清0
1 o" p, G* ?* H1 p  R        MOV               MIN,  #0                ;分钟变量清04 p6 C* ?) r. ~
        MOV               HOUR, #0                ;小时变量清0
# W' |; q9 c. S  E! U4 ^1 i. J  TT1:
. L; a! H4 K$ t; F& s        POP               ACC                    ;将A值由堆栈取出8 P8 e$ c' z  w3 ]8 k9 b9 h5 V
        RETI8 Q+ v! f$ y& V8 k) c
3 D. ]# @$ v0 i0 |
" B  o* R; {& U$ p5 q- a
;------------- 实现显示功能的子程序 ---------
/ l7 e0 T- f" V
5 I' R0 G3 t' e! J5 t9 \
$ F- S4 U' {5 r$ ^
; Q- x2 b* d4 {; g, e
  CONV:
. ]( s" @0 ?1 m1 f  ;转换小时数据
; k  p  S% b/ T# l5 ]7 s4 F$ S, m        MOV              A,  HOUR( l/ [6 B2 i$ @6 j& y  b
        MOV               B,  #108 A3 a4 g! _! r3 _' E1 K+ i
        DIV               AB
9 Y; w- [3 o: p        MOV               DPTR,#TABLE           ;查表转换
" K/ r% X) |! O' a% D$ `        MOVC             A,  @A+DPTR
( z! v  U. U' H2 x3 G# G9 T        MOV              BUF,  A
9 ]9 u$ a7 |! c: Z& m; @        MOV              A, B. L4 k* F; \+ N
        MOVC             A,  @A+DPTR" ?9 w2 I0 f1 _- k+ f$ N
        MOV              BUF+1,  A
8 e+ l; `; m5 E' E" {) ]/ Z  ;转换分钟数据, p# ^4 f, P- M( |' \% l% j0 X7 L
        MOV               A,  MIN) A' c5 v; `% w8 S3 `
        MOV               B,  #10
( S5 Y, s2 H2 v9 W  Z# h5 p        DIV               AB
6 ?7 a# |2 b) M. ]        MOV               DPTR,#TABLE             ;查表转换
% z5 I0 O+ C9 c0 h, A5 _2 W8 L/ {        MOVC             A,  @A+DPTR5 J4 Z  [5 j1 R$ b
        MOV               BUF+2,  A4 }3 B1 d' M+ Q9 s8 J
        MOV               A, B
" i, j- ^8 r4 u( C  ~3 ^+ V  j        MOVC      A,  @A+DPTR
& \/ s$ A$ a! U7 H5 H+ p& X( i        MOV               BUF+3,  A
5 M$ Q# Z* ?* T. H( `5 {1 U) K; o( y        RET$ i+ K: L1 H2 @4 O% E6 ~

: [! F, q) f  E  ;字型数据编码表/ N3 ~/ Q) T: W2 u, t4 [
  TABLE:
! g' ?5 E9 R: ~9 ~        DB   0C0H,0F9H,0A4H,0B0H
+ s5 T5 ~; g  J& ], B7 u5 `+ v        DB   99H,92H,82H,0F8H
1 |8 S, [. q* p3 j' V2 ~        DB   80H,90H,88H,83H1 ~/ y( G) b/ y) Y7 {
        DB   0C6H,0A1H,86H,8EH7 O2 D: V; B# f$ e! D1 z! {

9 k$ }* K& V  ^. {# \2 e8 E! l ;-------------- 扫描显示子程序 -----------" x& P6 x, A' B8 q6 G3 t3 z3 Y
  ;扫描显示/ G; s# \2 B: }6 ?
  DISP:
& D0 P* h2 I8 V3 ]        MOV               R0,  #BUF               ;指向显示器显示缓冲区起始地址- r6 j$ C1 ^0 ?( F' m
        MOV               R2,  #4                  ;循环执行4次5 o% |$ Q$ h2 l: E# I3 ~" l# I9 I0 }
        MOV               ACC, #11110111b        ;加载扫描信号初值11110111B
$ Q4 P) Y! v: d7 p( ]8 e& t  S1:
& {) M( r9 K6 \5 ^9 \        PUSH      ACC5 P( w- ~" S. L5 ~# M6 o$ C: w$ _" p- {
        MOV               A, @R0                 ;取出显示器数据
- C, l$ A1 A3 o        MOV               P0, A                   ;由P0送出一位显示器数据
. E& w) ~9 Z) ~0 B4 Y        POP               ACC
% |2 P4 C7 B0 J        MOV               P2, ACC                ;由P2送出扫描输出信号  ! g% [% T7 r4 j
        MOV               R5, #2                   ;延迟一段时间
- L6 J+ W) l* ~9 u% z        ACALL            DELAY/ c) ^) C+ u, \; r4 ^$ j$ ]! K/ x
  ;改变扫描码 EX:XXXX1011
+ Z0 ~! r. Z9 A6 m/ ~3 n% U        RR                A                       ;累加器A向右移动一位7 |$ |' }$ C% s4 \. I' c7 h. P) i7 |4 b' M
        INC               R0                      ;显示器显示缓冲区地址加1+ `* ?% n0 `! J7 }
        DJNZ             R2, S1                  ;判断是否继续执行循环
9 J. ~* F0 x9 v% C, m- A; i4 C        RET
3 g( X% s3 \* i/ U/ ^9 h' Z, f 7 h; F: G; ~1 }# M1 Z
;------------- 实现调整时间子程序 -----------; h+ B+ Z0 z4 v2 O3 B' ^  p) ~
3 u3 ?. _. l( H8 D  t2 a9 N

1 c. s5 b. O' L! @# T+ M* J; ?% s ;设置目前时间% h( C2 k9 m2 ]- j/ G
  SET_TIME:
* I; g/ }" h) ^- n        CLR              TR0                     ;定时器工作暂停: d0 N2 v# Z. [2 @" B' X
        MOV              SEC, #0                  ;秒钟变量清0$ O; p" W8 Y1 w/ a5 @6 e
  L0:& h, {2 P/ ^6 j# m8 f
        ACALL     DISP                    ;扫描显示
! F% r' a) b( O( h! b3 f 1 T4 d% ?( p- k
        JB        K2,  L1                ;未按下K2键,则继续扫描# S  r* z" h1 _  c) k5 ?( J
        JNB               K2,  [        DISCUZ_CODE_2        ]nbsp;                 ;按下,则等待放开
* ]  [# g+ Y$ n& `4 i   ;K2小时调整   1 p* [: ?' @* Q3 Q
        INC               HOUR                   ;小时计数加1" Q) V6 R5 r4 D, ]* |
        MOV               A, HOUR( r/ [9 l/ [0 u8 T5 P$ T7 d
        CJNE      A,#24, L11              ;是否24h到了3 Q% z) `+ E( N0 s
        MOV               HOUR, #0               ;小时变量清0/ E! }/ Y1 b- f# B$ }
  L11:
" G) P4 ~) O. f0 k# Q        ACALL            CONV                   ;转换显示数据
( a8 u. h. Q7 A4 ]        ACALL            DISP                    ;扫描显示: I: }8 O3 M1 w) n" @
        JMP               L0                      ;跳转到L0处执行
5 T) N- E5 j/ } 6 t  z: M: S, k% v* i7 Y
  L1:   JB        K3, L2                  ;未按下K3键,则继续扫描
' {" U7 ]6 G, u5 J/ p' D        JNB               K3,[        DISCUZ_CODE_2        ]nbsp;                   ;按下,则等待放开
4 Z5 W8 |. {: y- ~3 T- |) f) k   ;K3分钟调整& y; i7 }: f" ^: K9 [# j
        INC       MIN                    ;分钟计数加15 |  }9 l& W( @" O2 S+ v4 C, v8 N
        MOV               A,  MIN
- y! d$ I/ g: l3 d% E        CJNE      A,#60, L21              ;是否60min到了
. u$ e& I& h2 D$ J( z( h        MOV               MIN, #0                ;分钟变量清0
% M+ \; O, c5 w  L21:
; O1 q. r- z( S        ACALL     CONV                  ;转换显示数据
4 s* ]+ @) U8 K! u, R% N( \& W$ ~        ACALL     DISP                   ;扫描显示, ]9 |$ ~2 @& C
        JMP       L0                     ;跳转到L0处运行4 B+ t0 |. `( N% f7 D

; u2 A; @; U5 |+ u1 }  L2:   JB               K4,L0                  ;未按下K4键,则继续扫描+ S3 G% Z7 |2 w, b/ Y
        JNB               K4, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开" Y1 |* U* L' u0 _4 ]1 F, C
       ACALL            BZ                     ;蜂鸣器鸣响一声
, ^0 |. h* T; e! s+ O2 C. w  ;K4设置完成1 p; ^* V8 |3 Z8 p/ @" Y4 g
        ACALL     LED_BL                ;LED闪动
, N) h2 t. R" |        SETB      TR0                    ;启动定时器
+ n9 C, L! v3 v        RET + e5 I" _9 x  {8 b. |

/ x0 {. _# H& t; K9 n
8 Q7 f  i4 r0 O9 a' j
;------------- 计时单元清0子程序 ----------
* r+ l3 ?# F, W' G+ f0 c) w" ]) H: o5 `

( f8 O/ p9 V- k3 w  ;计时单元清0
  Y/ N2 r/ v1 I: l1 |+ _& a* R INIT:              ; c4 V, x4 w( M8 j- b. `" p
       MOV               DEDA,         #0            ;5ms计数值清04 U$ v  y% W! q) ~- e8 ^+ t
       MOV               SEC,           #0            ;秒钟变量清0) Z1 f+ O% W+ v  T
       MOV               MIN,           #0             ;分钟变量清0
$ I; k" G% Z( A' d8 n1 c4 e. h4 _6 Y. s       MOV               HOUR,         #0             ;小时变量清0! F' O: a% T+ k& a' C
       RET
9 c# a; U4 B$ c$ i. A) S7 x- I+ j# H% J

2 U. g: s0 O. Z3 g! _% C6 V ; ------------―蜂鸣器鸣响一声子程序 ----------
4 t/ s  j/ n5 a/ B( `2 y ;蜂鸣器
( o( [* L! l1 q6 A  BZ:                                ;蜂鸣器鸣响一声2 ~' @: _( R" ~" J
        MOV       R6, #250
) R' J) H2 U/ ]6 O: i  B1:   ACALL            DEX
; B" u' s: V7 Q- v3 V# E' L        CPL               SPK( O5 c: P4 F) @2 @
        DJNZ      R6, B1
) {$ U4 ^' B- M" i) P% [        MOV               R5, #50 , s7 O" Y( v4 y5 a$ V
        ACALL            DELAY1 q  H0 h! `. z1 |; C8 l& M2 h3 [
        RET' [" w0 s; A5 Q) B# t/ ^* e

' d: o* d& y3 p/ B ;-------------工作指示灯闪烁子程序 ----------
* [: q8 ]! }1 X ;工作指示6 x9 n' k- A( j) v
  LED_BL:                                ;工作指示灯闪烁
1 c, p) g2 S3 T6 S$ k        MOV        R4, #6
9 R" O% W* R9 d/ {  LE1:  CPL       WLED                  ;位反向2 a" I( K4 M8 H
        MOV        R5,#25 1 V8 |" ~% j' z5 D! Z
        ACALL      DELAY            ;延迟50ms6 C5 q4 R9 Q6 o2 M
        DJNZ      R4, LE1         7 d0 s- l' P; j1 F0 v1 T# Z
        RET7 @. o& e+ T& {4 a

8 P; v) U# Q) h* \0 y
# Q6 r% X9 ]6 k9 {# n# [& }
;-------------- 延时子程序 -------------
0 w. \6 C. g9 s) ?
# n4 b5 M2 T2 r) M) b
+ @) f) H9 r6 A1 s' B: i7 t
  ;延时子程序
3 L% B8 M' i2 j0 `  DELAY:                                   ;总延迟时间R5 2ms* X4 i# k0 L. h' }
        MOV        R6,#10 3 x7 |& ^2 a0 s8 }; ^9 v
  D1:  MOV         R7,#100) a- M* G. L6 m. m, \
        DJNZ       R7,$
1 g  J& p4 Z4 G3 ]. _        DJNZ       R6, D1
( t5 l$ G- E/ s/ ]4 e- k5 n* U+ t( c5 v) d        DJNZ       R5, DELAY
7 {$ _2 x4 D1 M0 B        RET
# q$ y' s% F2 [3 W5 Y3 ]5 x ;------------ 蜂鸣器短暂延时子程序-----------
8 c% x( `+ V) D# k- A  ; 蜂鸣器
/ y+ x) D; R5 {$ r9 s' N" e  DEX:  MOV       R7, #180               ;短暂延时4 @$ |9 J7 E/ u- d& a
  DE1:  NOP  O# A; j& @/ ^
         DJNZ      R7, DE1  E9 M/ t* B1 _& y2 r; A$ A
         RET
& C3 o. T- t2 t+ v, Y& q/ m9 J
, c9 \$ `4 D2 f8 s! P$ D, S5 f/ _6 q

' K  V9 o& ?& K8 m" a; ]6 W ;******************** 增加定时闹铃程序部分 *********************
+ R. n. w8 n0 M; s$ m) C" I0 ?: A/ _, }5 a3 g

' v. k$ s# _' v% \; J3 U( Y8 [ ; ----------- 设置闹铃时间子程序 ------------
/ p8 g& q. v& c, R# h* ~& u! ` ;设置闹铃时间2 y6 d3 [4 d7 |9 \$ X7 `9 F# f
  SET_ATIME:/ J6 `8 l- k$ I' |3 V9 r
         MOV       HH, #0
: Q) a1 a9 N" yMOV       MM, #0- m. B! H! O5 Z+ ]3 D& k
ACALL     CONVA                 ;加载闹铃时间数据+ \7 S  V* v& F# Q
  N0:
1 F: m! a3 |! S+ i. b$ c         ACALL     DISP0 K: u! u& I4 y
  ;-----------
: B9 C! a" q3 X) R3 |; ?5 X        JB         K2, N1                  ;未按下K2键,则继续扫描
" |& i5 ?8 }. W. I; m        JNB               K2, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开$ v. r+ [' H! W0 V; d4 d
;K2调整小时3 F" F% F0 m8 y. J+ Q) m" S
        INC               HH                     ;小时数加1
+ c) Q' S7 f  `( U+ k3 q% [        MOV             A, HH2 r. `6 Q0 w1 C$ I# G4 a
        CJNE            A, #24, N11             ;是否24h到了
, O4 M6 h3 _- u& y" v, u        MOV       HH, #0                  ;小时数清0
/ G, B- \) b. M& D7 ?% T- q0 _6 V# ^  N11:
, ^% a0 d" ?5 A        ACALL            CONVA                 ;加载闹铃时间数据
! v5 P+ o- H/ p, t* ?        ACALL           DISP                    ;扫描显示
+ M3 u. i% u; U3 L# W" l$ S        JMP             N0                      ;跳转到N0处运行7 E4 W0 K. [% Q. ^* r) G
  ;------------
2 F) \" Y2 b9 P! D, u  N1:   JB               K3, N2                  ;未按下K3键,则继续扫描, D9 j, N' G: I% s7 `
        JNB               K3, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开8 X2 g' Q" Q# e7 e7 G& v
;K3调整分钟
8 ]5 |. k3 q, ^. B        INC             MM                           ;调整分钟数! l& e" q% r  S6 l8 @, k
        MOV               A, MM                 ;分钟数加1/ s2 _! |9 M! C* ~; [  c+ O7 B
        CJNE      A, #60, N21             ;是否60min到了
/ o7 c7 K  }  n        MOV               MM, #0                 ;分钟数清03 M9 e" w/ ^7 X; X3 ]  b. f  Q& a
  N21:
! P& {! t2 a9 g        ACALL            CONVA                ;加载闹铃时间数据( S+ V, `" w# h% D( [. d
        ACALL            DISP                  ;扫描显示
5 P/ |9 t/ E9 O$ m4 P% Y  ~8 ?        JMP              N0                     ;跳转到N0处运行( F% a5 L* G0 O
  ;------------! ~, s/ {& l6 ?0 [1 o7 X* d" \5 Z. c
  N2:   JB               K4, N0                  ;未按下K4键,则继续扫描; I$ n# u5 }7 u: D% e
        JNB              K4, [        DISCUZ_CODE_2        ]nbsp;                  ;等K4键放开, e$ ~$ o1 g1 {2 Y
  ;K4设置完成
5 l6 m2 w1 O( S. b) ~" t7 W5 m        ACALL            LED_BL                ;LED闪动
. k  o- P3 G! g7 L        ACALL           CONV                  ;加载现在时间数据* k6 d: J' P5 z- Q+ W
        RET
0 n# I/ I0 q( Y) }" S+ E& ?& A1 v/ l/ t% S! f
# }" T' W9 K  m1 L" _7 @
; ----------- 加载闹铃时间数据子程序 ----------/ {8 D! A- w! U' w& y

8 l& j- d  y  g6 E$ i+ l) P) s

' _! z5 d: A* J( k2 D; b 6 U+ j7 z/ b! y' \+ G( x- E/ j
  CONVA:. @  U! U  d# T( T2 C! l
  ;转换小时数据
( G* c3 T* p: i        MOV               A,  HH
- H( l# T0 k# {        MOV               B,  #10
; P! ^6 ]4 a% H; w        DIV               AB, s$ E# X$ @% O: \6 Q, H
  ;-----------
; U) J% n* v- X. T) g: ~        MOV              DPTR,#TABLE           ;查表转换% [2 Q/ t! \% l% A
        MOVC             A,  @A+DPTR
9 u8 L; x) Z# ^( D- d- a' v        MOV             BUF,  A" k) H5 g; A) V- f" |3 v( Q6 V
  ;-----------/ n( N6 `! O! g' `
        MOV              A, B  B- G  T" K* e1 h4 g% ?! z9 d
        MOVC             A,  @A+DPTR
! O+ U6 `$ C2 d6 q. _# y        MOV              BUF+1,  A
+ N  I5 y2 m3 f' x  ;转换分钟数据
5 o0 s( d1 O+ r& ^3 N. C. R6 H        MOV              A,  MM
6 k. F, z8 z( N3 h8 s( L( d+ r        MOV              B,  #10
0 W1 U3 B2 _. A        DIV               AB
3 ~* g" e# c( Y% \: J  ;-----------
$ S3 g& U, |$ J) ^7 ]2 P        MOV              DPTR, #TABLE           ;查表转换
; T* r. C+ ]9 e; m  [        MOVC             A,  @A+DPTR
0 q2 Q& E$ X! |1 S; Q( p8 h; S        MOV              BUF+2,  A4 a' L1 w. i# f6 x& ^- i
  ;-----------4 |( q- ^% y3 O# Z) j
        MOV              A, B
. L+ ~: g3 ?' G( k: ~* S1 v        MOVC             A,  @A+DPTR' s$ M8 [% v8 Z0 ^# h+ E6 O% B
        MOV              BUF+3,  A/ L, E8 @, q6 C( u6 b
        RET
' _- `$ w/ _8 ]0 ~7 j 1 o3 X' f: a, j; {" m4 \" B8 l8 n
; ---------- 检查闹铃时间处理子程序 ----------
/ p$ S* F( }, u( ^0 ~' Y3 ~. ~& ]/ r) Y2 |

1 u$ o1 J9 R0 J4 E ;检查是否启动闹铃& [8 B$ f' f3 b
  TIME_PRO:
9 [% h* q! q/ h2 ^        JB        ALB, TI34 H, G4 A2 j0 b# k
        RET
2 i0 V! c  [2 Y( p# C9 S; --------------
. P/ m7 Y- W6 {8 @0 B! y  p- Y* v9 A7 b6 h9 |) I' V# G
* w' u& ?  z4 Q. j. c* V
;检查闹铃时间是否到了; E, S; z7 M( E6 K0 s9 a
  TI3:
% j) l5 f/ Y) a* f8 `        MOV              A, HOUR
- u' n% e' v& U/ U0 X5 Q' U        MOV              B, HH
9 k5 p* I. R! n* T( G0 F- ^        CJNE             A, B, BK                ;检查闹铃小时时间
6 y' [6 @5 w4 e9 S0 V) z6 |( L  ;-----------% t9 [* t% m* t+ @
        MOV       A, MIN
' p4 Q( G$ X3 t* E# E! ]' j$ A& v8 {        MOV       B, MM
5 P# v. j0 V* g/ y8 L/ |* v3 r        CJNE      A, B, BK         ;检查闹铃分钟时间
& U, e* ^& c4 I   ;-----------" q* \( k& g2 B2 a1 n0 }
        ACALL            TIME_OUT              ;调用执行检查闹铃时间处理子程序/ j7 w- g! u9 ]. x2 }" A( W
  BK:
0 t, ~- @* y; j  m- L        RET! a& p/ ^; o0 s* |' L! }3 O

0 G; p* d9 s& Q. D8 b

% Y/ P5 K7 o, g) O9 V9 e" m ;---------- 执行闹铃时间处理子程序 -----------) b# @9 B+ p% h/ W& W- a

" z' ^9 m; Y, P* \& P
3 m0 C! K$ t6 H; E0 E5 |- J
  TIME_OUT:                                ;所设置的闹铃数据到了: a8 R8 |! F/ S! o! t0 K7 ^1 U
   X1:  ACALL           LED_BL                ;LED闪动
5 A# \  @/ k" L" {& h         ACALL           BZ                     ;蜂鸣器发声
: U+ v' N6 t3 f9 G" G+ F# f  ;按下K4键停止闹铃 ; Z( N% @, s+ S1 v* e
         JB        K4, X1                  ;等待是否按下K4键
4 A* A- V" {( |" q+ H         JNB       K4,[        DISCUZ_CODE_2        ]nbsp;                   ;若按下键,则等待按键放开
, N: |5 w0 ?* v$ c9 b% Y         ACALL     LED_BL                 ;LED闪动
/ L: z8 r# \& ?6 L         CLR       ALB                    ;清除闹铃位4 N9 Y: S* C8 W0 y
         RET
/ M% ?, c4 W$ f/ C, K; ^% `; -----------------------------------$ N6 g* [. ^8 ~% Q2 a2 w
     
" _  @  g: u: t9 i! b ;******************** 增加倒计时程序部分 ***********************8 \; f% v4 Z2 \9 L* q2 y

% u2 R6 i$ Q9 Q' O' ~" h

+ ~4 b6 p! A. U  q# b. n) r* o ;----------- 设置倒计时时间子程序 ----------! L; R! J+ E9 ?3 a/ F- ]# q
;设置倒计时时间( i1 W! T( f, a7 J* y7 Q
  DOWN_ATIME:
/ q+ _. U+ o1 X" B) A         CLR       TR0                     ;定时器工作暂停
0 B5 v! f/ x0 U2 e. J" W         MOV       HH, #0$ ~+ s( f6 u  v% F
         MOV       MM, #0
5 \) @" _5 t. T9 P' k' h* L( B2 v+ xMOV       SS_D, #1         ;秒钟变量为1
# k% Q# x& L9 y7 S# e& N6 o+ ^  S0:
( D9 R& C9 B% W5 }3 r        ACALL     DISP                    ;扫描显示5 Y3 L/ R" u3 @& S& Q$ v, E
   ;-----------
1 V6 F/ P. Q% T& |& n8 r9 ] ;按K2分钟数增加
  z* X7 t3 U7 Y* e4 l" q         JB               K2, S12                  ;未按下K2,则继续扫描
: X) D/ y% N0 b4 Z, D1 T$ h5 j         JNB             K2, [        DISCUZ_CODE_2        ]nbsp;                   ;按下,则等待放开
: w) ^# g6 _" h + |( N  T3 \. o. S' }3 y* i6 h
         INC       MM_D                   ;分钟数加1
% R/ `- t. I/ A; h  j         MOV       A, MM_D' k6 T0 C$ `! t/ Y. |
         CJNE      A, #60, S11            ;是否60min到了+ V8 R3 e* n/ k% E5 i6 _
         MOV       MM_D, #0                ;分钟变量清0
( A; `9 |! k; e% \: ?3 N  S11:
1 C( f, x3 K% K* S5 ~        ACALL  DOWN_CONV                ;显示倒数的时间* N% s' m: A" m% J% X5 N. s9 I) P
        ACALL            DISP                     ;扫描显示" z( W0 k4 y# G& C$ i& ~
        JMP               S0                       ;跳转到S0处运行0 J5 q7 z' _. I; d, v, o
  ;------------
; I( f9 {5 J% g ;按K3分钟数减少! K: G* x6 j9 y# j
  S12:  JB        K3, S2                  ;未按下K3,则继续扫描$ B0 H  r# F/ s2 `, ^2 d
        JNB               K3, [        DISCUZ_CODE_2        ]nbsp;                 ;按下,则等待放开: c8 w! n/ P4 [5 k' O( A' Q5 u
! m( G! X+ j7 J# h. J; b9 H

! P1 x: P( S; B& U$ o        DEC               MM_D                   ;分钟数减少1
, j& e9 ]( n) n        MOV              A, MM_D         
& j- p/ Z# q6 J5 V8 y3 [8 S& ~        CJNE      A, #0,S21               ;判断是否为02 `4 \2 s& x, E* D
        MOV               MM_D, #60               ;分钟数赋值为603 c$ f9 P; V- [/ Y
  S21:
  }# Q% N4 Q, \1 c# _        ACALL            DOWN_CONV            ;加载倒数时间数据% u0 U- w0 O/ _
        ACALL            DISP                     ;扫描显示
) \% \& w& m( m5 i8 n        JMP              S0                       ;循环执行9 J: Y- k: l% n5 g
  ;------------
6 b1 h, ~. f$ |# X) n2 ^, k* }: K# n  S2:   JB               K4, S0                   ;未按下K4键,则继续扫描8 P: z# r- Q0 i5 E. V
        JNB              K4, [        DISCUZ_CODE_2        ]nbsp;                   ;等K4键放开  X- {1 D* q0 S7 t9 G0 e1 x
  ;K4设置完成
; ^  H1 m" O7 M3 s: o/ O; ?        ACALL            BZ                       ;响4声
! M9 d# b. u5 l$ A1 W4 x        ACALL            BZ, t# @- I5 s1 [, B( Q% g1 G
        ACALL            BZ) P2 I$ S2 N; ?
        ACALL            BZ. o0 ^7 n, {4 V4 C6 N% ]8 {* P
   
, s$ i9 N: G6 D. r/ Q8 ]        ACALL            LED_BL                  ;LED闪动! G1 y/ G) F. I. J6 P2 Z
        SETB             TR0                     ;启动定时器. M! y# p! c, }* T( P
   
: P: N3 ~+ }1 J  S3:. }# j9 C! _/ T$ d+ x
        ACALL            DOWN_TIME             ;检查倒计时) F3 d! e! P, \
        ACALL            DOWN_CONV            ;加载倒数时间数据
8 W- C9 O9 I9 A8 M; k        ACALL            DISP                     ;扫描显示
% F# \$ @% C4 g+ `        JMP              S3      0 x( {  P) e! r0 U) R) {3 _
        RET
' T+ Q  D( |  ]: ^" P  e0 ?   
9 V  j, r  N3 q: G, D$ j  n, E  ; ----------  加载倒计时时间子程序  ---------, I+ j) ~" b; p5 f5 }. B4 M' e
;显示倒数的分钟数3 w* J3 H& p; K
  DOWN_CONV:
' ?, C$ b7 K) d, G% w  W        MOV              A,  MM_D3 V! O- j5 Y2 [2 k( W5 I
        MOV              B, #10                   ;设置被除数( r8 A& o/ N0 Y9 g+ S
        DIV               AB                      ;除法运算,结果A存商数,B存余数, E- h$ M8 ~- r+ J- x3 V5 i
        MOV               DPTR, #TABLE           ;查表转换
* _; U5 s0 @: S  t: D' y! J- [8 c        MOVC             A,  @A+DPTR+ @: }, u2 z# I' X* n2 \& y# O
        MOV              BUF+2,  A               ;商数存入BUF+2
9 B" Q, H) H) Y; w, l9 i        MOV              A, B                     ;余数暂存入A
5 i! F* R5 l+ e+ B% `        MOVC             A,  @A+DPTR          ;查表转换% G7 P( P- F- {! g* i
        MOV       BUF+3,  A              ;余数存入BUF+38 f, b8 B7 }% M: H) D3 \
        RET
) A/ x- n* W% V( r6 v6 W
7 U; i% y5 F0 e- O! A1 |/ a ;------------- 检查倒计时子程序  ------------
$ t; B" _  Y( `; [ ;检查倒计时0 R0 z5 q3 s- f* r
  DOWN_TIME:                              ;检查是否倒数终止
( `: J( b" e) B/ l' m+ q3 m        MOV              A,SEC                  ;加载现在秒数7 T$ e/ z$ }0 q) f
        MOV              B, SEC0                 ;载入旧秒数; ]( E' Q1 ^! a
        CJNE             A, B, D01               ;是否过了1s
5 J. X: X2 q' }- s- g6 A        RET% o( i3 V; h6 @; L$ v( A3 u+ H7 R
; -----------5 R0 a0 D/ R+ l5 P, t9 W
  D01:( P7 W2 {8 M. O. c
        MOV              SEC0, SEC               ;记录旧的秒数 * n0 ~  I# }1 h+ {( V  ]
        DEC              SS_D                   ;秒数减1' j4 n  V1 l  i# _
        MOV              A, SS_D& T, T* f# M$ O) Q# r
        CJNE      A, #0, D11              ;秒钟数是否为0
( @( @9 j6 ~3 h8 w) l        MOV              A, MM_D        ( P, u! h. k% A% z5 ~" t$ t! M. b2 b
        CJNE      A, #0, D12              ;分钟数是否为01 {! ~0 H. u, _/ t8 B1 W
  ;秒钟数为0且分钟数为0,则倒数终止
$ r6 t; O4 \) i        ACALL            TIME_OUT              ;倒数终了处理程序$ \' p  c) K2 ~6 x5 n* Q
        JMP               LOOP      
- H3 h* _$ T0 ^6 O/ b        RET  
: }1 `1 i9 Z& y$ s  ;-----------
# R; {8 Z: J! Y# ~6 J" C  D12:
0 E8 P; f; P  z# m) a        MOV              SS_D,#59              ;秒钟数赋值为59     
( T0 R- v6 }( ~- T        DEC              MM_D                  ;分钟数减1
# B- Z( U& }7 H
) p/ I; f0 n' O  D11:
2 x2 V& D! \! G( P        ACALL            DOWN_CONV                   ;显示倒计时时间# W2 H% v- _/ U5 C6 [5 Q+ i% `
        RET2 f; w2 o- z9 w* J* @( K
;----------------------------------   7 M4 A5 b- o6 f" q' p* Q
        END) I; S( n, S  J, L# R
;-----------------------------------------------------------------/ K8 Z+ O. K: b/ `) F% X

2 b: x# t; x0 A7 }
1 @+ u! v- P7 V" m9 d6 ^
* l4 E( M# O, l. h5 j) ^: y单片机c语言源程序:* @9 O' p6 L2 S% a" J9 q' C
// --------------------------------------------------------------------------------------, ~& k% h. Z+ }- T
// 文件名称:SZ10-1.c
3 B& x+ o! w. G3 U/ i& U' i( {// 程序功能:单片机时钟                                            ) ^+ g3 X5 Z* t0 z; l
// --------------------------------------------------------------------------------------! `" D& h8 B0 j
    #include <reg51.h>                   // 包含器件配置文件 3 w! j: u$ z+ [4 y3 q
    #define uchar unsigned char8 o8 q( K0 p5 w( q. G( V6 x
    #define uint unsigned int
1 s  A4 E# M1 u    char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
6 d  T. I. w  K9 o             0x92,0x82,0xF8,0x80,0x90};  // 0~9的数码管段码            
0 W( d' `: h, |- j        uchar hour=0,min=0,sec=0;                     // 时、分、秒单元清0
6 `+ `1 V2 l1 i' M+ P, Q  r8 f    uchar deda=0;                                            // 5ms计数单元清0  
9 a+ m+ R: ]0 i    bit d_05s=0;                                     // 0.5s标志   
& O+ G' k% A. a- Z$ J0 t    uchar set=0;                                                 // 模式设定标志
4 _, O3 O1 ~) J2 C    uchar m=0;. t" c! ]8 l; p* Y
    uchar flag=0;                                             // RAM掉电标志   q2 {. z9 h: W8 E- ~& r
    void delay(uint k);                                     // 延时函数 % k0 q# Q% S* A+ X+ P
    void conv();                                                    // 走时单元转换 1 Y% h; w# A" F3 Q
    void disp();                                             // 走时时间显示函数  
' n8 e* P) \7 _. S" h- \//-----------------------
0 T3 S1 L7 o4 G$ F. G+ k" k5 e    sbit K1=P2^4;                        // 按键K1引脚定义
/ e8 q' X+ g2 v% t    sbit K2=P2^5;                        // 按键K2引脚定义
8 y0 |- E5 a! S" w0 v    sbit K3=P2^6;                        // 按键K3引脚定义: l7 O% H0 _. {3 b
    sbit K4=P2^7;                        // 按键K4引脚定义
" q6 ?$ @6 x/ m! Q//-----------------------  ( Q9 L4 T4 ^  w( w9 L4 Y
    sbit SPK=P3^7;                       // 蜂鸣器引脚定义
( b; c- c; M" X* M/ S& R% H! q/ I    sbit SET_2=P2^2;
0 U3 D  A0 d) X$ V    sbit M_D=P0^7;5 t/ I4 z* F) m( l* n; y
$ Y, d# C& G! y1 X6 i& G& _
// ---------------------------- 定时器初始化函数----------------------------9 s9 f3 G1 B5 W4 z5 a& @$ @$ D

6 b5 v- u/ c# w! M' _) g // 定时器T0初始化
( T9 k" a: L" T! N6 ^   void init_timer()5 \  J8 J6 Q: i5 }8 J% @0 c9 a* W
    {
1 ^3 P$ M) X; t6 ^+ a9 B. {     TMOD=0x01;                               // 设置定时器T0工作模式为1 % s' X( ], d/ X9 y+ K
     TH0=-(4800/256);                          // 加载高字节计数初值   8 E' v5 ^0 d2 T6 X
     TL0=-(4800%256);                          // 加载低字节计数初值   
7 q4 L& w/ g, g9 w- b/ A     IE=0x82;                                  // 启用定时器T0中断产生 1 n1 C- c) Q; E2 j; _# E
     TR0=1;                                    // 启动定时器T0开始计时
! [! K$ n, v9 x" R   }
! \: k4 V% g! N, T! ]3 h0 V- ^
" G- `) l3 m" R. J2 `# T9 K7 _/ m8 f// ------------------------------- 中断T0函数 ------------------------------
! @  `2 E8 M9 T' _$ M# o( A- y; w1 t
// 5ms定时中断
3 y; `7 Y6 ~4 m9 X+ ]+ [1 ]" N   void T0_srv(void) interrupt 1
2 j7 `2 p8 A+ M( |   {
: M' n( h& C: c9 j% H3 K- q- \     TH0=-(4800/256);                          // 重置定时器计时初始值   
% d6 N/ d) a. O( f, y  |( F     TL0=-(4800%256);9 N7 k9 [' V  v
     deda++;                                   // 计数单元deda 值递增
+ V" ^7 U; A) C- [! e   }                                   8 i5 N$ [, W# t" a. x' J
7 t; `% E$ p9 k6 f
// ----------------------------- 走时单元转换函数 -------------------------
! l, q; n7 j; r* L- D5 k* q& s! O6 F1 N3 s0 R
  // 时、分、秒单元及走时单元转换: }5 D; e( U* F6 G
   void conv()                                                   
1 m3 F/ K0 \# \0 l$ p$ n7 ?   {                                          0 ]9 }. Q3 B% m* t( v2 K9 K7 X' b
    if(deda<=100)d_05s=0;                      // 秒位标志,每秒的后0.5s置0
' m) N5 v, ~' Y& Q' A. g           else d_05s=1;                     // 秒位标志,每秒的前0.5s置1
6 }( A, F: }! m, ]( ?* J/ ^    if(deda>=200){sec++;deda=0;}              // 中断200次秒加1,deda清0 0 T, u, W, [! k
    if(sec==60){min++;sec=0;}                 // 秒满60次后,分加1,秒清0 9 q1 H: C" G$ \; x
    if(min==60){hour++;min=0;}               // 分满60次后,时加1,分清0 9 y9 L- W0 v; O8 a+ b2 ^  a. p4 A
    if(hour==24){hour=0;}                     // 小时满24后,小时清0 */" D, U5 ?" @2 ?0 h, l
  }5 h1 a, a' P: f1 j. x

% J/ K! E0 P) Z5 O0 w0 c0 \5 m // ------------------------------ 走时时间显示函数 ------------------------4 X5 R; t5 _1 \4 v1 a+ `& t. H, Z

+ ~6 a- b* N4 e6 B# d // 走时时间显示, [% }9 H2 v& _1 h
  void disp()* R. Q: f' B% g9 I4 P% O
  {9 V+ I2 z2 h7 J& t1 ]: b
    P0=DATA_7SEG[hour/10]2=0xf7;delay(2);
" }* ~! U: ^/ C9 p7 J: s  O    P0=DATA_7SEG[hour%10]2=0xfb;delay(2);- Q7 T# }  l) l5 u7 R- i0 g
    if(d_05s==1){if(SET_2==0)M_D=0;else M_D=1;}$ F% d! g% Q* \6 c7 [2 p
    delay(2);
' u# F9 Z+ \% S$ W' ^    P0=DATA_7SEG[min/10]2=0xfd;delay(2);
0 x8 @& U% P1 N$ g9 N5 G- J    P0=DATA_7SEG[min%10];P2=0xfe;delay(2);
$ R$ z8 E$ D- T2 v/ d  y2 t) y) F  }
( O% x5 B3 ?! I- e( t* M
, z' `: D  [$ I$ m // ----------------------------- 调整走时时间函数 -------------------------/ I: ?  x3 ?, b. w5 K
$ j  ~, I8 z& N
/* 调整走时时间 */
7 q$ F# i' ?2 [8 _; I5 @   void set_time()
$ W* J& F5 P1 Q7 g6 [) S    {+ B7 U. T" Z/ j9 B
          uchar m;. K% ~) P% \  l: M& J3 f: h
          //TR0=0; 3 z% K2 c1 {1 d% `. g! m2 F& ~
          if(K2==0)delay(1);                      // 按下K2键,消除抖动  
) `, A; h& y- d* a    if(K2==0)hour++;                           // 小时数递增 4 j+ Q, h$ A! r) v1 {" Z- m8 T
          if(hour==24)hour=0;               // 小时数到24,从0开始 6 o6 T, b& \4 n6 w$ W
          for(m=0;m<30;m++)                 // 循环30次
/ J2 v- e8 n( L8 ?1 w& m7 g% W                {1 d) O) {; L6 m0 }4 U
                  disp();                       // 调用disp()显示函数 ) ?" O" m  r+ E8 |2 G; m6 N
                  if(SET_2==0)M_D=0;                   // 点亮U2小数点(秒点)  j: t2 Z9 r9 e! ^7 n7 S
                  else M_D=1;
! y7 o0 C: d5 }5 ~% w                  delay(1);                     // 调用delay(1)延时函数 & |8 F4 u3 w( E; }9 Q
                }               
2 D) a$ \  k# ?/ C7 Y          if(K3==0)delay(1);                     // 按下K3键,消除抖动
: Z6 {; X4 P0 [: t6 I* ^9 o* p          if(K3==0)min++;                       // 分钟数递增 , n0 ~' o5 b' O3 o# l  C- s; Y
          if(min==60)min=0;                        // 分钟数到60,从0开始 * y$ s/ k/ _! S, `' E  I5 R& U+ j
          for(m=0;m<30;m++)                 // 循环30次 % i8 Q' o$ N4 e! m. Z. i
                {" _: ~! E: J: v1 j: x5 a6 U1 _
                 disp();                        // 调取disp()显示函数   
6 N* v6 N9 G- [( z( ]8 W                 if(SET_2==0)M_D=0;                    // 点亮U2小数点(秒点)
* g3 j% T' i5 O5 N, Y+ _                 else M_D=1;- @6 N- x2 e' l3 b4 }
                 delay(1);                             // 调取delay(1)延时函数            
- Q; T5 C4 ]' Q; N1 V        }
' n$ I/ E' T3 \% ^# \' t8 K, J9 c+ z3 m8 t
  }
( s8 W# E3 [) |' O- K3 l6 `
2 }, U8 x+ g8 a: L+ Z6 D, V7 k( l // ------------------------------ 走时函数 ---------------------------------
1 I  K  i, d  H% J7 `9 k2 y8 ?$ ]# \% G: G
//走时
+ z/ `! Z4 v3 d   void time()              ( M% C7 H7 ^% p1 V3 g- b
  {                       - [7 L# B4 c7 w7 q
    conv();                                           // 走时单元转换
3 D. U& V8 S9 c    disp();                                    // 走时时间显示函数
; D+ E+ ^8 G6 Q& }  }                        
2 ~. F$ e3 |$ {  f: e: N
6 |2 s4 E& {9 K6 a8 H6 ~( g/ C // ----------------------------- 按键模式函数 ------------------------------
8 O# z7 r) V+ i) x
! F& s; D3 p3 P, w8 I  // 扫描按键次数% m8 G& S/ R, i: g7 [
  void scan_key(). C0 k  e: g3 z: o5 E
  {: E2 ]7 L) |+ g! X2 n
    delay(1);                                 // 调用延时函数
5 z- |( y! ~0 w+ \7 a! e6 ?) r2 _    if(K1==0) set++;                         // 按一下K1键,set 加1 ( i/ k) R  c9 N* b3 D" w2 ^8 ?( \
        if(set>=2)set=0;                          // 按两次K1键,set 为0
& [2 \2 r! R4 ]5 D: I0 f7 I    if(set==1)flag=0x55;                     // set =1,flag等于55H    6 g+ {# m8 u' \( D* z: X
    F0:if(K1==0)goto F0;                       // 按键未释放,在此等候   9 ]3 d1 e  D; A- n4 W+ X
  }
6 k9 }* Q  P1 E2 I4 z* o3 @0 Z( D" C9 `1 u( T8 H) ~
//------------------------------ 延时函数 ---------------------------------        9 C- u4 f: G3 w) `/ P+ P

% S: Z3 y& v- p0 y //延时/ _: y& o. n/ K; d  t
  void delay(uint k)                        // 总延时时间:1ms k ! F1 t) ?/ B$ P* @/ S! e
   {
# g' q" V3 E. \  U: w) E& C  N    uint i,j;                           // 定义局部变量i、j  
3 l2 ~+ e$ u% [5 C! y; T, C/ f    for(i=0;i<k;i++){                         // 外层循环
7 ]4 q$ q$ M+ [- K, r$ L: Q6 {    for(j=0;j<121;j++)                       // 内层循环
# K2 H; Y5 |& H6 ?8 T0 \    {;}}
7 @! ^. h' v3 ?. L   }
7 @* e/ {# `& P8 `" r
% L% @& J. D/ d//------------------------------- 发声函数 --------------------------------
' v4 h% E& ?( E; R- y; A9 J) Q# r3 H# S0 A
// 发声 1 C5 V1 {, J* T# D1 L* |
void  fs_d ()                                         9 r+ i& P5 W5 N5 A/ `& l
    {   
  O- h. d! H7 G& B9 K      unsigned int j,y;                 // 声明无符号整型变量j, y        # v, Q* t! B$ X' B4 p
       {                    5 c( X9 c1 ]/ ^$ f7 s9 L7 i, @- Q$ y
         for(y=0;y<1000;y++)            // 循环1000次,嘀响0.5s
2 @0 w! o" t' U! ]0 @6 i; [          {  , `* G1 Q* i$ x9 ^( d# o- b
            SPK=~SPK;                   // 反相输出
5 g+ b2 |8 Z6 X* \                for(j=0;j<50;j++);          // 延时500μs2 B/ G( R% a; |3 \: |1 c* l
           }  
  `: n- T' j  G9 e: ^* L) p0 J8 d& N        delay(200);                     // 停0.2s            
8 z8 A) j$ C: ^+ A$ z# H      }                                           5 z/ C7 f( B8 a! L2 u
   }
" `* R2 |- k0 J) Q6 M5 K  v; N+ w5 N6 w, ~" q! b
//--------------------------------- 主函数 --------------------------------) H, ?9 t, Z' P
. C6 c! {% |) U% p
  //主函数
4 g" X# F* z' D   void main()
; H; z0 C$ ~# Z5 E  s   {                             : T4 b' R* w; s6 |  A3 c; [
     init_timer();                      // 定时器T0初始化        
* j0 }# R* T( K: j4 [- N( o     while(1)                                                  // 无限循环
" R4 j2 [  p: w1 h4 f     {( Z2 c$ {, i9 p. O6 {' b) Q( _
       if(K1==0) , J7 \: ^, g/ ?- T' z0 Q* I& x
           {  6 n+ \( @+ [0 B4 ^; i( V1 i" I
             scan_key();                                   // 有按键,调用按键扫描函数   
4 ~. ?# c8 v4 z3 n3 D             fs_d (); ! R3 e3 }, y9 p. C5 f8 S+ @! ]
           }           
. F) V& L: U0 u8 Z3 P# G( U           switch(set)                                                // 根据set键值散转 1 H$ w- L% M/ [* f/ w8 j0 q' E
        {                        
* C0 ~  W* d/ k7 s, f1 U          case 0:time();  break;                 // 走时时间程序         
  j$ W# h3 f9 r, c" @4 T              case 1: set_time();break;     // 走时时间调整
6 Z( e- _5 }+ H8 |5 e. S          default:break;                                // 其他,退出   
3 j/ a; C! m/ P( s# P6 I1 R: e6 h        }                                                  
9 b4 Y+ O  e5 J0 {% \  B  F% i       if(flag!=0x55)                                       // 判断掉电标志            
2 U6 a* w; e# h' L- e& i1 v        {         ' z( z: G2 H& f; }9 }8 G. q
         P0=0xc0; P2=0xc0; delay(200);        // 点亮4个数码管  
: L3 z# x4 @- [3 e8 D4 ?             P2=0xff; delay(400);               // 熄灭 4个数码管                                  4 w% |9 U3 ?" Y, d: T
            }
, M3 W- A  v  ?: p1 }           }0 N; g# ?( f' d8 |
  }
5 w0 z$ M0 _5 }$ {
. w+ |: G. e2 i, c  p…………限于本文篇幅 余下代码请从下载附件…………( H& o2 o* Z. q8 a. T

1 K6 \9 s! e$ x下载:6 [0 J, K3 \) E6 z$ _& q( N9 @
游客,如果您要查看本帖隐藏内容请回复

1 T5 g  w7 s3 H7 l9 K

: W- k+ d: T0 V  U3 [
7 s: w+ F, c7 Z

该用户从未签到

3#
发表于 2019-5-20 11:13 | 只看该作者
学习学习·
+ @; ?$ ~+ D1 ~* _, g" Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-12 15:49 , Processed in 0.203125 second(s), 26 queries , Gzip On.

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

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

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