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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机数码管单片机时钟实验 C语言和汇编语言2个程序
1 I( ^$ \% B- U$ n( a* {
: m2 M& Y' X* U% o4 r
/ s& q# H! @8 ^9 L0 j7 Q) F6 u
单片机数码管单片机时钟实验 C语言和汇编语言2个程序 还带Proteus仿真) t/ K+ o: z* ^: p
单片机汇编语言程序:
- G2 R* m  z: B3 _- E- ^
$ \. D" [& d' F8 X8 T7 I

# j# A. r9 o  j& Y/ c  a1 L;-----------------------------------------------------------------4 e& E, w1 H1 r
;文件名称:SZ10-3.ASM
) L& S4 L9 i% k7 [3 p5 ~9 S ;程序功能:带倒计时的闹钟: }% I2 U6 F" n. N
;----------------------------------------------------------------2 L6 G, Z' j0 I; I
;******************* 闹钟(含插入倒计时)程序部分 ******************** q# R. q  Y; |, W# X& v' z- Q7 ?" k
+ E, O- h0 Q) {- \5 Y0 O9 b3 j
% v. ^3 O' l( W& k4 {" E% ^: f% H9 x
;----- -------- 程序初始化 -------------6 {/ c# ^. P- s2 P2 `/ g% d2 L
; 定义存放计时单元地址# ?6 ?! v8 T8 Y8 ]2 S# _
         ALB           EQU           20H.0     ;闹铃设置标志   0 f& `; [. j. O5 \
         BUF           EQU           30H       ;30~33H 连续4个字节存放显示器数据- B5 V$ w9 o5 G$ ^3 U
         HOUR              EQU           34H       ;存放小时变量; F6 ^, ~* C$ Z$ Y4 e. C
         MIN           EQU            35H       ;存放分钟变量
4 b# i) p7 `- |9 C3 o; e' K         SEC           EQU            36H       ;存放秒钟变量
' i# R' b( ~+ a$ m         DEDA              EQU            37H      ;存放5ms计数值
5 c) h7 s0 ]) w8 e, u# m! w         HH            EQU            38H      ;闹铃设置小时变量: B( r' U# J0 A  O% C5 e5 [
         MM           EQU            39H           ;闹铃设置分钟变量0 y4 J) }+ x' G. z% s" R5 z( [9 U
             ;………………………………
# f/ h& p5 {9 j0 ?3 L% T             SEC0           EQU    3AH    ;存放旧的秒数
7 b3 w8 r$ r) m7 Y! S0 M9 K* A% u             MM_D          EQU    3BH    ;倒数时间分钟数4 T. n4 q1 Y- i4 p; }
             SS_D           EQU    3CH    ;倒数时间秒钟数
) `( {. J. d7 z0 b             ;………………………………. b  \% T3 ~( ?% b( I$ I
  ;按键输入引脚定义
! x9 _- U, a, c3 g4 [8 a) o          K1          EQU            P2.4     ;按键K1引脚定义) P, D; D0 S, z' I: S
          K2          EQU            P2.5     ;按键K2引脚定义9 x" z+ r1 i# j' t2 q$ Y. X
          K3          EQU            P2.6     ;按键K3引脚定义% D8 o; I! m) Q9 G9 |5 j  Z
          K4          EQU           P2.7     ;按键K4引脚定义9 q: P. K1 y/ J6 @, K3 z( j

6 I/ |/ E) c) X1 W# U9 U7 v; J: p  L ;蜂鸣器和指示灯引脚定义
0 m( Q  y! A$ g/ v         SPK           EQU            P3.7    ;蜂鸣器控制信号引脚定义, ?" @$ F0 m* Y- M
         WLED          EQU     P3.0    ;工作指示灯引脚定义" S5 |) c' K5 E. g5 E* ~6 I0 b! _

2 H8 \) Q7 J: Q( Z+ l2 R, K ;程序开始执行地址 - N5 O2 e. [# |7 X" K
         ORG       0H                     ;程序代码由地址0开始
6 |8 `, i7 u) r' r- x4 X         JMP       MAIN
4 s" ]8 B! Z1 N# d! \0 N: t         ORG       0BH                   ;定时器T0中断地址设置) }' H$ Z1 _8 D7 N$ s
         JMP       TO_SRV
6 }2 M$ Q& l0 R& z4 ^8 \
  r* _% ]# @3 A5 c

9 k8 g( n# j, {: T+ J- B ;-------------- 主 程 序 ------------
5 x. r6 j9 F. z: x  [ 3 E% G% I" }7 U- A7 t
  MAIN:                                           ;主程序
! ]) _5 `* y' Z         CLR       ALB                   ;清除闹铃标志   / U, N  E8 a# r" v' s: I: T
         ACALL     BZ                     ;蜂鸣器连续两次鸣响' ?1 Z! a  r  B# ^$ r
         ACALL     BZ          1 z, U$ m, {5 k" y
         ACALL     LED_BL                ;LED 闪动,表示程序开始执行
8 W2 K0 s6 m! p& B# ~         ACALL     INIT                   ;初始变化量. ^  m* e4 t# k* j' e5 g" J  L, Y
         ACALL           INIT_TIMER            ;设置定时器
- e7 T- A0 W  ?- z! b0 p * K+ j: G7 U3 H( Q
;加载显示器初值数据
0 H" \9 ?6 M- G, L* Y: b/ h4 m2 a         MOV       A, #0C0H  - e, @' r0 E( C5 @8 W& E0 \. z" s& h
         MOV       P0, A   
% `7 T  x6 o/ X- o  m# e   ]$ }4 r. R% m0 q! I7 z7 i: o" z
  ;无穷循环' Y/ n9 p3 }! I$ |  u  R, [3 p
  LOOP:                   5 u% y# ^9 j$ Q# s0 L- d* B
         ACALL    CONV         
