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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机数码管单片机时钟实验 C语言和汇编语言2个程序8 G8 Y' B2 L( t1 U& G8 C

; Z- a1 P6 C. E8 ^$ W) M6 W# z
3 i6 P1 W& K7 J# ]) ^% C
单片机数码管单片机时钟实验 C语言和汇编语言2个程序 还带Proteus仿真/ I8 ?2 c: S  |) Q4 f' |6 }
单片机汇编语言程序:
6 z" ]& e/ ~/ s7 d
/ V( L& H2 y8 ^

, C" G5 X, Q) A0 [& z;-----------------------------------------------------------------
5 U- `4 e7 k0 h: \4 Q" C ;文件名称:SZ10-3.ASM  h& T' m9 S8 }* v( {2 W& E
;程序功能:带倒计时的闹钟
- S0 r& R# F% ^& d3 F$ u& d ;----------------------------------------------------------------
9 @0 ~6 A* V1 d* Y;******************* 闹钟(含插入倒计时)程序部分 *******************6 x% ^1 V$ ]' J) C9 R

% a# t" A6 T- m6 a/ f" v4 |# D4 @

% X1 {" F) H, s ;----- -------- 程序初始化 -------------
. K% Z# w; @/ y) |+ | ; 定义存放计时单元地址
" `' i- _4 t: N  b/ k5 A. e         ALB           EQU           20H.0     ;闹铃设置标志   
5 h7 I& c3 f; j- n5 s- \2 K         BUF           EQU           30H       ;30~33H 连续4个字节存放显示器数据
& G0 N) U6 N/ J( r: W         HOUR              EQU           34H       ;存放小时变量
  e+ a: `$ P5 c( d         MIN           EQU            35H       ;存放分钟变量7 Z; G& z3 t2 ~1 \+ U, u# z2 I& ?. k
         SEC           EQU            36H       ;存放秒钟变量) s& \8 C( x' V7 D, E
         DEDA              EQU            37H      ;存放5ms计数值1 h6 I/ Y8 `+ \- F
         HH            EQU            38H      ;闹铃设置小时变量/ j3 A/ A5 U# k& v0 H1 ^4 V. w
         MM           EQU            39H           ;闹铃设置分钟变量6 Y2 v; X2 w5 x/ g0 B6 b
             ;………………………………
+ M% r* H# ], |( n& R             SEC0           EQU    3AH    ;存放旧的秒数
8 g8 U( d% p- ~: k1 k$ d) A             MM_D          EQU    3BH    ;倒数时间分钟数
$ i' i- x* P- X             SS_D           EQU    3CH    ;倒数时间秒钟数5 L: Q: k# p0 _' a
             ;………………………………6 i4 o, B; k' ]: g- z" X/ ^% M( p
  ;按键输入引脚定义
: @9 ^+ c/ v, a3 W  C% F' n          K1          EQU            P2.4     ;按键K1引脚定义
1 o, m- {( o4 G          K2          EQU            P2.5     ;按键K2引脚定义8 p8 }& P& P4 V+ ?% J
          K3          EQU            P2.6     ;按键K3引脚定义$ e/ L' U5 l6 |; S; u* B' j4 M
          K4          EQU           P2.7     ;按键K4引脚定义& W5 f. Q- w' |' U. f8 c

1 ]& i0 g9 ]- I0 B2 b/ g5 o. p ;蜂鸣器和指示灯引脚定义
8 o  T+ A* s, U+ r7 m         SPK           EQU            P3.7    ;蜂鸣器控制信号引脚定义
% i" m: |& d1 T+ e; w; [' W. y         WLED          EQU     P3.0    ;工作指示灯引脚定义+ K7 L8 z; e6 Y9 b3 @9 Z. {& y
) S0 v+ X! S$ l+ G: j
;程序开始执行地址 + o  U% `' h2 t( s) Y0 ^
         ORG       0H                     ;程序代码由地址0开始4 n; n& m2 k) J# z
         JMP       MAIN
* o6 }6 D0 h0 J( F# X         ORG       0BH                   ;定时器T0中断地址设置9 t6 o2 _$ ^  O3 y4 i
         JMP       TO_SRV" J# {  T3 @/ p* m. U

$ X( Q6 Q9 F: x
  v3 }- v3 r, C  e( n& }) Y0 r; `
;-------------- 主 程 序 ------------
% L1 m7 b: n' y , [1 B+ c+ p9 D4 G& H. ^
  MAIN:                                           ;主程序
8 ?* h0 V* D# {) u$ X7 M$ B$ r7 b         CLR       ALB                   ;清除闹铃标志   ) a3 U2 ?+ I8 @+ R+ i' g
         ACALL     BZ                     ;蜂鸣器连续两次鸣响5 P8 S" Y# i# q, i& ]
         ACALL     BZ          $ s7 G9 ?& S  s7 l6 O
         ACALL     LED_BL                ;LED 闪动,表示程序开始执行
, E* i8 a! ~+ X- r2 F         ACALL     INIT                   ;初始变化量5 A' |- n) i7 ^# o6 N
         ACALL           INIT_TIMER            ;设置定时器
' O6 b* B8 G$ g& N
$ [& u% p5 V( _( `+ a5 R) ]( \ ;加载显示器初值数据  y  i; J  E. ~
         MOV       A, #0C0H  
: [% w+ r$ g  ~         MOV       P0, A    . B  W! J% R9 s% t" \/ A$ Y9 w
4 ]; g( j2 n( b6 E
  ;无穷循环
3 Z/ N: k. W! k% X7 z, E' v+ ~  LOOP:                  
0 P2 J9 H7 j7 r/ o  c6 u3 o) L, X         ACALL    CONV         
4 W0 @  \1 j8 \: I$ Q- n) w         ACALL    TIME_PRO              ;检查闹铃时间    , F( h. U8 I1 c( R& \6 G
         ACALL    DISP                   ;扫描显示  $ X, e/ f4 x5 V( i

$ V# i* E( y6 _* C4 X

: _3 P, l5 B/ A% S  ;设置走时时间* B# B) j) F$ m# j
         JB         K1, M1                 ;未按下K1键,则继续扫描
5 o. R, f! L* B( V0 x( k8 p' E6 F         ACALL     LED_BL                ;LED闪动/ y: q, J( Y7 L/ [2 J+ P6 D$ d
         ACALL     SET_TIME              ;设置目前时间9 Z* b8 C$ ^; W& b1 O$ k
         JMP        LOOP                  ;跳转到LOOP处运行
$ i8 l0 n3 {9 B0 o, R    ]  u( Z% e( F" E
  ;设置闹铃时间
; r( U/ c( e. u8 c1 T  M1:    JB        K2,  M2               ;未按下K2键,则继续扫描
$ n4 R0 A+ h% W/ d         ACALL     LED_BL     * o& N0 |& E( b$ z# A
         ACALL     SET_ATIME            ;设置闹铃时间# W8 U# p' P* `; h6 k
         JMP        LOOP                 ;跳转到LOOP处运行3 [: f& e$ T. K0 G: s
  - U5 H0 u% @8 P$ F0 l2 `
  ;设置倒计时间, g" Y  I. w. y3 ~9 ^+ F4 w
  M2:    JB        K3, M3                 ;未按下K3键,则继续扫描
/ ~; s  k, T  }6 Q# W/ O: Y& `0 ^        ;…………………………
, F, K  f0 S2 t% E! \, ?              ACALL    LED_BL / m& C- z, W3 C2 r; f9 L# C! _
              ACALL    DOWN_ATIME  ;设置倒计时间# f* J: N& _$ T: M* R- W3 Q2 ?2 J
        ;…………………………
6 k% @- q% I$ x# q5 U3 h. V+ H          JMP             LOOP                   ;跳转到LOOP处运行
4 c! N' n/ ?% }! Z# G% X* [  
* `3 Y; m) N$ P. m5 s; {9 v  M3:    JB              K4, M4                  ;未按下K4键,则继续扫描2 T7 c5 T3 M# J* Y
         CPL             ALB         7 D9 }/ @& W2 J* g  V$ z
         JNB              ALB, M314 h/ ]$ Y2 g  `7 V# H/ q0 d, q. @6 ^! j
      
8 ]! A" \* O' S+ O1 p" k, D  ;闹铃启动连续3次发出响声" G" u! W9 T2 u" B3 w
         ACALL     BZ
. y5 Y  ?4 q" t* r$ g7 ?4 D         ACALL     BZ
$ D' B5 ]4 {/ \2 u         ACALL     BZ
! N4 a: o5 ?, p         JMP       LOOP                   ;跳转到LOOP处运行
! C9 }+ I, w3 o* v! ]0 m
) D" V0 r6 z: y7 n6 c( b" R  d7 y, g
0 O" r9 |8 c  f. [! @7 G* w5 l
  M31:
