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

电子钟(可调节时间)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
电子钟(可调节时间)9 F# D) @3 ?8 C: e
5 X! J9 X+ g. G" @4 u
, R: c/ V, x$ J' _
#include<reg52.h>
7 U: S0 y: ], s5 X4 Lsbit KEY_ADD=P3^4;  //定义按键输入端口
7 \2 B% V( S" T9 E( |5 J/ r% g9 Osbit KEY_DEC=P3^5;
8 I& j; M9 {" r* ]0 Xsbit k1=P3^6;' B! \9 W8 b+ C
sbit k2=P3^7;
* c* S) R9 F# k$ Asbit k3=P3^4;! X6 Z4 T6 r. ~8 g+ a
sbit km=P2^0;4 F  W% q) _" q: a

3 O0 E3 u- T* N5 A& U) V! i#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换4 m" v; ^3 p/ ]+ z) L) a# W
sbit LATCH1=P2^6;//定义锁存使能端口 段锁存1 t% g: M' U: E* [- ^' Y
sbit LATCH2=P2^7;//                 位锁存
' I6 N+ z( ?6 \* l$ X, m- B# W* {& N5 H' g. A& o7 N7 T
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~92 A( Z; ]  S# D
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码3 ~# R# f! K; B
unsigned char TempData[8]; //存储显示值的全局变量% [# c4 S! g" `' Y6 S, f
4 g0 Q8 Q2 e& Y6 D* n3 h
char h,m,s;  //时分秒0 v, m- _4 Y+ r6 H
unsigned char i;0 o4 ?5 N! u$ Y$ L2 |, t9 b) B  N

) m! B3 j" T  e& u6 Q0 |- Nvoid DelayUs2x(unsigned char t);//函数声明 . y1 |* U: C4 L7 ^
void DelayMs(unsigned char t);
2 o2 @" G2 {) u+ S5 evoid Display(unsigned char FirstBit,unsigned char Num);
* w2 e1 j. Y/ |, t, P& ?/ Bvoid Init_Timer0(void);
, |* n( e7 ?+ b2 ?. U- I- Q" a/ R/*------------------------------------------------
: b" W6 |) q# {1 e9 Y                    主函数
% V9 ]/ m+ q  n7 w  b------------------------------------------------*/1 }1 v' E. K2 T1 m3 m
void main (void)& G/ A. R% p- u5 s$ q
{
# `* l+ f) u2 s# O" h! i- w6 ]        unsigned char num=0;                  + h2 x  u" o- n5 z% n$ C
        KEY_ADD=1; //按键输入端口电平置高( i3 i& U6 X+ Z. P& H. S( d: T2 g
        KEY_DEC=1;4 t4 o# w- y- Q' d7 b7 A& K
        Init_Timer0();
: g/ ^% U/ q( F' ?% U: n& X+ X5 M) L3 g0 e
        while (1)         //主循环
" q0 ]4 H+ ?% ?  G; h, d          {
: ~. L9 n, v& c5 `4 E, \1 W2 e/ `                  if(!KEY_ADD)  //如果检测到低电平,说明按键按下8 c6 g* r% f4 O7 |* B
            {( k% [1 Z' `9 S/ o- i; W$ O, n/ F
                         DelayMs(10); //延时去抖,一般10-20ms
+ f1 y& _9 m. v1 L                     if(!KEY_ADD)     //再次确认按键是否按下,没有按下则退出; W1 n4 U" G8 R3 w8 _4 N% h
                           {7 G- l* W- C' b9 J( G$ l5 ]% M: o
                                while(!KEY_ADD);//如果确认按下按键等待按键释放,没有释放则一直执行数码管扫描,防止闪烁% l; k/ e) v- _* y( o
                        {) J1 F& w* M5 f/ T0 ]: g& y- |
                                  // if(num<99)    //加操作) m3 _7 j9 F. g3 A6 [3 _, U
                               //   num++;
( o& d4 r1 f& c7 ~                                           h++;7 l2 E, b; B4 R4 Q$ P& n
                                        if(h==24)! D5 ^9 d' j6 h
                                                h=0;
% C1 {* q7 y4 g2 j" q8 w8 G                                        for(i=0;i<30;i++)
  n* E% w. S( y2 E" O* T                                        {
3 V2 L/ n; A; p" V) V                                                km=!km;0 {3 j2 s3 v- x
                                                DelayMs(3);# g+ W: B: @7 l1 @  N
                                        }" O' _) s% x7 e8 z
                                  }
7 I8 y; B& V$ O$ D$ v                    }
" g$ J- `3 B8 d" e8 p                }4 e0 @  h  L8 \8 s% f" L; I

- m/ I: S+ E3 J' M4 f/ E        if(!KEY_DEC)  //如果检测到低电平,说明按键按下
8 l: b3 S6 u0 ^+ G: h8 _    {
8 n' S/ I5 ^- {* A) ?/ G6 K         DelayMs(10); //延时去抖,一般10-20ms
, _# M( R5 r3 d& J( I& p5 }( U, r$ S+ b     if(!KEY_DEC)     //再次确认按键是否按下,没有按下则退出/ B- @2 z, s! r1 o: J3 H6 m) G
           {
1 N- J' v- s( O2 H/ J                while(!KEY_DEC);//如果确认按下按键等待按键释放,没有释放则一直执行数码管扫描,防止闪烁& g4 h9 z; H% G; q" H* z
                       {
+ w: O5 k* U, l' A( i                      // if(num>0)  //减操作
7 L# {7 ~5 t4 c; F+ V                        //  num--;
% q" k4 y  U! r, j7 S5 E" Q                                h--;
8 X! r; C- @6 {+ ]4 b" q" \' F                                if(h==-1)2 g: p  G; E6 o3 F
                                        h=23;
* X6 f5 d" g8 n% P                                km=!km;
0 `- ]" W! V# y- \" \5 b                                DelayMs(20);; E: r9 c, I2 f2 a5 b" W2 h2 s
                                for(i=0;i<30;i++)
& P9 k+ ]0 O& D3 Q2 G) x                                {! n$ B0 W6 k# r: M, J7 R$ d4 d
                                km=!km;9 R. r4 Z/ F, s6 k4 ?
                                DelayMs(3);
5 V8 F) Y# K$ v4 q, ]                                }# u% w* h  _8 ^3 Q% d
                         }, _& ^/ k$ \6 s( o3 s  M7 C
           }
" W* `! U5 ]6 I6 i, y        }; D1 T2 C! y9 v/ d0 I, q& V
        if(!k1)  //如果检测到低电平,说明按键按下
& S5 l; J1 x7 z' y- H    {" J4 A! Q: l  O
         DelayMs(10); //延时去抖,一般10-20ms
2 `  E4 s7 {# Q     if(!k1)     //再次确认按键是否按下,没有按下则退出
5 b. _! _' v4 e. A           {
7 N2 e' y7 [' Z        while(!k1);//如果确认按下按键等待按键释放,没有释放则一直执行数码管扫描,防止闪烁) I* f4 {8 p/ [8 m( Q) y6 ^  f
               {& c$ J' T9 {$ m3 r; R1 N
                                   m++;' c# _1 {$ i3 x. h
                                if(m==60)( k7 I2 H$ r+ j# p- n
                                        m=0;$ w, {+ ^- X+ X- o4 I; C
                                for(i=0;i<30;i++)8 t$ ^5 ^. |% [
                                {
/ W- K" u$ |3 A, [* o- ?( m                                km=!km;7 ]" t) w9 |; \9 q; ~0 l. b% B
                                DelayMs(3);
( d( y# V, f4 D$ x- w! H( V                                }
- G1 p, V' H+ u, c( i                         }
- D2 x3 N) l1 [* ~6 H* @9 {           }
  m8 ^4 w, S0 j4 W8 I        }
  m' ]1 u% m3 X$ g
& L! ~* M5 h4 Eif(!k2)  //如果检测到低电平,说明按键按下
  O/ a) T; }5 K9 P7 j: [    {& a! H8 R& ?' D. p; [0 e3 l( u
         DelayMs(10); //延时去抖,一般10-20ms6 B1 U) `  O/ d4 l' I$ a) d2 A" |
     if(!k2)     //再次确认按键是否按下,没有按下则退出
8 N+ E2 V& a$ {8 E& v' q           {2 `/ ?# O% `: I$ i
       while(!k2);//如果确认按下按键等待按键释放,没有释放则一直执行数码管扫描,防止闪烁0 s6 c! I9 {: \, e4 _* R8 b
               {
1 S+ \' D+ r. h# z/ O                                m--;
5 }& x3 ^7 ?+ S                                if(m==-1)
; R. S8 O0 f7 M                                        m=59;8 h; V( u7 h: }4 Y  i
                                for(i=0;i<30;i++)
' j  t. V: ^: E; V5 l! |1 |3 _                                {+ f8 B: }" o' N4 h; i
                                km=!km;
) |9 c' a4 V  }/ t                                DelayMs(3);
: e( G2 ]9 I, a' U+ W                                }
  [9 w0 [  N+ w4 H$ e                         }
6 K* G9 Y0 _) h" ^* P6 U. T! Y           }
5 u4 n! @4 B- C        }
" v  `9 I$ h1 Y! ~- @
/ m$ j$ B  E0 c# Z//        if(!k3)
* Y/ d6 g4 d/ X. ]//        {
, A+ ]0 G) v3 V( Y  F//                DelayMs(10);
/ M% W2 {/ \' ~" r* z2 U//                if(!k3)
9 }( w) o, ?" D' \# v//                {
* F$ r  t: W2 R7 {5 Y: Y2 r- ?//                        while(!k3);9 a0 j& i  t/ }/ B  f3 K1 c% D8 A
//                        s3num++;
* d. f4 E+ a2 u5 r. \//                        TR0=0;: z" }9 R' \/ g! r+ _# Q% u
//
, p; u% V3 T2 ~; S( {& C+ y3 ]6 |$ m//                        if(s3num==2)
: F/ {& V6 E" u//                        {! W9 z5 t; r, ^8 d; X
//                                TR0=1;/ }& J+ a3 o4 G( Q3 z
//                                s3num=0;
& N: s. z( @# `) l6 }//                        }
; q" S1 @  l! p//                }
! B( C- W. T  S# R* V7 z: o" v//        }
! l5 N* P/ U) d! [+ i//           TempData[0]=dofly_DuanMa[num/10];//分解显示信息,如要显示68,则68/10=6  68%10=8  
, x7 j+ v7 n# J! F- c//           TempData[1]=dofly_DuanMa[num%10];
; U2 f% j9 I1 Y4 H* h- q9 X//           Display(0,8); //显示全部8位
4 l& f+ N% p% E! t//     //主循环中添加其他需要一直工作的程序
7 Z. z. c5 Z. Z$ x. ~& E         TempData[0]=dofly_DuanMa[h/10];
% |2 G' F) M4 x3 M* z/ b         TempData[1]=dofly_DuanMa[h%10];
/ v6 C+ V" c7 {7 m         TempData[2]=0x40;6 f5 G0 Z+ w0 {0 E5 _; p" w/ ]
         TempData[3]=dofly_DuanMa[m/10];5 e* }2 h& }" D$ E3 C3 ^
         TempData[4]=dofly_DuanMa[m%10];
' l% [( V% O! y& w+ \0 ]4 F) P$ H1 Z8 X         TempData[5]=0x40;7 a2 B: P, _+ [) |' M9 P2 C+ q1 H
         TempData[6]=dofly_DuanMa[s/10];
) E) K- h: J- p* ?, V" {         TempData[7]=dofly_DuanMa[s%10];- V) C0 q, x% t9 a
  g1 t, C3 x4 E. w& j* S
  }4 K" u& Z9 y& h1 c8 W+ {
}1 W* F5 y& I7 _3 v3 P9 [
/*------------------------------------------------/ n1 _/ _9 k3 A5 e' g8 T* q
uS延时函数,含有输入参数 unsigned char t,无返回值
- \; `7 v4 c* o- B/ y3 f# ~unsigned char 是定义无符号字符变量,其值的范围是
8 ?, l( b. R4 C* Y( m( x0~255 这里使用晶振12M,精确延时请使用汇编,大致延时( u9 ~; H, h% @) ]4 R1 G
长度如下 T=tx2+5 uS ; s5 a. X. Z+ H8 a  n
------------------------------------------------*/
. y, Q; h! x9 y' Evoid DelayUs2x(unsigned char t)# s6 q+ j7 o" y6 J
{   6 O; ?/ h6 `  f- Z, U4 h: }" ?- S
while(--t);6 X+ Z3 x, Y1 F$ z( U! e
}
4 @% Q4 b4 j. S; z/*------------------------------------------------
3 k5 H5 l' j! O5 amS延时函数,含有输入参数 unsigned char t,无返回值
" u- i! I; w7 s8 }5 Iunsigned char 是定义无符号字符变量,其值的范围是
) j9 {" F7 N* Y) M  u9 Z3 H0~255 这里使用晶振12M,精确延时请使用汇编7 r5 R" M" e$ S8 l% y& A9 ]
------------------------------------------------*/
- T6 ^- V7 p. O: u# ?1 h) Jvoid DelayMs(unsigned char t)
! _- w9 W- a6 w; X{: F# L* W5 _3 [

( G9 U: y4 n7 N9 k) P' zwhile(t--)
! m/ W* d7 Z! E9 U5 r' l2 S{
3 Q( e7 c  z" V1 S     //大致延时1mS: _0 t) D9 ^  L
     DelayUs2x(245);, g6 P. E+ V" c6 w" |( p
         DelayUs2x(245);
/ _& P/ |3 a( y* L) n  F) q5 J}. D6 G/ ]3 D: y/ B( J$ T0 E4 w
}& W. X# I2 m% o3 A1 ?5 Y
/*------------------------------------------------
  T4 ]9 ~5 @, Y显示函数,用于动态扫描数码管4 A( E/ v7 G( p& q8 u# e; p  {3 P
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示( n4 N% y* [" ]3 `
如输入0表示从第一个显示。  @" \% q2 x3 [1 B) O
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
7 q8 Y) d: b% S9 E------------------------------------------------*/
+ L& p7 P* A( r6 k* m& T$ h$ Rvoid Display(unsigned char FirstBit,unsigned char Num)
! p# s' P$ {' G" i& s* C{# w% X8 x8 J0 c# C* O# `
      static unsigned char i=0;
; `% S  t. w; A3 _. F' z8 d         
; y' B3 U8 m/ @' v1 i. U  Z; }4 j9 U* R6 |+ J- T4 U
           DataPort=0;   //清空数据,防止有交替重影* _" M! D% b9 q7 a0 w- Q
       LATCH1=1;     //段锁存
+ F) m$ J0 j' W/ c       LATCH1=0;0 F. J- q0 u& `, j( w# w
' y$ ~" J7 o- G" R' `
       DataPort=dofly_WeiMa[i+FirstBit]; //取位码 5 q% n4 }" p/ y5 V0 E* I, t" J# r
       LATCH2=1;     //位锁存5 k8 X" ]6 C+ l2 I4 a5 g5 o
       LATCH2=0;
# v5 M: D1 h3 s. Y# E2 x
2 h! [" ~8 `$ |& M3 \; ]% u3 ~       DataPort=TempData; //取显示数据,段码
' A# c! m& X. e: e5 ?; z, m       LATCH1=1;     //段锁存& h( |8 P/ o5 J4 E
       LATCH1=0;
) }. ?8 F3 A# U1 r- {
! T; H3 c, C  f' I           i++;5 x5 W. L& u+ V- o7 B
       if(i==Num)
  n1 _' g$ f+ o3 e' G& y7 H4 m              i=0;