% `8 \6 j' j/ g7 @- W4 P" O  \         ACALL    TIME_PRO              ;检查闹铃时间   
+ R+ A, W6 D% G% l( M         ACALL    DISP                   ;扫描显示  
: d3 s2 E$ ~8 h, m7 b! p. Q% _: W; e

! _) c7 B6 S* R# e5 H. P  ;设置走时时间$ o" C3 Y  I4 c6 p2 S! Z
         JB         K1, M1                 ;未按下K1键,则继续扫描
( f" i" G9 e* ~+ S/ @2 {7 y' k4 m         ACALL     LED_BL                ;LED闪动
+ v1 r0 E1 J1 B4 v8 y& x0 H         ACALL     SET_TIME              ;设置目前时间
& T6 v0 {. Y/ d: z/ d& G: @: G         JMP        LOOP                  ;跳转到LOOP处运行
( N& N  G- I' _- g  
' E/ }: w6 h" l  ;设置闹铃时间 ; x7 c9 Y+ {$ A( \: v# y: ?
  M1:    JB        K2,  M2               ;未按下K2键,则继续扫描
( C; R& w" D9 ?) s1 e         ACALL     LED_BL     + I/ \* N. |: |
         ACALL     SET_ATIME            ;设置闹铃时间# @- H6 Z. T) t" j
         JMP        LOOP                 ;跳转到LOOP处运行
" V7 U( Y4 t  A6 l) j4 [  ) q! i; n& z+ @2 l; A# Q
  ;设置倒计时间' H1 Y; T; v" y: \
  M2:    JB        K3, M3                 ;未按下K3键,则继续扫描 : s% X0 x5 j' O- v$ b9 Y" ^
        ;…………………………, c9 T( d  a! e+ m4 N/ K
              ACALL    LED_BL
6 X/ N) e* i9 h" ?8 T              ACALL    DOWN_ATIME  ;设置倒计时间. T8 @. W9 W% x9 a9 G( r6 |
        ;…………………………
/ o% F" w' O' c8 t$ @' T" E          JMP             LOOP                   ;跳转到LOOP处运行
- e' l. H  Y0 Y9 y  ) s6 c- U- w! z; \, t( [1 ?
  M3:    JB              K4, M4                  ;未按下K4键,则继续扫描
  D8 g( W. g- l8 T         CPL             ALB         
, E, j  c3 Z* c% Z8 I. g         JNB              ALB, M31
& G* c. ^3 Z6 U6 {8 P# b# w6 x      
2 C/ ?3 B! w: l* Q% U* {' ~  ;闹铃启动连续3次发出响声0 Q: o: C+ t' t
         ACALL     BZ
: L& j+ F( l2 ^( I         ACALL     BZ
2 i0 `2 V3 w1 g* x         ACALL     BZ
9 l* _( w; v2 W% g6 r" i* f         JMP       LOOP                   ;跳转到LOOP处运行( z! U+ [; m4 W; Q9 k
. T: J2 n2 L6 x. d& C- h8 `& Q

9 h- \4 p6 i: x. k* Z. i  M31:
8 \/ _  N# i  P1 ^3 z, ?7 n3 ^( T         ACALL     BZ                      ;闹铃停止,发出一声响
$ [4 g, v& J) K; T, C* s         JMP       LOOP                   ;跳转到LOOP处运行) j  j( W. h$ r0 @

% |) Y& v/ j6 \1 k( y

+ O8 @( z/ z; {  M4:0 p0 q+ k5 e* x* X- u  [
         JMP       LOOP                   ;跳转到LOOP处运行
. q1 N' U5 H0 E7 d
$ B5 d' u* |$ }) i ;----------- 实现走时功能的子程序 ----------. E! D3 j, l% D; e* a
9 X+ S- q5 m+ C% P# {2 j

* A& \, @5 T. ~' t' K  ;使用定时器T0模式0计时
, ~; B/ `( z# q, {% F   INIT_TIMER:                            ;初始化定时器,使用定时器T0模式0计时
9 p% }. E* v" h* b6 A1 V' q         MOV              TMOD,#00000000B        ;设置定时器T0工作模式0
3 W( a1 _. k9 @- H' u# J0 j8 X         MOV              IE,  #10000010B        ;启用定时器T0中断产生* R8 q8 C2 s& v/ S7 k9 |$ `
         MOV              TL0, #(8192-4900)MOD 32  ;加载初始化数据
5 o7 J' V* f5 I$ W, [2 o- W         MOV              TH0, #(8192-4900)/32     & _! ^8 q. s& n3 D" N+ `
         SETB     TR0               ;启动定时器0开始计时
! O+ l" M, ?4 q# ?* e         RET
$ U5 ]' J' G. g1 g. N ;-----------―――
6 T6 @# z7 K7 z0 |5 G# N, e" b$ S: k  ;中断服务程序7 @+ y6 C, k- x  C) A
  TO_SRV:                                         ;定时器T0计时中断程序每隔5ms中断一次
$ i* a# c3 h0 q8 w/ [. p6 Q3 R5 a         PUSH      ACC                    ;将A值压入堆栈" a2 w) G0 q/ K+ E% C
         MOV       TL0, #(8192-4900)MOD 32 ;重加载初始化数据  w% n' s. a: y4 [& d2 y
         MOV       TH0, #(8192-4900)/32   
/ h* o3 a* h) ]' }1 Y/ u! d         INC       DEDA                   ;加1   
- a( d6 \; \7 K; X3 m  ;秒输出' L6 u, L8 k( x' r; J, A! C
        MOV               A, DEDA
8 t, f  H8 S  s4 j0 R8 W. ]        CJNE      A,#200,TT1              ;是否1s到了! j" a  P8 B5 \  e9 p$ D1 U$ X
        MOV               DEDA,  #0              ;计数值清0& W  |+ u7 w" b+ y& U5 I
        CPL              WLED                   ;LED灯亮灭变换# Z5 l% p! A1 r2 L
        INC              SEC                     ;秒计数加17 L" V7 c& O5 X5 a! k1 p+ |. h. n
        MOV              A,  SEC2 m* R* r1 N, g- `/ ?* E1 W" I
        CJNE      A, #60, TT1           ;是否1min到了* ?1 X- o; i4 Z0 G2 y, B/ N  z
  ;分输出% _8 u5 s3 l' Z5 K4 n+ S2 d" p- J1 P
        INC               MIN                     ;分计数加1
6 e( |2 b5 S7 o& l7 I        MOV              SEC,  #0                ;秒计数清0% `' A  M" @2 q# y" ~
        MOV               A,  MIN
' p8 m. P# [0 G: o( g2 b        CJNE      A, #60, TT1            ;是否1h到了" h* K7 }! w9 ^/ Y6 I# O
  ;小时输出/ L# \2 u/ F' J/ A* B0 W
        INC        HOUR                   ;小时计数加1
+ L1 m7 V: @6 f7 x+ c9 q1 m; Y        MOV               MIN,  #0                ;分计数清0
0 u! i; p1 O  w# L, a& T9 k. Q        MOV               A,  HOUR
( I7 ^7 l2 w. C0 E  n; @1 Y7 h        CJNE      A, #24, TT1             ;是否24h到了
) v! l: U2 p, ~3 }" n8 u/ U! t- z        MOV               SEC,  #0                ;秒钟变量清0- ?$ {* i: w  ~" K% Q0 E* ]$ m
        MOV               MIN,  #0                ;分钟变量清0
' z2 g/ @( p" B; S6 Y, Q! Q$ I" k        MOV               HOUR, #0                ;小时变量清0; J8 h7 J  C5 a8 n! J
  TT1:
' `- R  l/ X* O5 E. q+ ~        POP               ACC                    ;将A值由堆栈取出
) h8 |! p; w! o. k        RETI  r0 Z1 |( p: B+ W

, Y& @" v4 \! e' m. l
: V! N/ X, w4 g' R' `4 K  _+ s6 b
;------------- 实现显示功能的子程序 ---------
( K; x5 I2 d, K/ w7 Z1 ~" q
) _" o, T5 a1 V( X) P( c- J

- s! c6 o. h# O: [$ K/ [
- L0 O* g# X9 G' G2 q# o  CONV:
- N1 S; \  e8 {' B! k  ;转换小时数据. h" f) e, x5 S
        MOV              A,  HOUR
* h8 a$ r( M8 U        MOV               B,  #106 U+ p0 \, o4 V7 f" W0 G
        DIV               AB: y; j: S- j) p/ p7 ]* Y
        MOV               DPTR,#TABLE           ;查表转换3 R: w, c- Q& ^  h& G
        MOVC             A,  @A+DPTR! c+ S+ i* A2 b/ n8 D, M
        MOV              BUF,  A
: ~1 `* j2 S+ F  l/ j% O        MOV              A, B
; ]$ T, W/ M* d2 F9 D: x        MOVC             A,  @A+DPTR
$ D: N! U% v" i' H  l& d) k        MOV              BUF+1,  A
$ p7 q" t4 _3 {6 b2 ^( f0 q. F  ;转换分钟数据( M# M( b! d& s) o: J) g+ o" b
        MOV               A,  MIN6 B" k; r$ t7 G# K
        MOV               B,  #105 G" @) p& `0 _( f. Z1 m
        DIV               AB' }3 i9 Z! g' V' n* H: M0 j
        MOV               DPTR,#TABLE             ;查表转换
. D4 R; U& y  z. S2 M! d( A- @        MOVC             A,  @A+DPTR/ d0 P, X4 l" L# Q
        MOV               BUF+2,  A+ V+ p2 ^2 ]) e7 ]- r; d: P0 O6 o* n
        MOV               A, B