( ~- c, R+ w4 Q/ w/ e& `/ R         ACALL     BZ                      ;闹铃停止,发出一声响
/ e" k* F, P, a. e9 \2 ^         JMP       LOOP                   ;跳转到LOOP处运行
# j. k' A; \4 B" |2 b
+ T7 j, S# @- q! D0 P) o! X! v; g

; O& a7 u4 a4 \  M4:4 o3 ?5 [/ F8 f' T! K; ~0 @
         JMP       LOOP                   ;跳转到LOOP处运行0 u- Q2 ]/ j/ m5 V( I* B- O

( V' y5 \8 D# \- x/ h3 b ;----------- 实现走时功能的子程序 ----------: ]* X8 a, V/ I1 _2 z9 J
8 g3 B, `; c6 i$ n1 b

9 }+ ^. q' Z/ q  i7 _/ ~$ u  ;使用定时器T0模式0计时
; l7 ?  T8 x$ w   INIT_TIMER:                            ;初始化定时器,使用定时器T0模式0计时$ C4 }* o5 h0 i2 S! {
         MOV              TMOD,#00000000B        ;设置定时器T0工作模式00 m/ u) E- S3 t5 W" d
         MOV              IE,  #10000010B        ;启用定时器T0中断产生
( G4 T3 B( J8 q# T2 k8 x) {; {         MOV              TL0, #(8192-4900)MOD 32  ;加载初始化数据$ W: C  k' i& `6 n; R; V
         MOV              TH0, #(8192-4900)/32     $ L# r) ]1 t* m; i- @; j3 ~+ ]6 V
         SETB     TR0               ;启动定时器0开始计时
' v* ~9 ~: P3 t" z  ^8 z         RET
3 p+ _8 R# @% N ;-----------―――
! _2 C) R" H6 x5 T3 ~5 B6 `' [. @5 l/ y  ;中断服务程序$ l) l% n. B! n. R' H1 x$ M
  TO_SRV:                                         ;定时器T0计时中断程序每隔5ms中断一次" N: d* `) ?+ Y, }3 o& `
         PUSH      ACC                    ;将A值压入堆栈
4 y9 M8 ~3 S5 A0 J5 X! p         MOV       TL0, #(8192-4900)MOD 32 ;重加载初始化数据
) n& e* d9 b8 ?2 d         MOV       TH0, #(8192-4900)/32   
, q$ D# `7 }; c3 _$ {: y% i         INC       DEDA                   ;加1    6 t$ Q$ E+ f! a! n1 v$ k, Q- X, O
  ;秒输出
. Z+ M, w/ m# B        MOV               A, DEDA; |, t' H- b! a/ R
        CJNE      A,#200,TT1              ;是否1s到了; z8 b% G( K4 P9 Q6 W; W1 l
        MOV               DEDA,  #0              ;计数值清07 x2 N; S) N: y2 r# t
        CPL              WLED                   ;LED灯亮灭变换" ^0 X) _$ u; \& Z# Q/ n
        INC              SEC                     ;秒计数加1
# b6 v6 }( i  c: |: z& g        MOV              A,  SEC2 M5 E7 t- M3 {0 n$ y( o8 w" T
        CJNE      A, #60, TT1           ;是否1min到了5 d0 [. }% V) H% N' i% E2 K
  ;分输出- T8 ^, T2 c) g: j+ [# F$ G& n
        INC               MIN                     ;分计数加1
. {# b0 ^/ O1 K0 N' b, x3 i        MOV              SEC,  #0                ;秒计数清0
6 `- a  k9 ]( q9 i& h; ]+ ~7 m        MOV               A,  MIN
4 J4 X& L( C' [, E+ O        CJNE      A, #60, TT1            ;是否1h到了/ t( A. [  Y0 p8 J- g1 b
  ;小时输出& N% y* z6 H) P8 C- a3 L
        INC        HOUR                   ;小时计数加1
5 s3 s3 Q& A' F8 e. X/ L        MOV               MIN,  #0                ;分计数清0
) D8 m" u0 g9 g4 F        MOV               A,  HOUR
1 [, x5 ~$ G" Q& A# ^8 ^        CJNE      A, #24, TT1             ;是否24h到了
8 D0 {, Q# X, a7 R( T' }2 p        MOV               SEC,  #0                ;秒钟变量清0
2 {+ l: P. S! H2 J        MOV               MIN,  #0                ;分钟变量清08 c; f6 H6 `2 a, I5 G2 l8 e) }
        MOV               HOUR, #0                ;小时变量清0
" o$ i" H( b/ R5 G  TT1:
- F6 H/ g/ w+ `        POP               ACC                    ;将A值由堆栈取出
. Z' u1 Q3 c) l- q! R        RETI$ F7 `8 }8 ~, G1 Q
( G; T. M! N7 |; V# Q5 D8 b" O5 A

& Z( \6 _; U& G) z ;------------- 实现显示功能的子程序 ---------
% f' R0 o1 f" b2 h8 Y! c. z& A9 L' A$ ^& `+ y" u
) A; T5 x) N, B- P6 J

" R/ R  @3 n% H& B  CONV:  q' j- r+ f) A! [9 w& K
  ;转换小时数据! q) @: g. c; a6 }+ x
        MOV              A,  HOUR/ [+ [2 k/ x# S7 A* Y, I# X, `! ~
        MOV               B,  #10) I6 u- ]2 e( R$ c: g1 Y; ^( ^$ x
        DIV               AB" R4 W8 n0 _" {8 p: J
        MOV               DPTR,#TABLE           ;查表转换
" I' i  e4 v8 ~( z* Z        MOVC             A,  @A+DPTR: r* e5 [5 c2 z1 h6 z0 ~) t
        MOV              BUF,  A
* W* [. u2 a1 i) d0 K! R1 _$ \        MOV              A, B
7 R* d+ F- X- f        MOVC             A,  @A+DPTR3 }, d# u& B- b8 E+ L9 b+ [" Z8 Z
        MOV              BUF+1,  A
+ n( e( ~/ S) k0 D$ M0 _2 [  ;转换分钟数据
9 d7 m0 ]$ q1 I' }& |4 i        MOV               A,  MIN
) Q/ t# _0 Y' A% X        MOV               B,  #10# i4 K  j$ p4 ^
        DIV               AB: C0 ]% w# [3 O' t+ T2 v
        MOV               DPTR,#TABLE             ;查表转换4 s; |" W8 J0 t( F
        MOVC             A,  @A+DPTR* H7 U0 u& n# q8 J
        MOV               BUF+2,  A
