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

51单片机定时做可调普通时钟源程序

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
51单片机定时做可调普通时钟源程序6 I: U. Q6 C: |% F0 P' j

9 @: E. j1 `& k
1 Y" {0 f5 J! A5 h1 P
51单片机定时做普通时钟 而且可调 功能很强大 下面是源码:
9 D" l. J) z  r4 ?- T4 ]' v, L/*-----------------------------------------------: @% O( I( |3 {( H3 e; J, D
  名称:定时器时钟数码管显示      
: U& ~8 @& @! X) P. H: P! J------------------------------------------------*/
/ T# D/ r7 S$ e- O) _) V1 F) O: I' t6 |

- u; `' p/ U$ L; c$ g1 E) U* n#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义+ R! t+ t- I3 f2 W( v

; I- @. l8 B( j" L$ S4 g7 F2 J

7 Y# ~, I+ J8 x' S4 G7 O$ S) i+ h#define KeyPort P3 //定义按键端口6 H- M' b  c+ Y- Q

5 F" I4 ]$ E) d) U. j" F( A

: P  E; a) o, L  _6 l#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换+ V% n* `$ P' ^" q# {  M

1 Y' |- D3 l: _7 g
" n8 d# U$ v' T, ]1 T6 M7 t3 A
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
& ^6 P2 [. y3 `+ S/ o( Fsbit LATCH2=P2^3;//                 位锁存
0 [$ m' B" v: m3 M
8 w( |4 m7 R& z' ~8 T, r' W

5 j  r- s7 t. nsbit SPK=P1^0;    //定义喇叭端口
0 x$ `6 c/ G  M4 k8 Z  C1 m8 I  Y9 ~2 B

5 x3 ^* D: T2 a, `' w5 v: Vunsigned char hour,minute,second;//定义时分秒
. t! f2 z( i- G
6 X0 l( i/ `5 c+ Q. r' s' a) l

* g* e6 _. Z! v" |6 q! d1 R* rbit UpdateTimeFlag;//定义读时间标志
  e2 P; D3 J- `9 P3 L$ J
+ R0 P( B* @8 M( m$ g& }

7 K7 v7 z, a( b  j, X5 t! u0 Munsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
2 k6 i. e! D* q* b: runsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
7 K% p1 c7 |5 w) L7 P1 U' R. }8 tunsigned char TempData[8]; //存储显示值的全局变量: u# f* M8 r+ B0 @

# V) {  Q. \. T9 p8 m9 q4 i+ G
/ g: T* Q2 S$ I; C8 `
void DelayUs2x(unsigned char t);//us级延时函数声明
& x. G% l0 b" S5 Yvoid DelayMs(unsigned char t); //ms级延时
" h7 H, i$ ]) q3 ?0 K/ Q+ Xvoid Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
& Q" J. H3 b% C5 m8 {unsigned char KeyScan(void);//键盘扫描# X1 a, g/ h: C8 B4 [
void Init_Timer0(void);//定时器初始化# @! R) N( P! v9 ^
/*------------------------------------------------! ^. x% K3 N0 w7 M  A) R
                    主函数
2 }8 r* q: K) r, c/ A, X- H------------------------------------------------*/9 U5 v! N$ J/ i7 S6 N
void main (void)
6 V9 g, Q( A4 q; Y% @{
( Z6 E: Z; T/ P        unsigned char num;                  
; R. i0 E+ r, q2 r% Z# i  o/ t
; v3 U$ [$ g6 ^2 |
1 g+ d( z, U0 i, G
        Init_Timer0();//定时器初始化7 v! u8 N; g8 n

) O0 @3 Q! a$ Q- i- A& p" {
0 f( x( d9 H7 c: q' e; t6 A3 @  p
        while (1)//主循环" L, m, Y# v+ l2 L: K8 P7 R. @) _
                {% e$ x) V- `5 V1 g" p
: L" t9 l2 Y% [# u# u: p; d

" x# k% g. ?+ P/ e3 g  E/ q                num=KeyScan();
; L  s9 |9 m. [  ?4 X& n                        ! n5 V% U  j- j- ^- W+ X% A8 Z6 s
                        
4 o5 o$ K, u! W! G& D                switch(num) % c. I8 }. _0 W6 Q0 V6 `
                        {  x" Z# t( b( ]. o" T% R  N2 h3 M
                                case 1:hour++;if(hour==24)hour=0;     //正常时间 小时 加1
4 `! x; J/ w0 v                                                         break;' v: I! ?, {& {
                                case 2:hour--;if(hour==255)hour=23;   //正常时间 小时减1' F& P" L4 m7 P, S- c
                                                         break;
7 M4 f) K" s! d. o                                case 3:minute++;if(minute==60)minute=0;     //分钟加1
1 Q/ P$ k: z0 r+ N9 u                                                         break;' @' D' _. W- N
                                case 4:minute--;if(minute==255)minute=59;   //分钟减1  ?) k. O/ F# W) ^
                                                         break;
: `  @3 T2 t) u. C                                default:break;" I+ C! u/ @+ R( T. c8 F
                        }/* 结束switch语句 */" ]. I! s/ c# S  ?
                        
6 W$ j' L) S9 M                        - U% b1 N$ S! G3 [: \- o# @; \
                if(UpdateTimeFlag==1)" t. ~$ S1 p( W- ?
                 {
1 @1 v4 @! l2 j7 D* m2 D, @                        UpdateTimeFlag=0;: P8 H9 z6 R1 \' U
2 ?8 L+ j; S$ Y3 K7 W

% w' V4 ]* @5 u3 K6 V                 TempData[0]=dofly_DuanMa[hour/10]; //时                        //数据的转换,因我们采用数码管0~9的显示,将数据分开
* s( U" N8 E! {% z" u; p                 TempData[1]=dofly_DuanMa[hour%10];
6 Y' l; m8 `; O                 TempData[2]=0x40;                                                            //加入"-"
0 |8 A( t6 |7 \) f1 c                 TempData[3]=dofly_DuanMa[minute/10];//分7 T! a  y5 @' K9 _5 E
                 TempData[4]=dofly_DuanMa[minute%10];
# B' R" _( }) z0 l7 S5 X; p                 TempData[5]=0x40;
8 J1 ?7 D5 b" R                 TempData[6]=dofly_DuanMa[second/10];//秒
3 d' h7 ?- e1 R) g                 TempData[7]=dofly_DuanMa[second%10];        6 l, b, J' y0 E. y7 D/ W. s' C
2 V9 s9 l3 J. h% y

+ b. N6 n8 B( O: B$ Y* O/ M7 N                }        /* 结束if语句 *// `7 h3 S* j' C- T! X2 o
               
& b. A% c7 \. A, B5 Z  H2 A, p+ E$ B        
( T6 J- `+ p( A0 k5 C                2 f9 D/ l6 h) V( x
         }/* 结束while语句 */
% _! F" }. X) A+ V         
, m+ ^% o9 n5 c}/* 结束main语句 */# L9 R: {2 t# A9 L0 e: |
. ^- l" R0 s3 q4 Q+ G
# L/ @7 Y" v3 W2 u' l( x5 O2 y

5 s& g5 t8 z  L9 j  a, _* v: r
7 G8 F3 Q) ~! ?
/*------------------------------------------------
+ _' @( N" u3 v/ z# S9 \& B7 { uS延时函数,含有输入参数 unsigned char t,无返回值
: e8 A1 ^! ~" t  X$ P unsigned char 是定义无符号字符变量,其值的范围是
8 c1 D: n; g  X  _0 h 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
  F% J" j) H$ z) P 长度如下 T=tx2+5 uS
# U7 h* ~- Z% v, }------------------------------------------------*/
& v% s9 u( {% a7 ivoid DelayUs2x(unsigned char t)! z( L3 G& i& X) e  S. s
{   ) |# R$ J. a+ L* k1 t; G! P& u( i
while(--t);4 P, N$ Z  x2 J
}
! `; j+ C# I/ j) H- W
* |4 q( L. U% L) |3 T% v3 @; [: _
) J9 Y/ Q+ D- }
: M1 z3 ^- e9 n2 M- q! l7 G
1 Q2 G8 i. g! Q; J8 ?/ ^
/*------------------------------------------------
, v" f  o  C7 G: h/ N7 K' E mS延时函数,含有输入参数 unsigned char t,无返回值
+ [, e& G+ ^) W- h/ b unsigned char 是定义无符号字符变量,其值的范围是
" k0 [4 d1 Y1 g2 L" |# u 0~255 这里使用晶振12M,精确延时请使用汇编
2 _9 w0 q* U: `) H0 L3 |------------------------------------------------*/2 h! h: m4 ]. X3 U- P
void DelayMs(unsigned char t)- E3 H+ i: P1 @
{; j3 x0 D5 T, i
     
; z. [# [1 w, c! E3 x while(t--)& ~3 J& x7 L1 r" U" K/ a
{5 n- d9 S& u+ I" d7 J
   //大致延时1mS
/ A5 T0 r6 R; Q% `   DelayUs2x(245);
) f% s* d) m, Q8 V8 l         DelayUs2x(245);
  e$ I' O( o, W3 [& H2 l. z. p }
" ]( g  g# T  O0 Y, |! _3 ]0 ^}
' k* i. Z! t: X( c& G' n+ B# e4 d7 n' ^& V" `

, b3 w$ ?' q- K, f* l7 o) a7 x

( I9 `/ t7 h) d* H# C6 w/*------------------------------------------------
4 E( J; \' q9 `4 s4 A( p! d6 u# F 显示函数,用于动态扫描数码管& m8 X8 }" L8 J5 Z- `% O
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示/ V, G: X- I( j* N. s- l9 g: \+ x
如输入0表示从第一个显示。. D; Q& S" x: T" q7 U2 _: n
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
: ?+ t9 H% \+ R( v# H7 R3 K# o3 y8 N------------------------------------------------*/8 i5 v. r/ ?* F+ u8 x- @
void Display(unsigned char FirstBit,unsigned char Num): e6 r2 F: G& B0 y8 G2 v& M
{
2 \, z7 d) v; J- y" H; {; ~      static unsigned char i=0;
* `; N1 C* V) b2 ?" k8 e! [4 ?# i          $ f) Z7 E+ z" B" r* U

1 g6 g2 ~" v$ L1 n3 H

, |7 L/ o, R4 Q+ T/ f           DataPort=0;   //清空数据,防止有交替重影2 F1 q, R1 N' w! V& D
       LATCH1=1;     //段锁存' T. m! _, Z* }& a
       LATCH1=0;
2 {+ J, F3 T" Z( I+ [0 y
) Z9 J$ B% E( R$ u7 e

0 t. p' q! q- G% q& C! I" m3 D       DataPort=dofly_WeiMa[i+FirstBit]; //取位码 / x  e" X) _$ ^: R, E& z5 P8 k0 N
       LATCH2=1;     //位锁存9 p  _: E" M, W) _# j7 {
       LATCH2=0;
! Z0 W* K8 r0 E$ w$ ~7 O& |* i" E4 T+ A! y
6 Z! a9 w7 S# m$ b2 B9 a' v' J
       DataPort=TempData; //取显示数据,段码
3 g1 n% D! }/ I+ ~       LATCH1=1;     //段锁存
( q! _& G: S2 s1 m6 U       LATCH1=0;& p6 n8 E2 U$ }
         m, M! \8 n* v- c
           i++;" U4 J: |  s4 [
       if(i==Num)/ @6 D" ^3 Y8 B; U
              i=0;
) @5 c/ e4 E# K" Q1 D: R0 F* W. m/ |9 p# |: b% f  ^+ u# K
9 ~9 N- S5 S, e/ d. Z" K

" U6 J" @: Q. a& ]2 F

9 v$ r3 G1 D" v# R" L; f5 q: a}
' z4 |) b+ C) x6 \4 v" w& Y6 _/ B3 Q
8 Q' o' H4 o4 F
# R4 p5 \  P- ^7 R. \% g; l
) E  J5 w. y3 d5 _
/*------------------------------------------------7 I* ?) e' z) Q& w3 Y9 Y7 |1 b  P, i" r
                    定时器初始化子程序3 l" j  B* ]/ a5 _+ F4 S% }+ j9 s2 I
------------------------------------------------*/
  C$ I! q! F* F$ Ivoid Init_Timer0(void)- |7 {. Y8 f% M) R- o
{
- [  ]( _; S- l+ f  R+ C TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
2 s7 ?7 o( ~! a& a //TH0=0x00;              //给定初值
; u, B- w. r0 |) z. E( @# B. i& P# _ //TL0=0x00;. `1 M0 S1 _2 q: z' H, i* L4 y& y
EA=1;            //总中断打开$ k8 a8 V+ c2 V4 Q! `
ET0=1;           //定时器中断打开* A9 U1 ]7 i. O: V' K% v0 X/ t
TR0=1;           //定时器开关打开
& A3 N  n  x- n) U}4 C% V5 @0 W9 _! U6 m9 _1 w, q

7 X! W* T* c- n* q- C

1 T2 [. D. x% t0 M8 `5 t, x0 U, q; a* x) L6 k

0 P% {" D, s* Q. Q* i' [" ^/*------------------------------------------------
9 Z) L* U1 p& l2 Y) L2 e1 ?: a: B                 定时器中断子程序) g( H7 f6 k" W3 m
------------------------------------------------*/
. r7 F. p* p, L& Wvoid Timer0_isr(void) interrupt 1
! u9 z9 E' n$ \9 C{6 N& n9 N( u- d
static unsigned int num,i;% e( N# s, ~3 F7 h4 v2 S" ~
TH0=(65536-2000)/256; // 给THO赋初值为(65536-2000),当其加1到65535溢出中断一次   即2ms中断一次  2000为2000/1=2000(在晶振为12MHz的时候) 9 l6 P* }) h/ q2 a4 \
                             //重新赋值 1.8ms 即1.8ms中断一次  2000为2000/1.09=1834.86(在晶振为11.0592MHz的时候) 2 y' O5 b5 x, q+ Y7 ?
TL0=(65536-2000)%256;2 I, O& p- @1 ]7 ^9 p# \/ t

+ G. c  ^9 `# w8 P! ?% a Display(0,8);       // 调用数码管扫描
5 |( E2 Q8 X- ?9 J        
1 S: p7 k6 c3 f0 _) e$ I        $ \' R9 j0 I. Y- B) N
i++;% f6 E% e& H" L2 C# y7 w/ p
if(i==10)          //20ms更新一次
8 ~+ g  V1 M- y! G8 J0 C4 b    {
2 Q) R) `$ k2 D+ K5 p* `                        i=0;
" |7 ]$ a: J4 \* \; W                        UpdateTimeFlag=1; //更新时间志位置1
9 l* M/ G; [6 Q/ b! A                }
/ p( _( C/ Q- m        
% W( B- y6 w! P9 E6 e; _        & D; G% m# f- l: L- d! a( y+ q/ D
                ( z" |  @) t6 _% e9 d- @" \* r. S
num++;$ U2 L; z4 \% k2 u* O3 C/ g
if(num==500)        //大致1s7 S7 \, I/ x% u9 C
   {1 y3 p. U1 r# S. V
    num=0;
4 J; b3 d8 b' u8 X          second++;
, t% L3 S1 D4 x: B( ?7 t                 
" m* s; t  P" m3 M! n2 l                if(minute == 59) //当分钟到59的时响蜂鸣器
8 J' e6 p! L2 P1 [                 {9 B, S2 P8 S2 |7 j! R
                         if(second >= 51) //隔一秒响一下
, @/ {3 Z( T. w$ K0 ?8 S                         {                                 
, Z# `! X: V9 A                                 SPK=0; /* 开蜂鸣器 */
0 i% b' G: [7 u) p                                 DelayMs(1000);, X+ r4 n/ W, @
                                 SPK=1; /* 关蜂鸣器 */" C. X$ v1 v* u: Z1 X
                                 second++;                                 
7 d" S" C# ?7 V+ S/ [8 Y                         }
+ a- C% v/ x! \+ F4 _$ ?$ g# Y                 }        1 J# c7 U1 Z0 ?
                 
6 `7 [9 ^* D0 x' z: e# Z. _                if(second==60)  //秒到60,分钟加1" b7 u( i1 W9 O  ^/ j' }; M
                 {& l+ P) Z8 S6 q5 T1 C
                        second=0;          $ c0 E8 ]" N0 o
                        minute++;         ( U3 u1 ?5 h/ ~5 j- X3 [& g
                                          1 t  M+ {$ L" p
                        if(minute==60)//分钟到60,小时加16 v  w; q6 B8 k, @4 d
                                {
' ^9 N2 X: ?) v7 W                                 minute=0;
0 M: [/ w# C' s3 x+ [                                       
5 d, c$ O% i3 O                                 SPK=1; /* 关蜂鸣器 */        
. o" s2 \$ }0 S% C+ q                                       
8 N2 ?9 s# x% p, T( K                                 hour++;
) p3 @: g3 ~6 g4 Z                                       
2 ]1 B( V& b7 b1 C' ~* G                                 if(hour==24)//小时到24,回零- s/ m6 F8 X' ]
                                        hour=0;
! @' Y$ c2 f! C2 S" T) S( }                          }
; Z8 L7 J, N- s! p; x                        - s9 \  q8 v2 G3 p
                 }
, F4 r3 U; J8 l. g. z                 
( V7 u3 M) i- x$ }4 a                }5 \/ p5 V% F2 K+ ^  T, \  F3 g  P
}
0 _* K5 _/ P, }; `2 n, j7 _; }3 V/ T0 Q  Q
" ]0 R% `! k( i( r* |
! u0 I6 i% Z  O& E" N$ }
8 `( }$ V' f3 s4 A/ j7 U; f
/*------------------------------------------------, p: C7 M% C; K1 P: w
按键扫描函数,返回扫描键值
, q/ ^; S3 O  o7 B/ E& }------------------------------------------------*/3 j1 b0 |2 }/ l, K
unsigned char KeyScan(void): O; M9 t; x+ Y6 o) |
{8 U' F- o* I- D4 `4 h
unsigned char keyvalue;$ Q2 z! [! X$ K. R' }' M
if(KeyPort!=0xff)
+ p- c$ A, N  ^1 c, u9 B" u/ W- a! i   {. Z% S/ l2 h  h
    DelayMs(10);
7 h4 \6 J- K& t" P8 y    if(KeyPort!=0xff)
& b3 u8 A$ z  f, L% _* x7 u% E# j           {
! N+ X3 _& E! {' V            keyvalue=KeyPort;( y0 I2 B1 }! }# x; S: L
                        
. r3 a2 ~- u) P5 r" t' t9 s" \            while(KeyPort!=0xff);0 I4 U% G6 r5 z, o! O
                         : }( Y" ?+ u, @3 i' B; Q% e' [6 J
                        switch(keyvalue)0 V: U% _/ E* ~0 ]
                        {
" B% {. {6 u1 z- d7 Z7 A+ W                         case 0xfe:return 1;break;  //单个按键控制. i8 N: B) P. j9 O8 t: Q
                         case 0xfd:return 2;break;
8 \( c' c) c0 l  B3 K% u4 |                         case 0xfb:return 3;break;
. H" E$ e0 Y- q7 i                         case 0xf7:return
6 t; {9 X  O/ N2 h
4 S. q  G( c0 S  ]' S1 V

! U! B% A! X$ e5 ~! P
) i6 q' }  a3 E/ O% y) U

4 ], P) b. ]  y2 D$ U  G# […………限于本文篇幅 余下代码请从论坛下载附件…………, o5 Q0 ^& s: ]. X; C
游客,如果您要查看本帖隐藏内容请回复
, t0 J2 a4 d1 @0 F( i3 B

  Q# p* D$ G" s* D7 T

该用户从未签到

3#
发表于 2019-12-15 10:51 | 只看该作者
回复回复回复
% v( ~( ?4 P: v% ^+ f  u$ i5 l: n

该用户从未签到

4#
发表于 2019-12-15 10:52 | 只看该作者
重复重复重复

该用户从未签到

5#
发表于 2019-12-15 10:52 | 只看该作者
重复重复重复

该用户从未签到

6#
发表于 2019-12-15 10:54 | 只看该作者
咋个才能加威望
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-19 16:21 , Processed in 0.109375 second(s), 27 queries , Gzip On.

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

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

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