7 @1 s% H- W5 l: q        MOVC      A,  @A+DPTR. M' q% K& z! ?9 u4 W. R
        MOV               BUF+3,  A, H5 Y7 Z4 b3 C& b. |3 \5 q
        RET5 D# M0 I! T# {; x. v- ~: i0 A
( H+ U0 @- I8 P# G1 Z5 ?. L6 u
  ;字型数据编码表  m2 T* U) _( Q# f
  TABLE:/ W' t* }4 {( z3 |
        DB   0C0H,0F9H,0A4H,0B0H
/ W. @& m) d! x8 C6 W        DB   99H,92H,82H,0F8H
2 M6 o! c1 A% G# w6 I        DB   80H,90H,88H,83H
; X% A! J9 X; R- P, v        DB   0C6H,0A1H,86H,8EH8 l1 O8 g$ T/ p/ V1 f9 u4 A

: L) S: A( b/ K$ Q* w4 H9 z ;-------------- 扫描显示子程序 -----------
. J# p8 @" o4 b8 A1 n8 E9 C& b4 }  ;扫描显示
- q$ F3 ^) Y6 J- A( i, \; y8 o  s  DISP:& P) T. n4 n8 l, R
        MOV               R0,  #BUF               ;指向显示器显示缓冲区起始地址
: ^1 P  C2 L5 M4 r2 w% k% u) O        MOV               R2,  #4                  ;循环执行4次
( q; \! t' @' V0 J$ A# D1 x5 C+ ?        MOV               ACC, #11110111b        ;加载扫描信号初值11110111B- K' X! Z. E+ ?3 u  E  x
  S1:; m4 S1 ~) E9 W; c5 k
        PUSH      ACC
5 x; q+ r5 j# D- W7 d8 i        MOV               A, @R0                 ;取出显示器数据! r7 @5 ~' B& I7 g' m" _
        MOV               P0, A                   ;由P0送出一位显示器数据: N: }9 x! {+ I: i
        POP               ACC; a+ c' ^) W1 O0 W( `9 S
        MOV               P2, ACC                ;由P2送出扫描输出信号  
' }' m3 L$ u  r5 ]2 \- |7 p7 f1 m        MOV               R5, #2                   ;延迟一段时间. Z* t! T5 w: Y1 h2 @
        ACALL            DELAY' j& b# c4 t. c( h9 B
  ;改变扫描码 EX:XXXX1011 ! v* v: l, f+ X7 [7 o
        RR                A                       ;累加器A向右移动一位8 c4 K4 w) p- v6 N
        INC               R0                      ;显示器显示缓冲区地址加1
; O0 i6 t: Z2 x- x7 @$ _        DJNZ             R2, S1                  ;判断是否继续执行循环4 i$ `2 N, \* I; r7 [. J, M  U% i
        RET# E! W" a" q8 q+ {' W9 L
- L! a* P5 r* Y5 E2 X8 n3 V4 y3 _3 d
;------------- 实现调整时间子程序 -----------! u, h3 [: V( Q- M- L

4 q% U+ t8 z# V+ J+ x6 h' _
# S$ S- O8 G  O1 [2 G
;设置目前时间3 ?" j" B1 o& y: n6 H
  SET_TIME:$ d. z# _0 o, O+ h
        CLR              TR0                     ;定时器工作暂停: q: H) o9 p5 g: T4 {4 K
        MOV              SEC, #0                  ;秒钟变量清0
. [" |+ @1 z$ G5 S: s) K  L0:( ^& s1 x8 L: ?7 c1 |' L
        ACALL     DISP                    ;扫描显示) o7 ]9 x0 h% l7 ~" a2 b& R, r
( x" {$ o4 g) |7 y6 B- E1 I
        JB        K2,  L1                ;未按下K2键,则继续扫描( ~$ \  N, W+ x' K5 e  X2 M) L
        JNB               K2,  [        DISCUZ_CODE_2        ]nbsp;                 ;按下,则等待放开
8 o7 o. Q, h3 u* H- F6 D   ;K2小时调整   . n5 D# p. r+ o% E2 j' L- j
        INC               HOUR                   ;小时计数加1
$ n, M) _+ U" m& z/ X5 r        MOV               A, HOUR+ a) y* R7 i$ x' \' I% T
        CJNE      A,#24, L11              ;是否24h到了/ a7 p$ J7 n( C( x$ |8 ~
        MOV               HOUR, #0               ;小时变量清01 G2 N: j7 i; Q$ U. U4 e
  L11:1 d7 q, k: j9 V" e
        ACALL            CONV                   ;转换显示数据& e8 V# S3 a# s5 b+ }  E
        ACALL            DISP                    ;扫描显示, d0 `( S4 X) A6 f" W1 I9 D' B
        JMP               L0                      ;跳转到L0处执行
5 {" u, D. S6 C, w- F, [/ k
: G- r" m/ `( y# K  L1:   JB        K3, L2                  ;未按下K3键,则继续扫描- ]2 }1 }9 x9 b5 l; f" ]
        JNB               K3,[        DISCUZ_CODE_2        ]nbsp;                   ;按下,则等待放开
2 b2 z. ~7 o: b6 l3 \   ;K3分钟调整: M. S; c- w% a
        INC       MIN                    ;分钟计数加1
2 A0 R) X( D" Z, B- E# N        MOV               A,  MIN
. n5 Q+ ]8 n  d9 v; X1 r+ h. s2 I7 R        CJNE      A,#60, L21              ;是否60min到了
2 K6 ~. W& m3 q* Q        MOV               MIN, #0                ;分钟变量清0$ B( K8 c+ b6 s; l, w
  L21:
2 E! I& K5 F0 l3 d+ d        ACALL     CONV                  ;转换显示数据
5 w3 P3 [: ]6 J4 O# g" p: m& r! i8 [        ACALL     DISP                   ;扫描显示
8 R3 i* N8 c8 s% e5 A        JMP       L0                     ;跳转到L0处运行
' \; X; M. d- ?8 O. }5 G . n* `, W9 M; D
  L2:   JB               K4,L0                  ;未按下K4键,则继续扫描
  x& K/ ~7 |0 S' w        JNB               K4, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开1 R+ {: i& O! _5 ]9 _  F1 K* y
       ACALL            BZ                     ;蜂鸣器鸣响一声
7 m( e" g6 k0 j6 c# c- E/ b  ;K4设置完成: g% B, ?' T9 d* N- e
        ACALL     LED_BL                ;LED闪动' E, ?9 s- _+ Z5 I
        SETB      TR0                    ;启动定时器0 S( b" k* r3 s- I7 \
        RET   o2 L/ f( A; i! t: U
1 P8 i* f, ^+ }1 o" g# j

, ~8 D7 m! }: d+ S7 ^3 y8 v ;------------- 计时单元清0子程序 ----------
% e0 W; J5 \1 A% d+ S  p' d- G" o- ?+ q0 S! h; u- K& j: H- p

: f. M2 L9 t" B" S8 R2 H' K9 ~  ;计时单元清0
& R7 W& s) _' k* I" o INIT:              2 k+ ]9 |" P2 i% E) i1 U) t3 y
       MOV               DEDA,         #0            ;5ms计数值清02 |9 h( b7 ^5 F
       MOV               SEC,           #0            ;秒钟变量清0
6 U6 t  D0 x6 r! o4 T       MOV               MIN,           #0             ;分钟变量清0
, E0 Z- g, i7 e" E6 G& V       MOV               HOUR,         #0             ;小时变量清01 P; U2 V3 A1 l  l! S4 C
       RET
  I8 p9 B0 _& D8 Y& ^6 K7 ~