" L% g* P" _6 {. }        MOV               A, B: \( x2 v- _$ \, T2 j
        MOVC      A,  @A+DPTR
& X. O4 ^/ l9 p        MOV               BUF+3,  A, X+ n2 U! S8 U9 J/ s& D4 p
        RET
$ r/ G2 U+ K* e4 X: \ / i6 H. [; Q9 l+ q
  ;字型数据编码表3 b& @1 y$ t2 p7 t
  TABLE:
3 \# U$ R+ a3 h        DB   0C0H,0F9H,0A4H,0B0H' |" X. ~# ?3 L' M
        DB   99H,92H,82H,0F8H
! C" b* ~. j* L4 J; J        DB   80H,90H,88H,83H
& Z* L# G8 F6 _% R        DB   0C6H,0A1H,86H,8EH
. X9 F& p) I4 a! ^3 Y; a$ I/ r
8 L; Q( r, Q! _+ t ;-------------- 扫描显示子程序 -----------% Z  |& m) b. k/ k, x
  ;扫描显示- Z9 ]1 D0 g) G; ^  b5 B
  DISP:% C4 g7 Q; n& Z  I8 ]
        MOV               R0,  #BUF               ;指向显示器显示缓冲区起始地址8 }. ~5 n; ?1 O+ P0 @9 F* |* h8 Z
        MOV               R2,  #4                  ;循环执行4次( j" m" F# B7 D& L- \
        MOV               ACC, #11110111b        ;加载扫描信号初值11110111B
" u( F" z2 J" ^/ G/ [6 a  S1:5 a$ ?" G0 R& I
        PUSH      ACC- ?" x9 i& X; I3 ]
        MOV               A, @R0                 ;取出显示器数据
; t9 C1 x  b9 A. S: X        MOV               P0, A                   ;由P0送出一位显示器数据
6 ~- ~$ Z' N2 C; f; E% ]3 S        POP               ACC2 I0 g! ?0 F; q0 }$ R
        MOV               P2, ACC                ;由P2送出扫描输出信号  * J3 [% Q7 h0 ^
        MOV               R5, #2                   ;延迟一段时间
- |: ?2 J" g3 O- t7 R& E        ACALL            DELAY) U3 l( |1 P" ~9 F5 }& b
  ;改变扫描码 EX:XXXX1011   ?& ~2 S: q7 ?2 d9 p/ C6 y* {
        RR                A                       ;累加器A向右移动一位
+ y: q) G! ?6 }0 C' d# G  r        INC               R0                      ;显示器显示缓冲区地址加1
* _/ V: `7 s6 k. m5 s2 n1 h/ Z        DJNZ             R2, S1                  ;判断是否继续执行循环
0 G$ J9 k" i! f- T        RET; x: s2 q% J0 j/ }4 I+ c
3 a  @8 T( F0 w: l; L- f3 r; R
;------------- 实现调整时间子程序 -----------
9 d* S. u$ f  E8 P: L" Z* |
7 W, v$ M9 S0 ^, B
% a9 p/ _! g! v$ @
;设置目前时间7 r% u6 j* {8 G8 t+ @! P
  SET_TIME:
2 k. ~; w/ i$ P0 j        CLR              TR0                     ;定时器工作暂停
1 ^$ s% j5 l0 Z# C- h9 T" l6 @( G        MOV              SEC, #0                  ;秒钟变量清0
5 A9 c! P. F, x) |9 d. m  L0:6 v  }/ W( \+ b" [1 j( K4 S" \
        ACALL     DISP                    ;扫描显示% k1 q8 k! y2 C) G+ q
  v+ x/ L& ]. R9 j0 M
        JB        K2,  L1                ;未按下K2键,则继续扫描7 j2 t  B0 W/ P/ T: m" \
        JNB               K2,  [        DISCUZ_CODE_2        ]nbsp;                 ;按下,则等待放开
4 H$ u& {9 W* k2 o  e' j  U   ;K2小时调整   
) K& A9 e! J7 A4 f$ j6 y: D0 p( A        INC               HOUR                   ;小时计数加1' ?& e1 t% w+ m  q, z( ]2 I8 O$ T9 d
        MOV               A, HOUR
$ O0 v5 b+ C5 m9 C- U        CJNE      A,#24, L11              ;是否24h到了
. j  o1 \' M  W        MOV               HOUR, #0               ;小时变量清0
8 d% {/ P/ h% R" c) B  L11:
3 u( i# ?9 d2 D% t6 T/ ~3 B( j        ACALL            CONV                   ;转换显示数据
6 K: D5 k6 W/ x5 l3 Q; s        ACALL            DISP                    ;扫描显示
' T9 _) V- q. r/ A: D3 N        JMP               L0                      ;跳转到L0处执行
& b4 g. Y" {0 {8 a) A+ U 6 p/ q2 ]+ U  Y4 h
  L1:   JB        K3, L2                  ;未按下K3键,则继续扫描
5 J  f+ |* L$ X- `        JNB               K3,[        DISCUZ_CODE_2        ]nbsp;                   ;按下,则等待放开* M. }$ _8 e# a6 F! O- x! k( ]2 A
   ;K3分钟调整1 p/ T& R7 k" O4 j7 o
        INC       MIN                    ;分钟计数加1