0 [$ b6 {4 ~: ~* G! J+ O& D$ `6 Z2 b4 P; S! e
$ `6 `+ I  l' _1 J6 N' P2 y
}
% m! Q* |) M1 S% h* s. }, P5 E. F0 ~& N/*------------------------------------------------  i8 Q8 [4 U( O7 q: z+ ~7 [
                    定时器初始化子程序
. O/ I7 f6 p7 N9 t" F0 ?------------------------------------------------*/6 t9 G; [# [  e% Y& j, s- y
void Init_Timer0(void)/ ]$ z9 j- A. _. L3 \- }
{8 K6 R& K4 l+ |6 o/ T3 B
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
- E( e9 @" o: g2 K5 ?5 s//TH0=0x00;              //给定初值; j7 I$ x/ ]+ l# e+ d" g
//TL0=0x00;: L' [( a" H5 F
EA=1;            //总中断打开5 ]7 z: b- K, @
ET0=1;           //定时器中断打开
0 L( L2 Z& o5 v0 |9 v4 bTR0=1;           //定时器开关打开7 q/ _8 t+ a% B$ S* y/ x
}
4 [$ z* b9 c$ O% s9 g/*------------------------------------------------
) k( @  R0 a' b; _( A3 q                 定时器中断子程序
5 m* X: l" l+ H1 j------------------------------------------------*/) q) e$ X8 h7 T5 ~
void Timer0_isr(void) interrupt 1 ( \, u1 D* ?0 _
{6 c( t9 h4 U. @2 d8 Z) }
static unsigned int t,q;
1 Z2 r8 C( r! |. r8 z/ t+ k+ X/ l) D( eTH0=(65536-2000)/256;                  //重新赋值 2ms
; u% x' K$ n8 Z; l& j; ATL0=(65536-2000)%256;+ A! S" J! a; w* c% ?; X

/ {4 z9 J) R/ y) J. `. n6 A# C+ h. h8 _Display(0,8);8 K- s9 S: U: \# y" b
8 U1 v! Q6 V5 K+ O$ v& w" Q# T
t++;# W; f: Q  ~, h# @6 h
if(t==500)% c2 `5 D  w9 w+ x( @0 i; @
{3 n7 f$ A5 `: Y$ ?$ y
        t=0;
: f/ k/ w% l4 `# j$ F- U        s++;) n' B" m  a$ O. W
        q++;% p4 _; f$ D9 J2 q  b% G0 r
        if(s==60)0 J; z( a3 a# j9 |, l0 N) c, {
        {: }8 I; }- |: m% |% b. z- a
                s=0;
, F! D% M5 ~8 D                m++;' l; c& i0 |6 k! Z) _4 h; ^6 J
                if(m==60)! n5 I5 v7 V& o
                {  i1 F/ B% \2 k- Q) R$ V" @
                        m=0;! K/ K! x' A6 |0 U
                        h++;( @% V+ D( I! t. A1 b9 X
                        if(h==24)
. j8 g/ H# s5 P+ V3 i                        {
. y6 ~0 y4 v! o: I8 b' V                                h=0;5 j9 ?- w1 q- z* D
                        }
- o2 L+ I/ Y3 p7 s. T; Q/ u                }' @  q8 Y. ]& M% h, H  h& C# G
        }
0 m# S/ u( Q+ _+ |, U        if(q==1)* l# `& T4 T) P# X# H
        {. E, O* Y: R2 H* g2 S& Q5 x- D
                P1=0x55;
4 P) W; ^3 W. b- @' M: n& J                DelayMs(3);) e. A  J; y, h5 f, O
        }( L4 C0 \  ?! |; b6 S- p
        if(q==2)
, P1 |; v. b! f. i6 K+ s        {- Q+ @, T0 k. x" U
                q=0;
9 k: C" B; l6 |# T4 F                P1=0xaa;
1 `! `7 [7 y0 r5 W1 B                DelayMs(3);2 r7 V" T2 J& @  y2 ?& b# C9 X
        }, A6 N+ l" j$ l7 g+ p
}
- q! v6 ?+ n- g+ P) k7 L$ a}
) u0 C; O; q5 e# s2 ]

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-31 04:26 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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