9 e$ A! F  |2 p: C% R

0 R+ b  c( t4 c$ T+ ?+ [ ; ------------―蜂鸣器鸣响一声子程序 ----------
& l4 x, ]" X, G1 u+ m: H ;蜂鸣器
& |6 T. H7 M7 N! J4 D, ?( t7 T0 k/ R  BZ:                                ;蜂鸣器鸣响一声
4 O* K+ g6 e4 R' k# r% j$ V        MOV       R6, #2502 T+ p8 U, M( A1 `* a
  B1:   ACALL            DEX
1 b7 a* z4 G) h' X  D; q0 Z        CPL               SPK5 i, @5 `8 |4 @0 z1 I& R! |
        DJNZ      R6, B1: ]  x- I, z8 S- M( R9 g. `
        MOV               R5, #50 & V+ N; d' x7 O0 a$ x, A
        ACALL            DELAY
3 _1 w. T9 k& Q7 Q- D: }) {        RET" U1 M* \7 U9 A7 v$ b5 ^/ a, g
+ g1 b# o  \* @2 E& s& J8 e0 q
;-------------工作指示灯闪烁子程序 ----------5 K/ s; |4 q: F" H2 i
;工作指示
0 W& J5 [6 r& v! s+ f  LED_BL:                                ;工作指示灯闪烁
/ x3 q% _4 m4 G7 ]0 C        MOV        R4, #60 U3 }2 k5 j8 q# |: ]  I
  LE1:  CPL       WLED                  ;位反向
/ f2 p' L' n* Z. S        MOV        R5,#25 + }8 V! p" I+ A" O. I6 s
        ACALL      DELAY            ;延迟50ms" X9 c& I* X1 ]+ l& m9 |/ _; z
        DJNZ      R4, LE1         
! }0 a6 q5 q/ o) b9 H; A3 j        RET
% l$ R; E2 C& ?; o8 H2 y8 r
' U8 E( {* C' q6 ~& K
& Z5 |+ k6 E( X
;-------------- 延时子程序 -------------5 {2 C3 L+ U; k

# w  C) F; R' n6 L4 j
; [3 O3 }! ?9 l4 w9 Q
  ;延时子程序2 O; x9 Z2 @& Z$ k* f
  DELAY:                                   ;总延迟时间R5 2ms% G- ~2 C& ~) A
        MOV        R6,#10 , X9 U# Q" B& z6 ]6 p( b8 p8 Z
  D1:  MOV         R7,#100
; G  Z: {* s. `5 l( L        DJNZ       R7,$4 b7 x! r6 B/ n* I: }; z
        DJNZ       R6, D1
* R2 @& x' O# G  b7 e        DJNZ       R5, DELAY
0 I  _+ c  r: o        RET 1 k  D& Z6 ], I, R& Y( N
;------------ 蜂鸣器短暂延时子程序-----------
1 V! R& A6 ~8 D3 Z+ M7 v7 ^( Z  ; 蜂鸣器
2 u! Y/ l# }$ D  DEX:  MOV       R7, #180               ;短暂延时
$ m! w8 s2 T1 K: g3 [+ Q  DE1:  NOP
, O4 V5 h" L- M2 R- D' e7 t: x         DJNZ      R7, DE18 T: k" u: W4 I
         RET
9 h/ R" R5 y: [6 Q" M) R
6 t1 [) _1 |2 n4 D6 ]  L: O
1 Q" g5 n- z7 s! ?% j
;******************** 增加定时闹铃程序部分 *********************
3 ]( ]2 G. B! y0 y, u
2 m" c& f$ C  X) |* |

0 V, ^- P' {. i7 r$ Q" k% c$ j ; ----------- 设置闹铃时间子程序 ------------
1 y  s* D% e/ {" I/ ^7 Y ;设置闹铃时间
( S) v# u$ N+ V' `* O1 b4 c  l  SET_ATIME:! D, l1 N) |7 V1 Z; c
         MOV       HH, #0
* b% {$ W, t" S7 [5 _$ U* C2 R+ H) sMOV       MM, #0. c4 g6 b) |# B
ACALL     CONVA                 ;加载闹铃时间数据
0 P  v7 _5 V/ E* |/ {7 [7 d  N0:
; l. Z' P, b6 X' O5 Z+ X         ACALL     DISP$ ]& h6 z7 N: J4 P' H7 {8 f
  ;-----------
/ z6 A, A, ?1 X( ~        JB         K2, N1                  ;未按下K2键,则继续扫描4 c: n* b0 a8 f
        JNB               K2, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开
  L+ Q3 l" b# S7 [+ t9 B ;K2调整小时- u, v. R  H+ ]1 v1 e1 r8 q, U
        INC               HH                     ;小时数加1
, O) l% J7 |% }, s        MOV             A, HH- P- B) a. ~" t
        CJNE            A, #24, N11             ;是否24h到了
9 f& u$ k+ V) x. `+ f        MOV       HH, #0                  ;小时数清00 [* [/ R2 A( Z  h; b* p, S8 {
  N11:- M, K0 I5 E: ~/ W
        ACALL            CONVA                 ;加载闹铃时间数据1 f4 O; y" Q) {. T2 _) |
        ACALL           DISP                    ;扫描显示
# {' m2 B% f% p1 A( p# F+ q        JMP             N0                      ;跳转到N0处运行
, v5 {+ o$ M" L0 X  ;------------% L/ {, I. }- i& e; E, }) ?+ c! p6 x* y
  N1:   JB               K3, N2                  ;未按下K3键,则继续扫描
% a7 ]& h$ q/ y) n) w6 K        JNB               K3, [        DISCUZ_CODE_2        ]nbsp;                  ;按下,则等待放开0 t* }1 c  o' j, A  a; m) e
;K3调整分钟
! D' P4 u3 c0 X- N' J8 X, R) h        INC             MM                           ;调整分钟数
' |! u+ z3 K% @        MOV               A, MM                 ;分钟数加1
' R( g- D: s5 B1 I" ]' n        CJNE      A, #60, N21             ;是否60min到了' s0 D+ Y) [: W" o1 i/ W
        MOV               MM, #0                 ;分钟数清0
; g* k; A+ {# V: \& y& ~6 D6 ]! K+ L  N21:/ N. F6 t1 L0 L
        ACALL            CONVA                ;加载闹铃时间数据
9 c9 z7 W8 v& u9 Z: e; s        ACALL            DISP                  ;扫描显示2 K$ _  K- ~  [/ w
        JMP              N0                     ;跳转到N0处运行
' \6 p6 W) W( Q& N1 A  ;------------
5 ?- S9 N7 F3 k" ^  N2:   JB               K4, N0                  ;未按下K4键,则继续扫描
6 S$ }5 `4 }( I" ?        JNB              K4, [        DISCUZ_CODE_2        ]nbsp;                  ;等K4键放开/ T5 e5 \6 [7 Q& M# d% s1 s
  ;K4设置完成
; ?5 v1 |2 L9 y" n4 C, Y        ACALL            LED_BL                ;LED闪动$ S! t4 m2 r! ?8 ?( m
        ACALL           CONV                  ;加载现在时间数据
; L7 O2 L; W; h' c; n9 G$ c        RET$ x+ a" z) i7 ~- w  z& w
6 D* X7 `0 @  N5 F" I% T

( h- t, n$ Y/ _' B ; ----------- 加载闹铃时间数据子程序 ----------* R0 |6 O  c. p+ p' `4 C

; \+ J2 {+ [; \

' \: `( `, p( _+ H
5 `) H, P) i0 S- F7 F1 X, W  CONVA:. I8 v$ p6 _  I5 o& h& m
  ;转换小时数据/ V7 v9 m* l( H% T, Y$ `
        MOV               A,  HH3 \6 U. o1 w+ J; c; S+ v! g+ u1 S
        MOV               B,  #10
( r, I1 o1 |% V! @: ?1 j$ L/ n  J* }9 o        DIV               AB9 H; C7 P+ e1 e  C& Z
  ;-----------
+ S2 p4 i$ p8 m/ p1 v/ f5 F        MOV              DPTR,#TABLE           ;查表转换
* v# t6 g) s8 W! g% S6 L        MOVC             A,  @A+DPTR
7 q6 e. `) x1 K( B        MOV             BUF,  A1 c3 l' P* }4 X) Z+ V+ [
  ;------------ N$ o1 X: b& ?
        MOV              A, B/ h2 k" h! \; ~3 q
        MOVC             A,  @A+DPTR6 I( N+ w8 i8 B1 q1 ]- h. _
        MOV              BUF+1,  A& O* b: f2 O. K. [
  ;转换分钟数据+ @9 |+ y2 D' c" L
        MOV              A,  MM/ J0 w' M' p2 z) l9 U
        MOV              B,  #10
& Z, y, _" x" L' X, F. k% _        DIV               AB
5 \9 g; Q2 O1 U8 I% Q' S6 R  ;-----------
3 W' P) M; P2 n2 `' A# B        MOV              DPTR, #TABLE           ;查表转换
2 o* @7 |& M8 o3 [8 I8 O9 U        MOVC             A,  @A+DPTR( t2 e) M9 c! u; E
        MOV              BUF+2,  A) J8 Y: ^$ s3 q% N; m, H6 O
  ;-----------
, D. J1 R' X& [# A2 t; S        MOV              A, B5 B8 H9 v; d" ~) e* Z
        MOVC             A,  @A+DPTR  @. }; X! t7 T+ _
        MOV              BUF+3,  A/ @$ y) D* M7 W2 c" U4 k
        RET
  D3 ?1 W2 V9 ^
8 e. M/ E# v5 a ; ---------- 检查闹铃时间处理子程序 ----------! ~. Y6 T8 Y) I! I) w

6 `: H% j# S/ `4 C' v' ?

) C) I( N$ H$ L$ s& S) G# q) t9 Z ;检查是否启动闹铃  U* r- S" |* }: I6 d. I/ R
  TIME_PRO:
1 f" o, V7 U5 H5 A2 e& D        JB        ALB, TI3
* }+ }$ y3 X- Z' x- S        RET& O" G7 U( ?6 u
; --------------8 I, a3 n  o/ r+ E% E8 O1 C
+ |: J$ R' E( i5 ?( a7 h

1 L3 V# j9 O" L7 C ;检查闹铃时间是否到了; y3 k, o1 H2 P6 a3 s
  TI3:: N0 @! \" y5 Q' Y
        MOV              A, HOUR6 H" Y; g9 H9 J
        MOV              B, HH
1 f6 Y, [  i) J" R        CJNE             A, B, BK                ;检查闹铃小时时间5 J9 W3 c( N  W' Q
  ;-----------
3 X% r+ H. M! Z1 Z& o! I. v% N        MOV       A, MIN" J% t/ V7 t0 h, }
        MOV       B, MM# z) e  X( k3 t3 Q# O
        CJNE      A, B, BK         ;检查闹铃分钟时间: f: h* ~" M1 `0 O3 \3 s2 `2 l- I
   ;-----------+ n8 b4 `( ~" H  h) C, |  [
        ACALL            TIME_OUT              ;调用执行检查闹铃时间处理子程序2 r6 o+ o" F: P
  BK:
; j# u9 t) m' \% z4 R8 A        RET& Z7 b. k9 ^$ m) p6 u

# ^" i/ J) w9 x1 a
  I2 u! y/ M! c; f" F
;---------- 执行闹铃时间处理子程序 -----------, C3 L! n% [1 F7 H, H
+ d( I, H0 W0 z( \/ i
; y' C- A  z0 R* \+ Q
  TIME_OUT:                                ;所设置的闹铃数据到了
6 G, A+ t: O6 Z   X1:  ACALL           LED_BL                ;LED闪动
% q: t1 G' X' g! {6 J         ACALL           BZ                     ;蜂鸣器发声$ @" Y% V4 Q2 O+ N2 x7 w( C/ R- B
  ;按下K4键停止闹铃
) G9 i/ x* V. n* m# e         JB        K4, X1                  ;等待是否按下K4键
/ b* ]8 k5 `6 V) N- b4 F% B         JNB       K4,[        DISCUZ_CODE_2        ]nbsp;                   ;若按下键,则等待按键放开6 U5 [% a2 |' g
         ACALL     LED_BL                 ;LED闪动
. _) [7 a. E( K4 Y( r         CLR       ALB                    ;清除闹铃位
" C9 {* D* S) i1 t; r         RET: B8 Q8 j& k' A
; -----------------------------------
% }# z9 x3 t# x/ q# h     
9 m' a' [& |' ?- E4 F" q* [: _ ;******************** 增加倒计时程序部分 ***********************" Z1 B% X1 v) o/ u

$ K' V8 d! U' [! x/ q7 Q. L
. O! t4 f* N& x- x
;----------- 设置倒计时时间子程序 ----------7 Y; i% \6 l8 `+ B, O7 `1 H
;设置倒计时时间- ~) [. r5 Y) V6 A
  DOWN_ATIME:
7 B8 `% [) i( t& }2 p1 j         CLR       TR0                     ;定时器工作暂停
; K7 e+ X' k/ ^/ k         MOV       HH, #0
2 J; U! z# \4 y% O+ d         MOV       MM, #0
! ?6 {$ _  f0 }8 c8 i" bMOV       SS_D, #1         ;秒钟变量为1" b; j" _* P/ F
  S0:
4 ]7 m  P, U0 y7 q9 M+ b# l% U        ACALL     DISP                    ;扫描显示
. D, W+ e2 D* j4 }1 n   ;-----------) ~9 N, C7 [, X( Z! I( E. }! [
;按K2分钟数增加
# n. r9 R: M* ?! d% n( I8 {         JB               K2, S12                  ;未按下K2,则继续扫描3 @, {4 L& Y8 b* @8 E% o
         JNB             K2, [        DISCUZ_CODE_2        ]nbsp;                   ;按下,则等待放开$ ]* V7 e" m+ y# S6 ^

7 {- t9 [9 p' \. w6 z& w3 f+ T         INC       MM_D                   ;分钟数加1
" w5 C9 K- [& {' V' ]         MOV       A, MM_D2 p# p* x! D- P% `! R
         CJNE      A, #60, S11            ;是否60min到了& S8 l/ H; c/ \4 i8 _  v8 ]; l
         MOV       MM_D, #0                ;分钟变量清0/ f7 N1 Q* _. I6 M% Q+ J
  S11:' z# S2 n. }$ K% m
        ACALL  DOWN_CONV                ;显示倒数的时间
, s2 B) o) }* x9 ~5 Y% n( |8 v        ACALL            DISP                     ;扫描显示
' L0 j3 ]/ v% ?& a$ R! O; @        JMP               S0                       ;跳转到S0处运行
. K7 N! ~: u( ?! J& _  ;------------- C8 I4 ^( e8 G# c9 r3 ?
;按K3分钟数减少
4 G! G1 {. U8 q* B/ u8 j& }6 S  S12:  JB        K3, S2                  ;未按下K3,则继续扫描3 B: v0 e% F0 q. ~
        JNB               K3, [        DISCUZ_CODE_2        ]nbsp;                 ;按下,则等待放开
* w, W% W5 p- K& r- ^
0 t5 H9 r) y5 a+ o: H3 D) A! X4 ~

0 B& h  M: H# k' q3 |        DEC               MM_D                   ;分钟数减少10 ~) L: N6 o  U4 M* P1 ^* H
        MOV              A, MM_D         
# s: ?* b1 M7 K7 z6 P$ M        CJNE      A, #0,S21               ;判断是否为0
) G* @$ A4 {* p6 n; W8 a% H! P6 Z; m: f        MOV               MM_D, #60               ;分钟数赋值为601 T3 J9 B8 C) K2 L  h9 r$ V
  S21:/ ]( g2 U* Y' {% i& L; ]
        ACALL            DOWN_CONV            ;加载倒数时间数据
* h5 P: Y, h, `0 a3 _  x  _        ACALL            DISP                     ;扫描显示
% q# A$ t, e1 R; T# h! J        JMP              S0                       ;循环执行! S& {  h! t5 n6 R
  ;------------- x- p9 x. u' L8 c& I$ l
  S2:   JB               K4, S0                   ;未按下K4键,则继续扫描, c# s# `( ]/ H# H) Y6 c
        JNB              K4, [        DISCUZ_CODE_2        ]nbsp;                   ;等K4键放开
% V( A9 c- d5 O5 ~$ k) b+ F/ E% i  ;K4设置完成6 A0 G& Y  O9 O- L; y7 U1 D
        ACALL            BZ                       ;响4声
3 [4 P9 t) a  _; Y( |        ACALL            BZ: ~1 e2 n+ H$ D* E
        ACALL            BZ
  B, C; x( }3 _2 \  X7 D- J        ACALL            BZ0 Y* O8 C& l6 k. V5 x( i' Y3 b- [
    , y+ }' L/ o( u$ e& O5 O
        ACALL            LED_BL                  ;LED闪动
8 ~* U0 e) J+ m" x" J        SETB             TR0                     ;启动定时器( A! Y- ~8 q% t# {8 k3 F
   
8 E0 W2 ?# m5 t6 K/ g  S3:
  w9 K+ }  l( d- v* a$ D: D) {        ACALL            DOWN_TIME             ;检查倒计时
' Q' Q( A. l& H  h6 S6 b/ t        ACALL            DOWN_CONV            ;加载倒数时间数据1 `% L' s; f3 v& |
        ACALL            DISP                     ;扫描显示$ o3 A3 \2 R* ~* @( m- ^/ T. w
        JMP              S3      
& ~. `3 N% u' G5 o1 Z        RET: i, c8 y  K# t. S+ T( ^  K, B5 W
   
# i9 h( b* [3 @; L; Y$ d) G  ; ----------  加载倒计时时间子程序  ---------
: P- [; L+ I* _( j- o: [ ;显示倒数的分钟数7 h  ^+ X: Y/ {9 ^. O
  DOWN_CONV:
5 k3 P: z( k7 F* |        MOV              A,  MM_D
1 X/ E- x; C0 \: w5 u8 z        MOV              B, #10                   ;设置被除数9 t" ~" g$ {9 T5 ~: S6 \; p
        DIV               AB                      ;除法运算,结果A存商数,B存余数9 ], f4 t- X/ }4 Q- p3 C
        MOV               DPTR, #TABLE           ;查表转换
3 u+ P8 Q- O2 {8 t5 U        MOVC             A,  @A+DPTR
; k5 B+ T" ~0 w$ R+ m2 A        MOV              BUF+2,  A               ;商数存入BUF+2! u) Y+ D6 A! g4 o+ G
        MOV              A, B                     ;余数暂存入A) p4 K7 U- D8 A) v
        MOVC             A,  @A+DPTR          ;查表转换4 o# x4 x" o1 ?; W. Z& f$ V  N
        MOV       BUF+3,  A              ;余数存入BUF+3# R) L2 }4 O: ?% Y
        RET
, Q- ]- T, R. T
+ k3 j- G: u* f ;------------- 检查倒计时子程序  ------------8 x) N3 q- k; j8 G0 W7 z; Y' `6 D
;检查倒计时# S8 h6 N5 P3 X
  DOWN_TIME:                              ;检查是否倒数终止0 @  v2 e+ B  Y) s" R4 p9 s1 N
        MOV              A,SEC                  ;加载现在秒数
+ F( N: m+ [) Q; `% t  c) s        MOV              B, SEC0                 ;载入旧秒数; x- i. d, b6 z6 ?. z( M* i" n" D% r
        CJNE             A, B, D01               ;是否过了1s& }: x9 z4 H4 x* E7 L
        RET
4 ^4 X: q) {1 h( r6 S6 D& r ; -----------/ z! ~) R& `4 Z+ s
  D01:9 d; K$ J3 ~/ D6 |/ q9 i! Y
        MOV              SEC0, SEC               ;记录旧的秒数 6 L, G  H: D4 k. f5 z
        DEC              SS_D                   ;秒数减1# f% i8 H* t# t% J& }
        MOV              A, SS_D4 j2 K% q+ j3 Z2 K' j. L
        CJNE      A, #0, D11              ;秒钟数是否为0& N$ x/ H5 X% r: l
        MOV              A, MM_D        3 j: L' ?, H$ P8 A
        CJNE      A, #0, D12              ;分钟数是否为0, s( _$ T# @1 b: ]. Y
  ;秒钟数为0且分钟数为0,则倒数终止: {" O! h. y) A/ O
        ACALL            TIME_OUT              ;倒数终了处理程序* C& l' Y0 I1 e; Z  t; @% \& M; w
        JMP               LOOP      + G5 ]5 d5 X! E( p( t: h
        RET  7 l7 p, C! q: q" N6 p# s( Q. C5 x
  ;-----------$ g" Y; W6 ?3 `# P& [) I; F
  D12:  r: q) W; s6 |! s( G: y+ ^
        MOV              SS_D,#59              ;秒钟数赋值为59     / b# O: y" T# T; u1 _/ H" g7 \
        DEC              MM_D                  ;分钟数减15 {) Y: I- \, B' q( g/ B

' @/ C- Z: l1 G# _, C, {8 p3 O' l6 D  D11:
5 Q, T6 z/ w" @8 F        ACALL            DOWN_CONV                   ;显示倒计时时间
# R% f2 O+ d" b- ^  j! C        RET8 `" L" I, O8 D$ V- c6 e7 I6 P' M+ f$ |
;----------------------------------   , x2 S/ \0 T: N; p3 h4 S
        END
, s7 B! f; C9 T; q) Z;-----------------------------------------------------------------; o9 J- f; A% w6 o. v: N! z) `: s$ W2 g0 l
  @3 ]1 k& o% h' D+ R
1 J" ~8 D! g" j* N+ S7 U3 _

+ A# L7 n3 Q7 \; }$ d, P" Q单片机c语言源程序:" O9 U- M  \: v! P
// --------------------------------------------------------------------------------------
% A; L- c& }% R0 [9 n4 J3 F// 文件名称:SZ10-1.c
( n6 \5 R. h- {0 Z; ~) I// 程序功能:单片机时钟                                            
2 a$ t- w+ u1 N// --------------------------------------------------------------------------------------" D3 u9 ^$ N8 d' `% @4 {& }  J2 p+ l
    #include <reg51.h>                   // 包含器件配置文件 5 S4 X* L8 F& o2 }5 T
    #define uchar unsigned char( V) @% P, t' l; N- L) b
    #define uint unsigned int5 R  O" K5 }- R) B4 W
    char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
- _# V) r8 K& `) p7 l9 p/ v% P) U$ c             0x92,0x82,0xF8,0x80,0x90};  // 0~9的数码管段码            
3 q4 a  k- j; s( I) V4 m        uchar hour=0,min=0,sec=0;                     // 时、分、秒单元清0
- a" S! |% K, _3 ^    uchar deda=0;                                            // 5ms计数单元清0  
& }1 z3 X% }6 K; d    bit d_05s=0;                                     // 0.5s标志   1 ~% }0 L& N; X4 t6 U  g1 N
    uchar set=0;                                                 // 模式设定标志 $ c9 ]( x+ u5 n. d& g
    uchar m=0;
4 U+ |, C- N* u2 U, @    uchar flag=0;                                             // RAM掉电标志 1 }, O! v! ]3 u$ k
    void delay(uint k);                                     // 延时函数
" J6 J" R! K! u- x3 m* W3 u    void conv();                                                    // 走时单元转换
! |7 p1 |0 |. S& G7 Z) b    void disp();                                             // 走时时间显示函数  4 p5 L3 X7 E; }7 {
//-----------------------5 [. T- B9 o8 S
    sbit K1=P2^4;                        // 按键K1引脚定义1 E4 h; O- o* k4 M. f$ U
    sbit K2=P2^5;                        // 按键K2引脚定义
) G$ v/ a# v1 U" E    sbit K3=P2^6;                        // 按键K3引脚定义/ V, v* ]! v' R3 p' U/ V" r8 b
    sbit K4=P2^7;                        // 按键K4引脚定义) j8 w+ E% n( z$ U; }1 z# M# q+ s