2 ]0 X4 A1 }. a        MOV               A,  MIN $ e0 }% h  O( h2 t5 k3 ?
        CJNE      A,#60, L21              ;是否60min到了7 W. J) C7 ?2 U9 @9 `
        MOV               MIN, #0                ;分钟变量清0( h/ s2 h' [* r- k$ W% D6 f
  L21:
/ p0 O" ~, H2 q        ACALL     CONV                  ;转换显示数据
; n% z6 V# ^+ Z! W0 L" X        ACALL     DISP                   ;扫描显示1 `1 S) p8 Q2 ?$ X; d
        JMP       L0                     ;跳转到L0处运行
# i' h1 R7 p- M! K: S! m9 L1 L: S' W % Y' p- @/ S2 Y7 n/ Y4 k4 P6 i
  L2:   JB               K4,L0                  ;未按下K4键,则继续扫描  G& m6 i" q2 j% h% b
        JNB               K4, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开2 d4 @3 I  ]/ |; d6 K
       ACALL            BZ                     ;蜂鸣器鸣响一声+ n7 V3 C; [0 a" Q+ H- M4 n
  ;K4设置完成3 C& V6 ~' b: D/ W: H' Y
        ACALL     LED_BL                ;LED闪动/ p1 s2 [. l4 @6 K- v) _. [4 F
        SETB      TR0                    ;启动定时器
& z8 s( H7 X; J; ?9 h; @) `        RET
3 y; y9 J! \( M/ g3 ^
# a2 l# d5 z9 u6 T9 B, {

" A" ?( D' o, H" ^9 G  b ;------------- 计时单元清0子程序 ----------- G+ s# d2 f; S  o. {, K
; v! k2 R* n+ b4 ~
; |) t5 T' t1 k9 Q3 C( |
  ;计时单元清01 O2 E" h2 y/ C$ m0 c- e, e# [
INIT:              5 L5 ]# f, K2 n' [- N$ @0 M6 T
       MOV               DEDA,         #0            ;5ms计数值清0
3 R) N* X  v8 r9 f) C8 m$ U       MOV               SEC,           #0            ;秒钟变量清0, f2 O( S/ P# @/ a7 d
       MOV               MIN,           #0             ;分钟变量清09 Z3 ~- j; ]9 d8 }2 B4 K) l* O
       MOV               HOUR,         #0             ;小时变量清08 Y' w; g$ c$ \- W; k& o
       RET
/ l. w- Q( V6 U5 Q0 `  t; ~; a7 J5 _: H' Z
6 ~5 d" }  P) H. Q" u% P2 m
; ------------―蜂鸣器鸣响一声子程序 ----------
0 E$ b7 ^+ M! L  m) P6 h6 B ;蜂鸣器
, u; r1 u, h9 ^, ~, A* _) i  BZ:                                ;蜂鸣器鸣响一声
: c' u6 Y8 j4 A2 A8 e, ]/ F- J6 J        MOV       R6, #250
1 [: I4 n  x" n* j( d  B1:   ACALL            DEX
% f$ w9 s" \4 }" l; c4 q# G        CPL               SPK1 g" z  S+ C& M- E8 ~7 h
        DJNZ      R6, B1+ z, s: g8 V: M1 b% c% D; y, @2 o5 h; Y
        MOV               R5, #50
0 _& {  g3 d% [" y        ACALL            DELAY7 F& s. I# M% T* `# C8 r8 s
        RET' m1 y4 F+ {# R8 [9 S3 |) E4 `8 [* i
  B: |- j0 z- X
;-------------工作指示灯闪烁子程序 ----------: h% J* B8 w6 `! V
;工作指示
/ |8 c/ x) b; @1 V. O  LED_BL:                                ;工作指示灯闪烁
& n& \/ N! Y8 h# u! Y# j+ W        MOV        R4, #6# y6 s% e8 T( W8 `
  LE1:  CPL       WLED                  ;位反向
* e; d5 w5 ?+ N- U        MOV        R5,#25
: W, K. G8 I2 C! n. l! t& c7 m        ACALL      DELAY            ;延迟50ms
2 W! _- ~( o4 l# ~/ r- X  a        DJNZ      R4, LE1         
5 o) I* B+ C! l: x8 u, N5 Y2 N. M4 T        RET
# ~# e; O" J1 t( Y# h+ q
8 J9 p$ a! F* t0 d1 @. t5 v
9 x& v8 M0 j! L0 ]# V0 m+ T+ i  A
;-------------- 延时子程序 -------------+ w+ V4 g  ?! z+ S. X4 r2 P
" h( ^0 ~- v7 {* c

1 z; R6 f% l2 t& `1 X' }: R6 q( W  ;延时子程序) l# z! I/ T5 T$ [5 w, h$ Q) \
  DELAY:                                   ;总延迟时间R5 2ms/ L& z0 |% y& O) L) j/ L
        MOV        R6,#10
- v" C) e( s1 f  D1:  MOV         R7,#100( P; E5 d* o( L2 i1 y
        DJNZ       R7,$
/ F1 D  B2 q& b        DJNZ       R6, D1
4 g; g* S) q: {% L5 F+ \- q7 _        DJNZ       R5, DELAY) z7 z" q" F! {1 L) w; Z5 [
        RET
; t) F4 ]) v4 f3 v2 ~) O% ~ ;------------ 蜂鸣器短暂延时子程序-----------+ f/ l. \( J( @- G
  ; 蜂鸣器
. s  E- _; ?4 ^* q  DEX:  MOV       R7, #180               ;短暂延时
8 ?2 c# S# q6 d  DE1:  NOP
8 y/ F2 T2 y0 F& u/ [' W         DJNZ      R7, DE1
' z/ Q  l/ f! V" u) L- X+ k         RET4 a1 |4 t+ [- \( W* D

/ _7 l( K( D( b& W. j1 c
0 ~5 l0 c9 ]- d
;******************** 增加定时闹铃程序部分 *********************+ P" U' A5 k# v6 O, l
( R8 H4 s; w. @

3 e8 E3 E& l6 K7 }& {+ y ; ----------- 设置闹铃时间子程序 ------------, {; N* u$ G$ j
;设置闹铃时间
+ ~8 |' G% x5 ^/ I  SET_ATIME:
+ I) }5 ~3 x4 u7 }2 _* {# l         MOV       HH, #06 C: I5 p  r0 }9 U0 K4 V
MOV       MM, #08 j  y" D& J& _- g7 D5 g
ACALL     CONVA                 ;加载闹铃时间数据
& c) O7 i# i/ r2 e  N0:7 b4 K2 {3 `6 z2 u' z" ^
         ACALL     DISP4 o5 o2 P9 l% S. T, u( X, D. n
  ;-----------  X; q' ^5 J4 h5 L
        JB         K2, N1                  ;未按下K2键,则继续扫描
! Y. }0 R; J7 w% ]8 H1 Y1 v1 }        JNB               K2, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开
4 ]9 B. q, h4 R* @ ;K2调整小时
. D. k% _0 [( r6 d' ?# f6 j4 [        INC               HH                     ;小时数加1# m' o" l, X/ i
        MOV             A, HH! f9 p  ?% c& a  I* x# z7 C8 g9 C( ]
        CJNE            A, #24, N11             ;是否24h到了
; y% S  O1 b! L" `% E# _        MOV       HH, #0                  ;小时数清0) h# H  s! j2 @3 {2 I5 s
  N11:; d0 V/ f% j: A& C) S7 z  ]2 B. y" s
        ACALL            CONVA                 ;加载闹铃时间数据
# x7 b8 s$ t0 u3 B0 e# w        ACALL           DISP                    ;扫描显示" T) e  G4 c% ]  G
        JMP             N0                      ;跳转到N0处运行
9 W( q9 j) f9 C6 J8 B8 t  ;------------
0 Q/ Z7 W( w7 m  N1:   JB               K3, N2                  ;未按下K3键,则继续扫描0 `0 W$ h" h! e$ x0 _- m% T+ z
        JNB               K3, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开
* N* a/ }7 j; k ;K3调整分钟/ P6 v( h- q1 ^. T4 H6 K) X! L! k; S9 e
        INC             MM                           ;调整分钟数$ k' \3 m$ U( p8 V  r
        MOV               A, MM                 ;分钟数加1
7 C7 x  L) G7 m+ @' G6 R$ ?$ H  n        CJNE      A, #60, N21             ;是否60min到了3 P) d: i; l) ]- }+ o
        MOV               MM, #0                 ;分钟数清0+ Y  M- ?+ G: v6 N- z9 R8 i' M. L
  N21:2 q8 ^2 |" E: u; H$ h4 R: K
        ACALL            CONVA                ;加载闹铃时间数据) Y( R* f% x1 P) T7 G: @
        ACALL            DISP                  ;扫描显示4 w& L# @, a! u. M: F3 M! p
        JMP              N0                     ;跳转到N0处运行
" V  n9 u1 y' l4 D) X  ;------------8 u! p1 C5 V* c* V/ I$ q
  N2:   JB               K4, N0                  ;未按下K4键,则继续扫描& C, P/ s- d% w! D1 R  p
        JNB              K4, [        DISCUZ_CODE_2        ]nbsp;                  ;等K4键放开
. j* N: v3 z: @3 \  ;K4设置完成
) _: E3 d, n  M( G9 B4 s* B        ACALL            LED_BL                ;LED闪动
( Z9 m+ u/ Y( x6 ?        ACALL           CONV                  ;加载现在时间数据& n1 o( r8 D# v& t  S& ^) j
        RET2 ~: I4 e& m( M

$ x5 ~4 _- a! @- H+ M

% C/ q+ X& k' U" U. z* i' g7 l ; ----------- 加载闹铃时间数据子程序 ----------
( D; m* {1 I  W: c& R0 n- Q1 J- J# e: v7 R4 T
; d( [) g# C) C" S& q# E

; \/ h+ o, q. O4 F  CONVA:
6 v+ @/ u7 C6 |0 A$ N0 S3 _  ;转换小时数据
+ @+ L- p5 b. \" F9 r+ B        MOV               A,  HH7 P2 K& y2 p$ `+ f8 v) o
        MOV               B,  #10
