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

电子钟(可调节时间)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
电子钟(可调节时间)  G. c4 f! J7 r

4 @. Y" F1 I- U2 g1 E2 w

$ g/ ?0 Y$ y8 |" ?9 b7 I
#include<reg52.h>
8 D3 @' p  f5 C( q- Osbit KEY_ADD=P3^4;  //定义按键输入端口1 W& {% M9 W) X% _) ~! q3 g
sbit KEY_DEC=P3^5;. c% b: ?2 G! s2 E+ o, H
sbit k1=P3^6;
. Z6 x8 e% l1 H/ zsbit k2=P3^7;$ q( |- u, [7 u4 O. O2 Y2 e8 B" A
sbit k3=P3^4;0 ^3 J3 Z( t$ d8 v
sbit km=P2^0;8 v9 P$ C/ V6 a1 X7 u+ y
6 s9 {$ C7 R* _
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换' E' D, N' p  U1 }9 D; h2 c4 ~
sbit LATCH1=P2^6;//定义锁存使能端口 段锁存- d/ m& Y( [: K/ V1 {3 _/ D
sbit LATCH2=P2^7;//                 位锁存
8 j: Q; J; Q, v9 r1 `2 r0 x/ T& W8 O6 {6 I0 U) v0 R7 ]: s
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
% @6 z: b% t  h8 B: z" Z+ L9 E7 junsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码! I7 ?8 p2 e* u8 N: ?
unsigned char TempData[8]; //存储显示值的全局变量! a. C% w3 Z- i4 f

0 x) o9 Z2 U: p2 x6 V" q) b$ _char h,m,s;  //时分秒" v. G5 Y3 T, d3 I+ S4 Y
unsigned char i;
/ o6 }' d3 p2 _" J& L, x, P: @8 F, z- A" @5 ~2 Z6 B! }* O$ J, V
void DelayUs2x(unsigned char t);//函数声明   B+ x9 n" U7 q( E1 m. L$ D
void DelayMs(unsigned char t);1 p) k  `+ e' x, W/ V( ^* @; X
void Display(unsigned char FirstBit,unsigned char Num);
9 I* _9 v3 D# \: Pvoid Init_Timer0(void);
( }# o8 j3 T& ?2 q. e1 q7 X6 |/*------------------------------------------------& b9 R# t3 `3 L. b. V5 B
                    主函数
: h( s0 l1 N3 S# i5 Y------------------------------------------------*/
- J! }3 ?& [  s& ?$ C; V+ N( Qvoid main (void): i; C# J% |" P$ h8 m
{2 n  v( E/ t/ L7 V5 a' V2 S
        unsigned char num=0;                  
* X  K3 \6 ~4 ~& @        KEY_ADD=1; //按键输入端口电平置高
3 x$ K0 C" ~  u. V) F4 h        KEY_DEC=1;6 K0 Q4 o9 z, u7 [: p4 M
        Init_Timer0();* }, e: t' ]3 t8 A, z
7 @* ^/ c' f9 h
        while (1)         //主循环+ }/ j& E1 f5 d7 L" G- s
          {
# W2 A9 u6 w( t5 y; A1 N+ `                  if(!KEY_ADD)  //如果检测到低电平,说明按键按下
( B3 l( W" d0 t' B/ Q- h            {
4 T( X+ l0 Z4 ]                         DelayMs(10); //延时去抖,一般10-20ms
( s9 j8 d% b3 z& |+ d/ S                     if(!KEY_ADD)     //再次确认按键是否按下,没有按下则退出
( N  Y4 ^! [7 v0 ~9 N  ]3 H                           {
% k7 S1 Q6 n+ F4 w                                while(!KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直执行数码管扫描,防止闪烁$ Q3 I$ p( x2 R3 C/ Z7 o
                        {
! u$ A) d. e. V7 l' o+ {! q9 J" U+ X                                  // if(num<99)    //加操作) N9 d0 Y0 R( P: i! b8 a0 v
                               //   num++;+ w; w. X+ w# E' x% b
                                           h++;) }8 q; B% r1 H1 z" s# b
                                        if(h==24)3 `3 d1 m# P. S4 n+ ]% u. s$ m
                                                h=0;: x0 S- Q$ z$ K4 u$ N
                                        for(i=0;i<30;i++)
+ L  S* q; q! Y# f                                        {; ?* E' P' ^. L! f1 B0 C
                                                km=!km;
# p4 B' T0 u/ ]' A% d0 `                                                DelayMs(3);# l) {- N9 C3 y( Q3 V8 c
                                        }7 R. L/ V6 |1 Y# b7 E1 z
                                  }
8 ]: g2 v7 a9 L# s6 T; S% n' ^& h' e2 ]$ }                    }/ a" v5 q& }! x  @. h% T6 B# q+ e, i
                }( J) U( j% B* o* k
7 i/ z5 u9 g, u
        if(!KEY_DEC)  //如果检测到低电平,说明按键按下
. U* I& v6 L. d( w    {
4 e0 V" V5 c4 e4 A9 B         DelayMs(10); //延时去抖,一般10-20ms% R" y+ ]/ g9 i. W: U( U
     if(!KEY_DEC)     //再次确认按键是否按下,没有按下则退出2 z; N, ], a$ S  B
           {
1 V1 ^" |: g8 C* ]1 e3 U                while(!KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直执行数码管扫描,防止闪烁: O( ?! }8 {1 w' \
                       {( r) X* O3 j- e! @2 p- p. l
                      // if(num>0)  //减操作
) Q; {0 m6 p$ v' }) G                        //  num--;- x9 T! e& G. C% {# Q
                                h--;
! r  b) w/ V6 o9 [8 h                                if(h==-1)
, w1 [: |) j5 j3 I) I6 N5 h                                        h=23;5 ~8 E4 \' s! m* H5 r2 F
                                km=!km;2 i' @# g% k) n( @( I
                                DelayMs(20);
1 c( l, p, H) O4 s/ N2 I5 ^0 O4 G                                for(i=0;i<30;i++)
( U2 m+ P, w9 V! e                                {
. s* U( o+ w% ]3 K6 N                                km=!km;
( s* d0 m8 c  x* q2 q$ j) ]$ ~* p                                DelayMs(3);
% Z' y5 q# o; O. X                                }$ S% N! ?/ I% S
                         }6 {. W# W5 }0 ?7 s
           }
% d3 n5 X; V, Q7 W        }; d0 [/ g* X0 s
        if(!k1)  //如果检测到低电平,说明按键按下
3 w7 O7 T0 i: G7 O7 ], h$ e9 ?    {
! A4 d0 q' N, g+ g; N, U# L         DelayMs(10); //延时去抖,一般10-20ms5 d# U6 N" f, Z+ C
     if(!k1)     //再次确认按键是否按下,没有按下则退出
! _& z' G2 Q$ D' |( l3 z# \% O- U           {
6 i8 x; Y" Q. A- p+ @% i        while(!k1);//如果确认按下按键等待按键释放,没有释放则一直执行数码管扫描,防止闪烁
2 t: K6 r  z8 Z5 m2 d$ b+ E               {
; |3 I4 R3 `/ J3 m                                   m++;
) h6 r: X: t* c; @/ K- d- Z+ v                                if(m==60)4 h: F) c7 p. y* o
                                        m=0;% E: _. N" t# m7 ~7 ~
                                for(i=0;i<30;i++)
2 d! b! z8 U* m2 t( [. U                                {
% S0 [3 Z! j2 ~: K6 f3 N                                km=!km;4 b# X. K6 J+ w, {- ]! j
                                DelayMs(3);  C9 N1 H9 _( w" R; k' e
                                }
1 y$ ~5 X1 I4 x/ O9 O! i2 n                         }
; L0 m% v" C) B$ F' ^) u& G; e           }
; C$ u8 P" x/ ]& n2 l( c4 H. K        }* W" X3 F3 I; ]4 G, ~) M6 r4 G
- {3 W& H& ?' [: K. @. T& v9 i
if(!k2)  //如果检测到低电平,说明按键按下
! R2 w# W) a1 B+ b0 R; Y    {
% O( t% I4 g! e! s% n9 ?# B% p0 \; R         DelayMs(10); //延时去抖,一般10-20ms
2 a6 x) y, }' c7 i9 y6 f0 v     if(!k2)     //再次确认按键是否按下,没有按下则退出
: a# m4 E4 N# w4 o           {- _3 R* w# ^1 Q0 J$ y+ ~
       while(!k2);//如果确认按下按键等待按键释放,没有释放则一直执行数码管扫描,防止闪烁
5 i7 B2 C  ~, l( e% E2 o               {, c7 ~3 Q6 c5 T& C
                                m--;
/ y2 ?9 K7 N: o- I2 C4 ^; d                                if(m==-1)
- d. A( D$ H7 g" i& n                                        m=59;
" M- I/ A; D& u8 C- W                                for(i=0;i<30;i++)9 x" Y& J) j, a2 H) p
                                {. M( \( y5 w" D' G) h! I& T& j
                                km=!km;, t$ Y2 k9 _- R) c6 a9 J
                                DelayMs(3);
; S) A0 ?: B  y& F# ]                                }
2 m6 ~" C5 j8 c. E7 f. C                         }
+ o7 Z9 |3 N) p           }
: n/ ~  Q3 l* p$ X3 [+ u. t        }3 \/ S% `% [* F0 `+ w! e5 i0 V

/ M/ g, M. I8 Y' r9 f7 O; b; {//        if(!k3)
+ N8 {8 @8 S0 }, S0 C//        {
6 h) i# V  `/ z+ E  J/ B//                DelayMs(10);. q) O1 w7 Y7 ~
//                if(!k3)7 w: n8 ], g1 H; v
//                {# L' {7 q# O( K# q: I1 v
//                        while(!k3);) b6 ?  z! t% K+ X
//                        s3num++;
& o# V& f1 ~" J* I9 T: x& @# U//                        TR0=0;2 K2 \( Z$ {; n+ r
//; m+ o  w/ ]4 e, h9 @9 O6 l
//                        if(s3num==2)
/ _- R# Z  K5 o( ~//                        {3 x0 c9 @  O( w! b+ X) e
//                                TR0=1;
/ }  Y, i# f& J9 M0 v. W+ H//                                s3num=0;5 [- n' x/ S) F4 j
//                        }
2 k  i8 p- `" `% Z7 E* m: B4 M% O//                }/ S3 V6 N/ `+ M( `8 H" D
//        }0 `. g0 Y7 Z) F; L
//           TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  9 ?. [$ b3 \) K# Y$ e* w3 ?1 m  r
//           TempData[1]=dofly_DuanMa[num%10];/ ~# j9 u" K$ B! _* N4 K
//           Display(0,8); //显示全部8位
3 k8 \6 f0 C; A//     //主循环中添加其他需要一直工作的程序" q) A3 G; \8 j! v
         TempData[0]=dofly_DuanMa[h/10];! g$ W5 Q" m9 N1 ]5 x0 h
         TempData[1]=dofly_DuanMa[h%10];  _( m; I- U" I/ L; B: m0 i
         TempData[2]=0x40;! {/ x7 H' g: v
         TempData[3]=dofly_DuanMa[m/10];- Y1 ^4 ]9 D; m/ g7 X( G
         TempData[4]=dofly_DuanMa[m%10];% _7 D# n" C9 O/ ]7 N  Q9 G
         TempData[5]=0x40;
, P6 w) ~1 p$ e6 A4 H         TempData[6]=dofly_DuanMa[s/10];
) w% Z* Z  a$ N  N* }         TempData[7]=dofly_DuanMa[s%10];
7 k6 Z( `/ w4 ]* l, g$ }, Z0 _: D4 b; t" D. ]( i+ B! a
  }
6 v. L# ^5 m) E  A8 z* s}( n! ?+ `$ o0 g3 S7 j
/*------------------------------------------------* y% x. d  a$ e  F
uS延时函数,含有输入参数 unsigned char t,无返回值0 O' y/ r. p- T" O
unsigned char 是定义无符号字符变量,其值的范围是' m, Q+ s# w6 u) K% d$ D
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时, |# |6 T$ i2 k$ g- y
长度如下 T=tx2+5 uS
( h' i1 S$ }2 Y" L, d1 }------------------------------------------------*/
2 Z: P: G; R+ i8 A& x2 `void DelayUs2x(unsigned char t)
) h+ k  k9 z8 G{   
3 A4 Y# ^/ ?1 p, T6 Qwhile(--t);; ~! x* S4 Z  d+ G7 E5 a
}' s8 s9 S& ?2 d9 k# w& C9 x8 i
/*------------------------------------------------
: q- q8 u  M! qmS延时函数,含有输入参数 unsigned char t,无返回值
0 G+ P0 [' f+ [  I) eunsigned char 是定义无符号字符变量,其值的范围是
& G8 Q6 D; q3 ]5 x. l% @: N& ]- @! i0~255 这里使用晶振12M,精确延时请使用汇编
8 K' y2 S. v' G7 A- z  F------------------------------------------------*/
: L2 y# y$ J# X7 r3 [( ]void DelayMs(unsigned char t)
/ f3 }* H3 u! g& C2 ]{
+ f( }9 P6 O, ?/ g! b, A4 P6 g9 R  n" |
while(t--)
6 _# C/ f! U# ^9 P6 B; V{2 a6 y# i" Q  T4 ]* [$ g9 B
     //大致延时1mS
& T  c) M8 F! S+ e) [" ]     DelayUs2x(245);
, }5 ~* n. ~+ c' y! H3 x6 Q& g         DelayUs2x(245);
$ G1 Q- ?3 R+ Y: [; X2 I% m3 Y. c}& K  Y+ ~# d7 V# I
}; A' U: z- \+ E9 X0 M& f% ^
/*------------------------------------------------  \$ S5 g5 U8 V# |
显示函数,用于动态扫描数码管
- h& G/ j) N( Y输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
' L( U1 x9 ^/ t) q3 u( T如输入0表示从第一个显示。
  _+ |3 w$ t7 @& _# D* z2 o7 cNum表示需要显示的位数,如需要显示99两位数值则该值输入2
- i/ n( `- \% C------------------------------------------------*/% d; i3 ?5 [; H' Q' N
void Display(unsigned char FirstBit,unsigned char Num)
/ z5 t3 ]& Y( }, b{
0 M! k/ k2 I7 A6 u1 w5 V! }9 r      static unsigned char i=0;
0 _3 T& X: S( y9 s          * ~- C6 s/ K9 t7 l; S2 J

4 a6 k8 h: a) L7 I           DataPort=0;   //清空数据,防止有交替重影1 g1 z' s; d0 F+ X, L1 X
       LATCH1=1;     //段锁存& |& b. V9 O* m% u  D
       LATCH1=0;4 a* I/ R/ W- W
% e8 }' |, [/ f% h# `# N
       DataPort=dofly_WeiMa[i+FirstBit]; //取位码
3 s$ P+ k6 F, n7 g/ e       LATCH2=1;     //位锁存
5 A  s# _: H' y' p0 m4 |) r+ R       LATCH2=0;
# h& j4 L# h' o7 H
/ X* B/ T) q6 d; i5 ^       DataPort=TempData; //取显示数据,段码+ g7 |2 C- L2 t! V; _) W
       LATCH1=1;     //段锁存
! S8 l# }1 O) [) A$ ~$ w: t) Q       LATCH1=0;
- t- L5 Y. q5 J3 J
( }9 ^+ f: O+ n5 h5 y           i++;  q* L- G+ v0 h/ x
       if(i==Num)
& n( u8 ]5 |5 O              i=0;
6 m" k4 X5 Y: x& z0 R9 v% h' W$ g/ [2 f1 u- j' |* {& T) ?
8 V9 X1 f8 ~, }
}
! s# {& C2 g- L7 L9 l/*------------------------------------------------
3 ~' ?3 [, u! `% [6 w/ p                    定时器初始化子程序
3 D; ?( K- ~4 Z0 W------------------------------------------------*/( o) S9 p6 V$ F8 F7 S$ f
void Init_Timer0(void)' ?8 n* t) p/ r# M7 z$ j6 w) E
{
8 J2 L$ D) i3 MTMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     * |' j2 p* _+ A- l7 E
//TH0=0x00;              //给定初值' a# q. T0 {8 |6 D0 F  d
//TL0=0x00;
# i0 G/ c' W3 s* x6 tEA=1;            //总中断打开/ M# L! L( d, l3 O! g9 m
ET0=1;           //定时器中断打开& l' ~6 d! J2 Y8 J) ]; `
TR0=1;           //定时器开关打开. p( w  _8 |% M, C. ]2 E
}4 ]5 ~4 m( m. n% n' m6 j
/*------------------------------------------------- i9 F) J* h+ v- `1 V/ r
                 定时器中断子程序( ]' K% n. ^" D, {& I: K) t
------------------------------------------------*/. `+ f  z7 B" U; ?2 y2 d5 n
void Timer0_isr(void) interrupt 1
  E6 d4 K* y6 P# R; ^" H{
6 N/ S, X( P# I- Q  A7 M3 lstatic unsigned int t,q;
( }# f+ Q6 h9 @0 ~3 }' jTH0=(65536-2000)/256;                  //重新赋值 2ms
( I- Q4 I1 ^+ p8 B5 W0 F$ B, Z% DTL0=(65536-2000)%256;
: ~3 j# c* U: a' A( @3 |8 D8 \2 i
! |4 c4 W2 E, }% ]Display(0,8);! ~1 |3 d6 r  m3 Q2 |+ [& `! f

2 D( {# X" Z$ a* A$ gt++;3 X* G$ x' g$ Z" |/ ?
if(t==500)% Z/ I+ Q" k, q
{! f* @  m5 ]; j7 V( {' ^5 _
        t=0;" s8 b4 G( B, R) |
        s++;; ]0 [7 A& P! a* J7 h
        q++;# r4 F8 l1 `6 Z0 \! i
        if(s==60)) p" m$ a( h+ I
        {7 b. l+ I- _3 s% Q; n
                s=0;
2 q: _3 }! O+ _* |                m++;8 x9 i# s, O/ f5 a
                if(m==60)
1 d, v+ d6 e/ ^* w! p( K6 N                {
4 X! O8 B5 D7 k- y7 G% }/ w; r" z                        m=0;
$ v6 s7 y: m5 E; a4 {6 }                        h++;) ]7 R- |2 o+ O( `" R$ n3 b
                        if(h==24)
4 U# @/ j4 W! U# z. d                        {
+ B/ F7 U/ N9 _. s3 C                                h=0;7 m& {" b% T# w0 e
                        }
7 _% U3 R# |& q: l1 K, L                }
$ p5 i! ?0 @# w# I9 I0 q  I        }: K  ~) Z8 ]: a/ Q% Y3 ~
        if(q==1)+ Q( ?+ g$ M; |0 |, t$ V" s: S' @
        {: E: A4 u! ?: v& }) P) _8 V
                P1=0x55;
& o4 t: w3 M# E                DelayMs(3);* P! s" Q  [! K! @% a+ L0 t# R
        }! a- H, C7 O' \2 d* _+ r- O' i1 v
        if(q==2)
+ r& W' T! x$ Q" b5 y" t) H+ b        {
9 I( `' S( `% w/ u! p; R8 C                q=0;, k# ~5 b" w% u3 J# b
                P1=0xaa;
( f6 ~* C& a+ C' u5 u' R( W2 m* A                DelayMs(3);+ e6 U6 j) r2 Z; D; I' l
        }, Z% |& J( ^3 ]2 f; Y
}. b, l" K3 k  N& U- k4 @( q3 X, A
}

4 @7 m' X+ }2 f6 Y* M

该用户从未签到

2#
发表于 2019-1-15 23:55 | 只看该作者
看看楼主是怎么弄的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-13 02:54 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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