//-----------------------  
8 D- x. g) e/ N, i; A1 H; j# F    sbit SPK=P3^7;                       // 蜂鸣器引脚定义$ @- i# ~  u  v8 d8 |1 J, Z3 g
    sbit SET_2=P2^2;
  R! J0 ]3 X0 B    sbit M_D=P0^7;
% b1 L/ k# d! i' q" ?6 O
, @# s" T4 Z& I% j7 f0 H/ B7 F// ---------------------------- 定时器初始化函数----------------------------
2 v9 `; u5 ~0 _6 k
/ a" d: a8 F4 g4 I8 `3 V2 t // 定时器T0初始化 / x( k8 K" t9 C8 ]& [
   void init_timer()1 J, `3 D" S1 v
    {1 r" Z+ ?' m2 k2 A$ {
     TMOD=0x01;                               // 设置定时器T0工作模式为1
! k- w' O8 x! _8 R     TH0=-(4800/256);                          // 加载高字节计数初值   6 D9 @2 {! j  Q" m
     TL0=-(4800%256);                          // 加载低字节计数初值   
9 v. E! G% u+ @2 B2 h$ m6 k     IE=0x82;                                  // 启用定时器T0中断产生 & ]! m! I$ A( g2 V
     TR0=1;                                    // 启动定时器T0开始计时
" }7 a+ Y9 B: w% j1 T% X4 H   }
" v6 p6 \0 u$ V) E1 _
% i1 |$ x2 L! w  q$ M7 U4 l' H// ------------------------------- 中断T0函数 ------------------------------
0 \0 Z$ S  V* |: Q* \8 v7 a% h! E9 i
// 5ms定时中断2 x5 N. h+ V/ O7 m
   void T0_srv(void) interrupt 1
7 H1 i3 w# [$ h3 C$ B. y8 g   {
: g2 J/ `9 _* ~1 T     TH0=-(4800/256);                          // 重置定时器计时初始值   6 Y, j3 f3 _# B% N7 x# ^& B# T; U
     TL0=-(4800%256);, G+ Q$ Z  U8 `* X( }% Q1 R
     deda++;                                   // 计数单元deda 值递增 4 @0 T# B2 [# l4 W$ N2 c: p, H
   }                                   
3 g& l" w$ Q7 \: h2 o  B( j0 b) i  W7 b5 D: a
// ----------------------------- 走时单元转换函数 -------------------------2 ^! B& Y' L' O# ~' g6 P4 s

6 o% z+ S$ k1 [6 o  // 时、分、秒单元及走时单元转换
  S9 t. |4 r4 R% \   void conv()                                                   , D% U  f. ~- t7 q5 _7 T
   {                                          
: z1 I7 t: v6 \$ d    if(deda<=100)d_05s=0;                      // 秒位标志,每秒的后0.5s置0 , }5 i! D7 y2 u2 k
           else d_05s=1;                     // 秒位标志,每秒的前0.5s置1 7 Z$ {5 g8 _' c6 ^
    if(deda>=200){sec++;deda=0;}              // 中断200次秒加1,deda清0 + g6 b+ U3 g# \7 w# N/ x! [
    if(sec==60){min++;sec=0;}                 // 秒满60次后,分加1,秒清0
' W* q/ `# N- S    if(min==60){hour++;min=0;}               // 分满60次后,时加1,分清0 7 h; F" T1 p, T4 b& s
    if(hour==24){hour=0;}                     // 小时满24后,小时清0 */% Q% T1 a$ ]) T
  }: ?" O) a7 T, W