- S* y+ E- S+ \* l9 X+ B$ y        DIV               AB
# z3 N& }8 a& q2 @/ o  ;-----------
4 C6 p9 T$ Z9 v! q3 m        MOV              DPTR,#TABLE           ;查表转换
8 e1 @4 D5 d9 _; s* V- r  T6 i        MOVC             A,  @A+DPTR
: Z" l4 z; g, w- Y- Z# m( v        MOV             BUF,  A3 j1 M4 C( Y. v7 `& s: ^
  ;-----------) u" g; W  Y- g6 i% B! D
        MOV              A, B  J9 Y, m" T! o! C. s% f1 S
        MOVC             A,  @A+DPTR8 j; X7 l6 k& P3 F3 M
        MOV              BUF+1,  A; O* j, H# v/ `2 ?; S+ c7 A1 p
  ;转换分钟数据
2 D1 m( W5 q, r/ G% A        MOV              A,  MM
' W7 ~9 k" k1 j        MOV              B,  #10, j. `& }& T8 d+ \# u/ O) l+ u
        DIV               AB
: T. n8 N$ k2 A  ;-----------
8 p& m4 I0 I5 \, q$ N! l        MOV              DPTR, #TABLE           ;查表转换2 b- @& i9 j% i/ l& e+ N/ s3 }7 v
        MOVC             A,  @A+DPTR3 s* D4 @% p: j
        MOV              BUF+2,  A; s/ c9 g. V" S$ B! X8 I
  ;-----------
  K5 R# j) I1 m0 C/ s* Q        MOV              A, B
: I  |- `5 \; T7 ]        MOVC             A,  @A+DPTR- v* d8 Z) |+ k& L6 O8 Y
        MOV              BUF+3,  A9 Q/ F" x5 H4 W6 s; s. c0 y
        RET
. z3 U1 U4 j+ p9 n/ ~
) p- y/ n$ [  Q+ n. u ; ---------- 检查闹铃时间处理子程序 ----------% O1 X% N0 [' u& x
, b9 t( w+ _; y! d1 p
- _* p) q% T9 W; ?
;检查是否启动闹铃
  @2 B9 g1 S. q$ v5 X/ d+ @$ n  TIME_PRO: + e* a7 u5 ?. h( n, K6 t
        JB        ALB, TI36 u4 ~' y1 K) A8 c; ~; @
        RET& ?) v: j0 M: A
; --------------+ N1 S, j) ^6 Q5 s, O" D% f
: T9 j/ A- J0 a% f. v+ m  u

" a; T4 @7 l* K# X' s; S# ?; T8 Y ;检查闹铃时间是否到了$ R" z; G/ K9 J- c
  TI3:
' d/ K! ]! F9 {: B) l8 w        MOV              A, HOUR
; [. V/ [  w  Z+ r- r; s        MOV              B, HH
1 d! N  Q9 \5 b  I        CJNE             A, B, BK                ;检查闹铃小时时间
% ]+ N  J. J- w3 Q- m- G. [: @0 R  ;-----------4 F' q# D& h% X' U: X1 ~- F
        MOV       A, MIN
1 F# S0 c/ ]2 c2 b- _5 F- e9 c        MOV       B, MM9 {" b  }1 g' \  z7 c8 y
        CJNE      A, B, BK         ;检查闹铃分钟时间
! n! Y# S3 g) V. \   ;-----------
9 c1 F+ q# Z: O" I! p% Z        ACALL            TIME_OUT              ;调用执行检查闹铃时间处理子程序8 c; `$ g0 W. U% X
  BK:
8 x3 m/ k2 i. g( V        RET
2 L1 F; X- m9 y+ J: n) f
+ l5 T8 x& R# t4 d7 C
; [) f6 W. U2 m1 V2 A& I
;---------- 执行闹铃时间处理子程序 -----------
' [- D0 Y' x; O2 N( O3 Q. f- Y/ ]/ F' w/ N

' P4 S$ X" |* v- I6 Z  TIME_OUT:                                ;所设置的闹铃数据到了
/ c+ I- G( ^' `: y   X1:  ACALL           LED_BL                ;LED闪动) C3 G, p) N9 Y! i! f& T2 d
         ACALL           BZ                     ;蜂鸣器发声& B8 T, O, e# T  g: B8 O
  ;按下K4键停止闹铃 9 E/ `/ ^2 v+ N; S+ O
         JB        K4, X1                  ;等待是否按下K4键+ P. P- r, k1 k$ H* R" _
         JNB       K4,[        DISCUZ_CODE_2        ]nbsp;                   ;若按下键,则等待按键放开
$ h6 ^# L2 V6 q5 S( M         ACALL     LED_BL                 ;LED闪动
8 s2 u+ c6 M' v  e0 x9 s         CLR       ALB                    ;清除闹铃位
5 B% X  h  M# B/ w" E         RET
0 ^* X+ X% H  S- ]& \# ]7 J4 ?; -----------------------------------' f: U8 }3 }3 T3 K1 w
     - `  C5 e, a# u" e7 |
;******************** 增加倒计时程序部分 ***********************
! w( m- i# n& `% x2 ~' l3 \3 F( k9 h! F4 v/ H
: c/ A/ `' x& `- P" N# k
;----------- 设置倒计时时间子程序 ----------  j2 ~  z) |0 L. M) A
;设置倒计时时间
8 @# @1 I( g" V4 i4 K  DOWN_ATIME:# @+ _2 \0 A$ o+ q7 }
         CLR       TR0                     ;定时器工作暂停- x. C+ u, V4 ]. U. D. P. F- u/ p1 O
         MOV       HH, #0
; T# ]- O- Q3 m+ c$ o# ^         MOV       MM, #0
& i, \+ D% C9 |, M6 gMOV       SS_D, #1         ;秒钟变量为1
/ R! U8 k3 Z9 g9 g/ v/ Z! u* ^  S0:
- S% o4 Q/ }- \) h/ E" L$ _$ h3 I' X( R        ACALL     DISP                    ;扫描显示
) ?! {( V+ S, F3 R8 ~   ;-----------
3 b' c2 M. B4 I5 d* S5 j ;按K2分钟数增加 % S" }0 Q- ?' j5 V8 s
         JB               K2, S12                  ;未按下K2,则继续扫描; B" r/ F& h  r% s7 V/ X# ]
         JNB             K2, [        DISCUZ_CODE_2        ]nbsp;                   ;按下,则等待放开+ X5 }  T$ ^! P0 W1 V; Y2 z3 ^

" m4 @: E) e" l% I9 F8 V         INC       MM_D                   ;分钟数加14 N5 ]9 K5 A1 U6 i& y9 }7 \
         MOV       A, MM_D! r- }* Y5 u3 M1 C, ?# O& b
         CJNE      A, #60, S11            ;是否60min到了: L  c& K% C. F# U# Y" X
         MOV       MM_D, #0                ;分钟变量清0; x1 t0 }( F3 D6 b$ W8 Z, R
  S11:( j$ g, Z7 R5 W# f" A
        ACALL  DOWN_CONV                ;显示倒数的时间
' n0 C. c1 ]& R3 |$ F2 C        ACALL            DISP                     ;扫描显示
0 ~& D7 E/ C/ L        JMP               S0                       ;跳转到S0处运行
, e( \, A: E3 E  ;------------  ^4 @, e" Y) A- r& \" J: N, O: v
;按K3分钟数减少/ H' }2 X4 }1 F/ R
  S12:  JB        K3, S2                  ;未按下K3,则继续扫描1 e8 z9 f  ]* F& i5 j. F  G
        JNB               K3, [        DISCUZ_CODE_2        ]nbsp;                 ;按下,则等待放开7 R- i& }! r$ a9 R% j8 }' Z$ ~4 p% j: k1 ]