- r- J8 t% d. H7 o! D/ T
// ------------------------------ 走时时间显示函数 ------------------------9 A/ }) i2 E! i% `( b' a
$ x4 O5 j- W) S8 J( D2 h, e
// 走时时间显示
- |9 Q# s; a% ~3 H$ B  void disp()
1 W9 \7 Y! ^; S1 h( H8 p  {4 x( Y! s: {& S1 V$ a
    P0=DATA_7SEG[hour/10]2=0xf7;delay(2);- j; e5 |) F0 c: m& F8 j
    P0=DATA_7SEG[hour%10]2=0xfb;delay(2);
& V' k: u2 v) M9 q4 [, ^# v+ v    if(d_05s==1){if(SET_2==0)M_D=0;else M_D=1;}
3 @& O: {  ]$ ^( J. t: c    delay(2);4 _# B6 G/ V! e9 B4 q/ T' k
    P0=DATA_7SEG[min/10]2=0xfd;delay(2);
* X6 q3 e+ [* w2 Q* P/ w' h    P0=DATA_7SEG[min%10];P2=0xfe;delay(2);
! i2 Z5 v, S' w, l9 I: j  }! `7 B& A. X* e" \6 f$ K
6 U- X: M2 `8 ^1 ~  {6 w: J" m
// ----------------------------- 调整走时时间函数 -------------------------8 B) w' ]; Z+ p6 {* B
2 O# x0 K7 p3 m: F6 h+ l4 e
/* 调整走时时间 */
( a' a3 t: ^# R  Z/ t   void set_time()
: f) d  u/ M5 D3 b" W7 L    {; ?3 T8 c. q; A( Z5 D
          uchar m;
7 ^4 g, X# \8 b% W/ Y- L$ s5 {          //TR0=0;
$ n3 x) t) u7 L, b5 }7 ?          if(K2==0)delay(1);                      // 按下K2键,消除抖动  
5 N/ ~& ~0 w, ~2 K    if(K2==0)hour++;                           // 小时数递增
! ?  L, m. h, n7 V8 U) l9 @$ N          if(hour==24)hour=0;               // 小时数到24,从0开始 5 Y  ~4 [$ E6 l# F# Z; y
          for(m=0;m<30;m++)                 // 循环30次 . ], A9 ^1 K/ J
                {6 a9 [& \  ?# ?! g+ u! `
                  disp();                       // 调用disp()显示函数 0 s, ?2 @8 v$ k, t& m! h1 V
                  if(SET_2==0)M_D=0;                   // 点亮U2小数点(秒点)
: j- v0 {0 H8 f6 t0 E' T                  else M_D=1;
6 A- q  X" W" ~8 H6 f( s) g                  delay(1);                     // 调用delay(1)延时函数
9 j$ g/ N0 U- O7 k                }                2 _! ^1 m0 ]3 i; O+ @, L. C
          if(K3==0)delay(1);                     // 按下K3键,消除抖动 2 Z. n- v5 U  {2 M5 ?
          if(K3==0)min++;                       // 分钟数递增 1 p) O' T: l9 `
          if(min==60)min=0;                        // 分钟数到60,从0开始 , ~" Q8 i$ O1 K8 n9 h0 L0 i
          for(m=0;m<30;m++)                 // 循环30次
7 z1 @' h2 ^4 K4 V                {
+ S& p$ j$ R: F' i3 u% Y7 c2 S                 disp();                        // 调取disp()显示函数    % S4 O6 P0 P! r7 g- z  }
                 if(SET_2==0)M_D=0;                    // 点亮U2小数点(秒点)
: a" y# o5 N5 h; i6 b& K                 else M_D=1;6 r. k8 G% f9 n; A/ Z# W- G
                 delay(1);                             // 调取delay(1)延时函数             # i5 S0 X7 S( A4 W0 a8 a
        }* `# R( m( l0 B0 S# g% l' V
5 U- Q: d2 p9 k4 E7 w% t
  }
( A. A+ G5 E9 F. ], a! M  Y
7 }' T. |; a! w9 X4 N  z // ------------------------------ 走时函数 ---------------------------------
" {  D3 G! a5 Q$ }8 Y# s# H- p$ b, c9 y. q8 c! t  Y5 ]
//走时
$ t4 p( Z4 H1 P" s  x/ @& d- ~8 s   void time()              
3 i% I- k  y8 `6 S) U" |7 a  {                       
0 V4 U& Y  f" m    conv();                                           // 走时单元转换
0 E( g* h  j% p5 D& d    disp();                                    // 走时时间显示函数
  @, P# r2 w: B: ?! v, c  }                        
: c: O5 C: b' U
- J  u+ Z8 c/ b5 }2 i* \# W! h7 z8 D // ----------------------------- 按键模式函数 ------------------------------
5 b+ d% U( V8 d$ ?1 m5 O8 J; A5 z  L' x1 D, C$ u# b2 X
  // 扫描按键次数! c0 V' }! s1 q" n
  void scan_key()
9 ?, \' }+ I: k9 Q8 E  {0 J2 n% G3 p, e& X+ S
    delay(1);                                 // 调用延时函数 % V% U, J" L0 d6 d" V
    if(K1==0) set++;                         // 按一下K1键,set 加1
+ j* d, m( K9 Q0 o+ e4 s        if(set>=2)set=0;                          // 按两次K1键,set 为0
; f  t0 r9 }' e! {2 I: G2 Z- b6 e    if(set==1)flag=0x55;                     // set =1,flag等于55H    9 k, s6 T6 \% C( _
    F0:if(K1==0)goto F0;                       // 按键未释放,在此等候   ' U3 M2 E; @3 r0 _; h2 }
  }
9 @5 |( E: h& K* s4 ?; {! J4 f" i3 u, ]' Y
//------------------------------ 延时函数 ---------------------------------        - I+ Y6 k5 O1 q
" ]' z: m5 h+ B
//延时& [% v' C+ L, A2 V6 `
  void delay(uint k)                        // 总延时时间:1ms k
' a8 O! v; x: d; Y: a   {
8 {5 ]0 S2 o# R+ s+ A6 @# `' b8 h    uint i,j;                           // 定义局部变量i、j  
' _8 W! w$ I4 T: I; [    for(i=0;i<k;i++){                         // 外层循环 + m# p! A" z4 C0 q; u/ f
    for(j=0;j<121;j++)                       // 内层循环 0 ^3 z0 c% F3 g" J
    {;}}
. E; h- l( @: h# c6 D6 o   }
8 H* ?) ~; e: T7 k" I8 B- M
6 ]. J; f' S# T# ?//------------------------------- 发声函数 --------------------------------
! J' G; U6 P0 \4 [" y3 X( e9 i8 y9 S; H, [* W3 q! N2 }0 ?
// 发声 - P4 j7 y% J' h0 E/ a4 m
void  fs_d ()                                         + K" e) B5 M: n+ _
    {   
6 E4 s* S, U9 T- `% L/ @0 O0 a      unsigned int j,y;                 // 声明无符号整型变量j, y        : t7 M/ [8 }) F
       {                    
# E" r  _" X- K- ?* T         for(y=0;y<1000;y++)            // 循环1000次,嘀响0.5s
' `  W" z$ m$ u! ~2 h0 V: h. \          {  0 T0 p- c) w9 r; n# X
            SPK=~SPK;                   // 反相输出* ]4 A+ T8 ?' V. l4 c/ `
                for(j=0;j<50;j++);          // 延时500μs9 }5 N9 k, j* z2 g1 g
           }  4 ]0 a( ~% l1 O# {& c% ]9 W
        delay(200);                     // 停0.2s             $ p7 Y: c: q8 T( J
      }                                          
/ c* t$ b6 _, k7 b; Y   }
1 U% S+ k3 i) Y8 S0 B- C' G  K3 n' ^9 ]/ o5 N4 |
//--------------------------------- 主函数 --------------------------------: g- z, D& f6 G( q% f
! P9 ?; y: k' x2 ]8 |# s% S! Y
  //主函数
# o4 y. H9 j8 L) I: U, R& f   void main()8 R$ P& n7 n4 _7 }" I1 o
   {                             8 L0 M5 W. m; u3 }. @
     init_timer();                      // 定时器T0初始化        
$ d$ [' T" u) s$ [$ @     while(1)                                                  // 无限循环 4 q" @) z5 i8 f4 ~
     {
  _" Y5 [" s  h* W, d       if(K1==0) + `: |1 D, r+ u  f( w
           {  6 \" U  e% t. w; o* x4 H
             scan_key();                                   // 有按键,调用按键扫描函数   9 h8 f* k+ W$ u# X3 h3 b
             fs_d (); : E  Y; C- b* a
           }           
9 h) o0 b2 m6 W           switch(set)                                                // 根据set键值散转 * ^0 k9 [: j+ S. D7 N
        {                         , S  S1 H! Y% Y0 {5 H
          case 0:time();  break;                 // 走时时间程序         ) U8 j; f9 I3 u) k' Y4 }
              case 1: set_time();break;     // 走时时间调整
! j8 X/ ^) S+ y, z1 B' F! D1 Y          default:break;                                // 其他,退出   
, h4 J% b/ G/ \, A5 N# u) }$ k- U        }                                                  
# c+ ]& U" \+ d+ D       if(flag!=0x55)                                       // 判断掉电标志             4 O$ p6 I4 a7 R9 [- B3 K. L
        {         
7 Y( s" r' r, |  p( ^& O+ N         P0=0xc0; P2=0xc0; delay(200);        // 点亮4个数码管  % g$ l8 @4 y' l( ^* u
             P2=0xff; delay(400);               // 熄灭 4个数码管                                  9 o2 Z# n& `; ]3 B" ]1 F/ W
            }
7 ~" y1 y: X. Y, @# l           }$ f, {4 Q- J2 R0 B
  }
" w7 t- h) c) _# q9 |
& E+ @2 e6 `0 F: U: r1 Q$ u6 `…………限于本文篇幅 余下代码请从下载附件…………
$ X9 R, a) [9 E- ]. z2 y, g, g/ g4 A& O# Y
下载:' k9 C! X' a  N4 @
游客,如果您要查看本帖隐藏内容请回复

9 O4 R. h' b! Y! n

9 t0 g" o& a; t2 A& T' C

4 K) O6 d9 c3 Z0 Z4 [7 b

该用户从未签到

3#
发表于 2019-5-20 11:13 | 只看该作者
学习学习·
. |: I  |3 F- t5 w" U0 s' A, t/ l
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-22 15:25 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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