& \7 v9 t& u& u# R! W) x5 q

+ c) O  N4 w3 i3 j& F) x8 q        DEC               MM_D                   ;分钟数减少14 M- h1 C/ G9 d" R
        MOV              A, MM_D         
/ b' r/ e  ^8 o. \' E8 }( T* r        CJNE      A, #0,S21               ;判断是否为0. a% `) k& w+ p8 \# [; R# \: [
        MOV               MM_D, #60               ;分钟数赋值为60  \( {# a7 S$ d1 }. o1 o
  S21:1 w" M+ N. `6 ]- V2 ~1 f
        ACALL            DOWN_CONV            ;加载倒数时间数据9 L" @& l7 _( P6 q( |
        ACALL            DISP                     ;扫描显示
% g- E% W* c  X; j; H        JMP              S0                       ;循环执行. t6 _  j9 E0 E9 R
  ;------------
* w, G; g( r( ?) T! y  S2:   JB               K4, S0                   ;未按下K4键,则继续扫描
2 z& f% B3 ~; x' f' c1 d        JNB              K4, [        DISCUZ_CODE_2        ]nbsp;                   ;等K4键放开' z0 n0 v, L7 u/ ?
  ;K4设置完成
1 u  q# q3 K) U7 b# f* B        ACALL            BZ                       ;响4声
2 E9 n% _# ?& j7 o2 c7 P        ACALL            BZ
$ h7 {- l: y/ @, o: h0 R        ACALL            BZ
& A3 _$ U0 P# v& u$ O( J' E        ACALL            BZ3 g5 X+ v4 J) X7 B" Z" Y: f& s
   
6 l2 A8 f. r6 H/ V1 A% z        ACALL            LED_BL                  ;LED闪动
6 d! {: B- g9 n- J- z3 |% V3 K        SETB             TR0                     ;启动定时器. D# K( O! Y+ t5 Y
   
8 k2 r9 j1 C/ G" q  d  W; p  S3:
3 H# a; e4 S/ i        ACALL            DOWN_TIME             ;检查倒计时
6 b3 D1 ?# g6 l; Q        ACALL            DOWN_CONV            ;加载倒数时间数据5 E/ f9 x. d/ b0 l9 X
        ACALL            DISP                     ;扫描显示
/ n/ Z6 d4 r4 P% W- A. o# Z        JMP              S3      7 P& _  r8 f% U
        RET; F" W& I3 ^7 ^, i5 u2 ~; R
   : r& K' A' C" X" H
  ; ----------  加载倒计时时间子程序  ---------
( l# I2 t+ c1 h) `2 e. l5 g/ z ;显示倒数的分钟数5 Q5 w1 T- M* h, m) L
  DOWN_CONV: / K3 p/ F" y  N$ |# R6 R; `+ o
        MOV              A,  MM_D8 u( ?* \1 i  ~) x0 v% l
        MOV              B, #10                   ;设置被除数
/ R% t1 W1 m% W: r2 I) ~        DIV               AB                      ;除法运算,结果A存商数,B存余数. W3 c7 k2 F+ P: u' ?3 d1 V/ F
        MOV               DPTR, #TABLE           ;查表转换1 e, w* g% M# i4 e2 K
        MOVC             A,  @A+DPTR
* o* r1 J. m5 C& B+ W5 X9 ^3 N; z* \$ K+ k        MOV              BUF+2,  A               ;商数存入BUF+29 W$ V! _6 q. U% k
        MOV              A, B                     ;余数暂存入A2 @$ {1 M/ Y/ b' q2 R
        MOVC             A,  @A+DPTR          ;查表转换
, y3 V; H$ q+ P& d9 y        MOV       BUF+3,  A              ;余数存入BUF+3
7 X$ P* _$ E  V' ~5 ?- w  b+ ~        RET) b1 D0 o' i- ~1 c9 k

' K6 g! o. I% y2 d3 @ ;------------- 检查倒计时子程序  ------------
2 Y" f, {, a) t ;检查倒计时
# D  a) ~" f+ m" n  DOWN_TIME:                              ;检查是否倒数终止" ~* x$ Q9 O  t+ V; s8 Z4 [
        MOV              A,SEC                  ;加载现在秒数
7 S  ]1 n% o: X        MOV              B, SEC0                 ;载入旧秒数, f! D  w/ H$ ^& c
        CJNE             A, B, D01               ;是否过了1s
" s! _3 }" s, T8 N# {$ W" }) p        RET
: |. O2 t  m- f# ?5 K! @% d ; -----------
$ v6 ]+ l/ N7 t/ a2 y  D01:% K( K% t7 m( e' |2 U" S$ w
        MOV              SEC0, SEC               ;记录旧的秒数
# d8 f  M# A' y) r/ Q) n( S* R        DEC              SS_D                   ;秒数减15 P/ _1 q' A3 |# O. h. {
        MOV              A, SS_D, u1 C7 w5 ]  e4 G
        CJNE      A, #0, D11              ;秒钟数是否为0
! [( t4 k& M# M, Z6 H% \        MOV              A, MM_D        6 N) j( ]* n0 S- L4 U+ T  x) ?2 F
        CJNE      A, #0, D12              ;分钟数是否为0- g8 \3 b* i5 w8 J
  ;秒钟数为0且分钟数为0,则倒数终止
& a; |3 S$ Y1 _7 |/ X        ACALL            TIME_OUT              ;倒数终了处理程序
9 x5 E" ^0 t& T0 r9 m' m        JMP               LOOP      
& J5 ?# a4 M' x, g  Y7 y4 _        RET  8 m- W/ E2 m' x) u/ I8 }
  ;-----------
1 D6 c8 a& K! W+ T  D12:3 T9 w* u. g+ E6 j% F  y
        MOV              SS_D,#59              ;秒钟数赋值为59     
; J9 m" f% H) I% v9 Z! D' ?# f3 i        DEC              MM_D                  ;分钟数减1
/ r% O8 T5 F! y) t( h3 K, P! K, I
, E' q( V, L% K1 f! r  D11:: {3 Z. ^3 [5 L/ Z" v9 T1 k: D
        ACALL            DOWN_CONV                   ;显示倒计时时间, t+ {! x3 i4 `4 `- S6 ~
        RET
& N, R; B7 E5 I3 {) l/ v: | ;----------------------------------   : X* m6 U, }% t/ V: W& V
        END4 [+ V0 O! z2 H4 P$ f) u+ C6 \4 _
;------------------------------------------------------------------ A* i7 c- P6 l. u9 k
' B  B9 A; [5 h( C4 q
- b/ j/ \9 v' e/ D" K' I

: o' ^1 j( `) c0 |, ?! W& {单片机c语言源程序:
4 O% z! Z2 t$ x) M9 H# d// --------------------------------------------------------------------------------------( j$ r* H2 p$ ]) x
// 文件名称:SZ10-1.c
2 c# r6 b/ M; T9 _// 程序功能:单片机时钟                                            
/ z! j/ }1 T+ Z// --------------------------------------------------------------------------------------# a  l" r* U1 V" M# B' D- @
    #include <reg51.h>                   // 包含器件配置文件
( F& ^/ _* O+ s& Q" i    #define uchar unsigned char
4 n- F' \, I2 n  V) ]    #define uint unsigned int
3 a( O  ~6 ^. j8 e    char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99," K3 K* T- Q, r4 W$ p$ M) r3 x
             0x92,0x82,0xF8,0x80,0x90};  // 0~9的数码管段码            
7 U: [. P5 O% G6 ^- U: G# R        uchar hour=0,min=0,sec=0;                     // 时、分、秒单元清0
; e  e( l1 u7 P) F5 a0 y- N    uchar deda=0;                                            // 5ms计数单元清0  9 H1 |2 ?* {* _0 {$ `
    bit d_05s=0;                                     // 0.5s标志   
7 b. H6 I) y1 ~9 b: I7 p) i    uchar set=0;                                                 // 模式设定标志 ! W8 L: A. l9 ]1 y
    uchar m=0;
( j; E& o4 S7 g( |6 {: O    uchar flag=0;                                             // RAM掉电标志 $ O% i+ Y8 e- X# r5 W
    void delay(uint k);                                     // 延时函数 . m9 X" x. M& r* m5 u8 E
    void conv();                                                    // 走时单元转换 : J' \% E. i; x; V8 L3 ~
    void disp();                                             // 走时时间显示函数  
: W2 _, Q7 ?7 d- K  l" J//-----------------------6 c1 e8 _3 n4 @/ D* I) S7 t
    sbit K1=P2^4;                        // 按键K1引脚定义
% [- M4 v' }  h9 x/ S. Y    sbit K2=P2^5;                        // 按键K2引脚定义, j9 u+ J/ @" n; N7 I6 j
    sbit K3=P2^6;                        // 按键K3引脚定义  M3 ~# ?0 w- U# X( ^; R' i
    sbit K4=P2^7;                        // 按键K4引脚定义
: n9 A( T/ [. ^# B& ?" |9 T, k/ D//-----------------------  
+ Y% S* P7 J+ {0 a- S    sbit SPK=P3^7;                       // 蜂鸣器引脚定义
  h2 Z+ F$ A3 |* n& X6 I3 i9 j    sbit SET_2=P2^2;
  I0 O& n% u: }1 n, R9 t8 ~    sbit M_D=P0^7;# ~! i9 {) s9 S  g6 \6 ]
* l; T6 K1 W0 l' M
// ---------------------------- 定时器初始化函数----------------------------& l. _1 ]1 {+ x+ ^2 V+ ?" A/ Q
' u  K2 ^# v  o5 |3 q( ?
// 定时器T0初始化 . R6 k+ s& I$ U7 I
   void init_timer(), m$ u' c' B" Z/ Q6 A5 n3 S$ R
    {
2 U- M0 `) m. M$ T" A; m. U4 _     TMOD=0x01;                               // 设置定时器T0工作模式为1 : j& O& W) t8 D* j. J- J  @
     TH0=-(4800/256);                          // 加载高字节计数初值   
4 K* O- f  `6 _! P) G     TL0=-(4800%256);                          // 加载低字节计数初值   
8 b) P5 V, h9 y- H$ I7 @     IE=0x82;                                  // 启用定时器T0中断产生
' ~, K* i( t4 a! p, x     TR0=1;                                    // 启动定时器T0开始计时 0 N. T6 ], q% M2 R  p' r5 L* B
   }
$ E& X% @* Q1 k1 t
- k3 a# X) Z# w6 N// ------------------------------- 中断T0函数 ------------------------------4 ?1 `3 U# |" |( a5 `! q

5 |0 n/ g0 S; z) \" ^' E// 5ms定时中断
9 j+ j* m' R7 d% F: ~: Y   void T0_srv(void) interrupt 1
- G5 d0 S: b* {% E9 K+ ^   {
: j( L0 ~! b7 b3 S# q, R     TH0=-(4800/256);                          // 重置定时器计时初始值   / Q8 E/ a' b& F0 N% x" }+ z1 M: A
     TL0=-(4800%256);
2 O% [! x7 _+ w& a+ a     deda++;                                   // 计数单元deda 值递增
$ K7 e* S7 d' j* g$ _) `   }                                   $ J( d) J8 O: U' D" @

: a0 S; w8 A* O+ e2 |7 X$ a% s( V- d // ----------------------------- 走时单元转换函数 -------------------------
3 c1 k) ~; v: [3 S
# W; H, }* @! }; ^, P0 `% _# }  // 时、分、秒单元及走时单元转换
5 _6 H$ o. l/ F, ], z. r   void conv()                                                   3 x) [0 M5 w$ e: \5 L" Q% J
   {                                          - Y* [+ v  ]! D- N
    if(deda<=100)d_05s=0;                      // 秒位标志,每秒的后0.5s置0 ! P# o% S* p4 g% M! h
           else d_05s=1;                     // 秒位标志,每秒的前0.5s置1
. k# s, j, O2 \, j/ D" K+ J  t    if(deda>=200){sec++;deda=0;}              // 中断200次秒加1,deda清0 * m( d! f# _* r) _! p
    if(sec==60){min++;sec=0;}                 // 秒满60次后,分加1,秒清0
3 M/ D* N8 y! N4 z% A& T) ]) s1 ]    if(min==60){hour++;min=0;}               // 分满60次后,时加1,分清0 $ O4 {0 M" m/ z4 b
    if(hour==24){hour=0;}                     // 小时满24后,小时清0 */
1 v" G# V( [7 i1 @  }, r' G* a3 h1 F) Z( O- V
( u# K+ y, B  r6 Y5 B
// ------------------------------ 走时时间显示函数 ------------------------3 V( e  \6 p6 e  g
/ g$ C& V8 ~+ X3 ^/ W4 R0 d' C
// 走时时间显示
7 q* s; o9 u  l9 s* d  void disp()& R6 s5 ]7 k1 Q- s3 z7 ]
  {4 B  }/ g% I1 {" Y# O
    P0=DATA_7SEG[hour/10]2=0xf7;delay(2);4 t! h! V* K* M8 Z
    P0=DATA_7SEG[hour%10]2=0xfb;delay(2);3 r0 x- Q' A' K
    if(d_05s==1){if(SET_2==0)M_D=0;else M_D=1;}
* ]3 T! |$ z, U1 L) w. |; G    delay(2);
( w6 ^2 p: r5 M9 S% @% t. J4 K& V) \    P0=DATA_7SEG[min/10]2=0xfd;delay(2);% w+ \" _  w" z- k; h* k- Q
    P0=DATA_7SEG[min%10];P2=0xfe;delay(2);. @! `& n6 j' j9 l9 p& p- `
  }
/ L, e. A7 _; Y0 }# Q6 c$ {+ {8 O+ A
// ----------------------------- 调整走时时间函数 -------------------------
# r7 a7 }% ?3 V# l' o6 x, V9 z2 m( g4 n+ S7 Y* A! M
/* 调整走时时间 */
$ |$ r$ v; ]) s   void set_time()
9 P1 X# K9 |. v  S) X5 q3 e. y' Z- x    {
6 ~+ ?* C/ C! @- p5 T! E          uchar m;+ l% [4 v: i( \2 w5 q2 L
          //TR0=0; $ B- Z! f* f% ^2 o2 H- w% ^' E
          if(K2==0)delay(1);                      // 按下K2键,消除抖动  6 o7 e# Q2 A- c9 q5 i) m8 j
    if(K2==0)hour++;                           // 小时数递增 4 i0 f) ~2 \+ d( W! `& U
          if(hour==24)hour=0;               // 小时数到24,从0开始
; W3 D: \/ g: p9 q          for(m=0;m<30;m++)                 // 循环30次 6 G- G! Z9 F3 M& j
                {( k3 Q$ r. {8 B4 t
                  disp();                       // 调用disp()显示函数 2 T! ~5 _' X+ ], i, d( i
                  if(SET_2==0)M_D=0;                   // 点亮U2小数点(秒点)
# s3 L. _% A: r1 u6 A+ n                  else M_D=1;
3 T" a1 ~  ~' b9 k                  delay(1);                     // 调用delay(1)延时函数
$ m) ?* q, d% c  M. W                }                4 w- ]$ o6 R9 F1 {/ g
          if(K3==0)delay(1);                     // 按下K3键,消除抖动
- A- ^% M8 }  u$ H$ ^5 {5 U, k          if(K3==0)min++;                       // 分钟数递增 % C; E6 z4 V7 b5 `  e  H
          if(min==60)min=0;                        // 分钟数到60,从0开始 7 J7 ?7 d: s- F2 Z' y- e) `
          for(m=0;m<30;m++)                 // 循环30次   x$ ~5 Y8 c1 j& }9 ?6 e. X
                {
0 I# p8 |9 F- g6 k                 disp();                        // 调取disp()显示函数   
  Z# B, d* x! `2 H                 if(SET_2==0)M_D=0;                    // 点亮U2小数点(秒点)
8 o% f4 C) f! V, f* R! x* D2 J6 D                 else M_D=1;
6 A, F/ P+ l+ U  k: \                 delay(1);                             // 调取delay(1)延时函数            
5 {, k: `/ M$ [- P, h9 a5 f. Z        }2 t! C" q* v0 U5 e( F: d$ W

8 q3 ^7 l% q7 G  }3 i7 K1 c; v! X
) y- i3 s& A* R/ @2 k
// ------------------------------ 走时函数 ---------------------------------/ c7 k2 j- u* _6 P& J+ U+ }+ T
/ W) m( ]$ h  T  y  O' L. [5 p
//走时+ ]8 r8 H! |3 ^% b
   void time()              5 V$ F( p* o' O* ?" b
  {                       
. R6 G  R6 M" ~! u  {$ m' {, y    conv();                                           // 走时单元转换
6 T. l# S5 H1 `- J    disp();                                    // 走时时间显示函数
4 v6 A; ^- @) `0 E6 \( B0 P# ]; l/ M  }                        
" E" F% T  A7 ]/ E& x9 l8 J2 I$ A4 _6 S
// ----------------------------- 按键模式函数 ------------------------------
! n$ n. c0 X' U, K4 l% e* p& o2 E- T4 H) C9 V5 d
  // 扫描按键次数) Y3 |$ V( W# R, X+ Z8 b
  void scan_key()0 N! _* M2 A$ c0 _
  {
- n4 L' \/ P+ N9 [2 _" z    delay(1);                                 // 调用延时函数
7 k# }- w* K7 k    if(K1==0) set++;                         // 按一下K1键,set 加1
6 J8 ]4 N0 D- h! G        if(set>=2)set=0;                          // 按两次K1键,set 为0
! e% p5 W' @# w% G: {+ [    if(set==1)flag=0x55;                     // set =1,flag等于55H    ! C+ j9 k0 O% w8 B
    F0:if(K1==0)goto F0;                       // 按键未释放,在此等候   ! s0 h0 j% i2 c* h# J
  }3 O& B% l# [1 ^. E: R

/ p+ X2 @4 D9 n; ] //------------------------------ 延时函数 ---------------------------------        % v" N' `  |" n! A9 l2 v" C( V+ ?

1 N4 R/ U+ y/ [; d //延时
3 U1 O7 h! K* K% {  V* e" H* t  void delay(uint k)                        // 总延时时间:1ms k
* C3 G& _7 ?' h; v" w# Y' r   {/ q) M* F6 S3 f! J$ I& m
    uint i,j;                           // 定义局部变量i、j  
# u* o3 p. i- f. z2 u    for(i=0;i<k;i++){                         // 外层循环 & R2 a+ q# G' ~  A7 W% S. I
    for(j=0;j<121;j++)                       // 内层循环
# V8 ]' B0 B8 ]9 G    {;}}& e3 ?1 h7 M) B6 l8 h
   }
- r4 s  R% T; s, K/ y, x% F, ~' }1 x! }0 J+ b" N. s$ C# ~' v8 }
//------------------------------- 发声函数 --------------------------------
2 ?( D, v* d* M4 {2 w% X% t) q
// 发声 5 c' X: M$ n7 |& I
void  fs_d ()                                         
2 |( f' f% Q- h' A1 q7 @5 V( r    {   ! |+ J& M: s1 K$ E
      unsigned int j,y;                 // 声明无符号整型变量j, y        6 `: P5 f& Y  N  \- u
       {                    ( k: q, d8 f* g) T5 i; Z
         for(y=0;y<1000;y++)            // 循环1000次,嘀响0.5s 1 u* H( |% b, d5 f, L
          {  % a7 J+ r  L( l- m
            SPK=~SPK;                   // 反相输出  k$ v4 ^; }# ^; i: C; ^( j
                for(j=0;j<50;j++);          // 延时500μs; k* i1 _7 ]) K7 l6 I
           }  
8 e* T2 X* d8 i, ?        delay(200);                     // 停0.2s             * o9 T. z6 F7 `" f
      }                                          
; g) s" @" b, [+ ^7 y   }6 [  c/ |% B/ V
; a( i) b: ]: J, s
//--------------------------------- 主函数 --------------------------------2 E8 S% g4 x1 h' q& _- k* C

0 W* p/ b) a4 Z: ~$ M, F% w  //主函数# P% M' ^" {6 V( p
   void main()' H- S! H3 ~  t8 H! b( g) D
   {                             5 {& g6 o8 w' M% l/ S' j
     init_timer();                      // 定时器T0初始化        
6 B* X1 v" E+ s0 c# t8 g! l     while(1)                                                  // 无限循环 2 p1 \9 [" j0 c% _% P0 ^6 x& m
     {
( a9 g& I6 X, n5 d       if(K1==0)
9 g" _" s+ I2 M; B' p           {  
- n( n. ]& W- T% C' s1 _             scan_key();                                   // 有按键,调用按键扫描函数   
% I( @& Y; L8 V7 @" A$ u+ u2 Z& Y             fs_d (); , _* s( y: ^7 c# o
           }           
8 A( l& m) q+ M- Z& d: `           switch(set)                                                // 根据set键值散转 + d* `4 t. p* s
        {                         $ ?8 [" O' D2 A
          case 0:time();  break;                 // 走时时间程序         2 L& E( [, ^+ b) O- S
              case 1: set_time();break;     // 走时时间调整
7 |2 k% Y( R- d" ~: M; V+ L          default:break;                                // 其他,退出   * B$ z) O- b9 p- u! r
        }                                                  
: ~" `5 z/ h6 {& Y1 u4 a9 l4 U, V       if(flag!=0x55)                                       // 判断掉电标志            
0 n. x( p& O3 i3 I1 c        {         
. `& m" g+ K) _         P0=0xc0; P2=0xc0; delay(200);        // 点亮4个数码管  1 p2 A$ g( f* m; c( C, [
             P2=0xff; delay(400);               // 熄灭 4个数码管                                  5 U& Y( p2 G8 l& ]6 u& f- X
            }
( i9 W4 S9 S( B! N" K7 S3 Q+ a, }           }
' Y" ^0 L% g: T  }
* s/ f6 k# n# @  X7 t
8 V  T! }: G) Q3 d. f. I! b1 D…………限于本文篇幅 余下代码请从下载附件…………
( Q& l) @8 k9 O5 H: g' ?1 q0 d8 K
下载:# I5 j1 V- c$ V4 U. [6 ^, |; T
游客,如果您要查看本帖隐藏内容请回复
4 B( O4 n, C( ~1 Z4 c, ^

9 r$ S; p; g( |& S& q: e1 X

' t7 q9 C4 P8 `) H3 g

该用户从未签到

3#
发表于 2019-5-20 11:13 | 只看该作者
学习学习·( E5 ^$ m/ M5 e0 G4 l
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-27 20:38 , Processed in 0.203125 second(s), 26 queries , Gzip On.

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

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

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