|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
51单片机时钟完整资料
3 J y- i' Y4 o. D. y1 l
5 T# o* L9 g4 X5 L! n* Q% M; O1 V) ^1 w7 p, E
51单片机时钟完整资料3 I+ G A3 H ?
" F3 G! Q) }+ N3 }
5 }( F0 Y3 p. \& b8 h时钟计时器元件清单 序号 | | | | | 1 | | | | | 2 | | | | | 3 | | | | | 4 | | | | | 5 | | | | | 6 | | | | | 7 | | | | | 8 | | | | | 9 | | | | | 10 | | | | | 11 | | | | | 12 | | | | | 13 | | | | | 14 | | | | |
' N- W6 M7 @, m+ v: Y# x! u" y单片机源程序:
/ d: W. i9 J. @3 E2 U7 i7 n) h' X$ Q#include<reg52.h>! P8 S. E- J7 g+ M' |, @/ q
#define uint unsigned int4 ?$ p& h3 K: x- V+ B2 c
#define uchar unsigned char
5 p c1 M3 @+ N6 j; c- a2 [
: ?4 r! S/ y5 x- R8 H( f q9 L7 m% ?! G( v
sbit K1=P1^0; //功能键8 @" x1 P9 e9 Y+ J' A2 D3 \; I3 z6 a
sbit K2=P1^1; //加1键# G. k5 i# \" |
sbit K3=P1^2; //减1键4 p& [% l" l+ q/ T) K- N. J
sbit K4=P1^3; //备用, p+ d% d1 Z( D0 v" F2 y4 K
sbit beep=P1^4;// 蜂鸣器输出控制
: S7 ^% o& Y# x/ K# W3 j, O2 iuchar t,m,f,s;
. m* ?( M8 K3 o% `% l3 M' Puchar num;
6 |2 S1 S% E; W! huchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0 P& q8 ^4 f1 n1 [1 e0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-F共阴极数码管 Y B* ~+ f9 f- \) {
/*uchar code table0[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//共阳极段码( m0 J2 p" R. [8 E
0x82,0xf8,0x80,0x90};*/
( C* v: P4 R9 V* X. h$ puchar code tablewe[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //控制位选
8 E* \0 ?0 j7 H3 Z, Z1 D) S! V0 n% o9 k, J1 w: D
* I) R8 h# _; L9 O7 r6 F- q" w- ^void delayms(uint z) //延时z ms
8 F. {0 c, a# C. e$ d* ^) \- `{
7 U7 l3 l2 H1 n3 R X. u: ? uint x,y;6 b2 @" F* \0 w3 V5 i
for(x=z;x>0;x--) for(y=110;y>0;y--);
; y0 _. _1 B8 o- S# @) H}
7 Y! O$ ?6 q- I& I4 t
; Z9 G- `! i; |- E& b; w3 `2 G
2 [. q1 q; _: D. N$ O1 }void di() //蜂鸣器响: ^5 }* ~1 d" Z4 }3 p4 F4 H6 I
{ beep=0; delayms(100); beep=1; }
1 d% Y: Q- ^/ k9 W" q4 N; X) I5 D! j3 Y3 C
6 e7 `( S, U. q' R; j* rvoid display(uchar n,uchar c,uchar d) //分离变量% w+ n8 P& v. i0 |' q" s# a
{
+ a3 C% I# V1 a$ E uchar a,b;$ X! P; {$ R2 ~
a=n/10; //十位
\% I' @$ [6 C b=n%10; //个位
+ H2 L# V; t; D3 O
0 |. U/ @. c$ d6 d/ H3 g. u( H6 B' g- M8 Y0 f! d
P0=table[a]; P2=tablewe[c]; delayms(2); //十位显示
' F; q0 T& o; i% r P0=table; P2=tablewe[d]; delayms(2); //个位显示
! O& t9 m, o3 y2 R, L4 c* ?}9 [. i. C8 }; L5 j
void init()
4 U; U9 {' O) N7 j0 d' ~( ^, N: n% c ~{ t=0; m=0; f=0; s=0;
5 {: V4 x" O3 y' t1 u
4 `$ Y3 n6 U9 q6 |) d" U- i8 Z TMOD=0X01; //定时器T0工作于方式1
9 h6 Y" z: D7 v3 I2 A* O* o TH0=(65536-50000)/256; //晶振为12MHZ
( e. b/ D, c* p C3 F7 g1 x$ n3 d TL0=(65536-50000)%256; //定时时间为50ms* a: A/ o) i0 h/ u4 t
EA=1; //开中断% J w+ E( X b V! k1 l' e
ET0=1; //开T0中断; Z) q& J2 G6 S! a: [7 x+ b
TR0=1; //启动T0
9 v# F( r M1 ^ }
) K" [+ W5 q% z: d( }void key() //按键扫描6 d V% x u- X
{
, z# F2 h! R {' e2 V if(K1==0) //功能键
9 Z- V: Y: A5 w* G* b {
9 F' h2 U: p6 _- S0 } delayms(10); //延时消抖$ D; s6 w) }0 ~) {1 X) v2 ~
if(K1==0) //再判
% v( T. m+ ]8 J0 M& f$ `# S { di(); //调蜂鸣器响* n2 m% s6 D0 C$ V
num++; //功能键按下次数加1
4 [" R- Q2 H$ K4 R( O1 ~5 | while(!K1);//等待功能键释放: Q4 d$ F6 n' h2 f
if(num==1)TR0=0; //关闭T0,进入调时模式
" \3 o8 W# G h: Z+ }1 Q if(num==4)( B# @8 w; J4 S* H
{
9 a2 K# Y+ o5 x6 H3 \" l) I num=0; TR0=1; //启动T0
9 t- I- O2 g' H }; j" x% l5 u+ t
}
/ E7 I F- b; ^ }
c5 ?% G. D) }, M; J! Z9 } if(K2==0) //加1键6 h& x$ b$ `. d n* |; {- J1 ]% ?
{
q4 p9 d/ f+ _# m delayms(10);//延时消抖5 [8 ~; M3 j! q$ ?& z- r) O
if(K2==0)
2 a/ D0 v( r u6 H; i* P9 p { di(); //调蜂鸣器响7 L. |8 }1 p& ^- C; u, @( a/ j
while(!K2); //等待加1键释放
6 E# O& n. o6 h if(num==1){ m++; if(m==60)m=0; display(m,6,7); } //秒加1,显示秒6 F/ q) \! j% j. P1 q0 M+ C( R
if(num==2){ f++; if(f==60)f=0; display(f,3,4); } //分加1,显示分
+ y; K: j/ E* |5 L" n7 y if(num==3){ s++; if(s==24)s=0; display(s,0,1); } //时加1,显示时- }! V7 p- W- [
}, I6 ]) _2 z( K' ` U3 ?: c" a
}
* |: e9 o7 @& ]8 V if(K3==0) //加1键
, p3 m% o: I6 U9 K6 P9 m {
2 U, z% v; ?: }( N0 H delayms(10);
" X& m5 m% }6 h- |' s if(K3==0)
1 u( p! X6 a, H+ B. P) ? { di(); //调蜂鸣器响
/ j& \2 l0 Y* g while(!K3); //等待减1键释放
9 ?. y% l& n M if(num==1){ m--;if(m==-1)m=59;display(m,6,7);} //秒减1,显示秒
0 x0 u1 Q8 E! g0 U( @9 J. v. { if(num==2){ f--;if(f==-1)f=59;display(f,3,4);} //分减1,显示分& Q- E/ B1 i, k5 ]. Q6 \
if(num==3){ s--;if(s==-1)s=23;display(s,0,1);} //时减1,显示时: T6 m7 C0 ]0 N# r4 I3 \% }2 [
}) L2 H5 ?6 g/ d, H2 h5 K
}
6 b1 f* U- ]3 f' v0 G( K9 G}5 h0 k4 ^0 g5 w4 k6 d
' d4 P9 C* t# F F# ]6 e
3 h. F$ t4 j# d/ ^' u5 _% d3 ^void main()* d' t" R6 h6 ~ V# X Z/ W
{ 2 ]# `: [( z9 n7 F- F6 P( F
init();//初始化 : }+ v, v b$ F3 s' I! {2 s
while(1)
. n, e4 M& o$ u6 ^4 `% @ {
7 G! M0 J" [3 f2 C" U. g7 h/ ?' d key(); //调键扫描 ) d) e: Q) Y/ b. x
P0=0x40; //显示-
3 f, f p2 [' _) H1 |1 Q P2=0xdb;' z g/ `1 a, U5 X0 q
! x _4 E; i" }/ J+ p. ]! a* s- A
delayms(2); //延时
0 ^0 i! G7 P* ~) M" A1 k, @ display(s,0,1); //秒显示
+ t8 o* u# J9 N+ x display(f,3,4); //分显示
& c/ H1 J0 |& r: S) N display(m,6,7); //时显示
! v9 K$ }4 w0 k) n9 _: a }
; Y: F. u0 y, F2 `! c7 p. ~9 a4 B4 m! P}
1 P/ R" E! L4 \6 w3 n/ z- y; E1 X
# V) Z3 x$ E0 A( H% F7 o4 r: A' b3 O, J2 Q* G3 T
void T0_time() interrupt 13 y% ? [! `/ X2 k1 a& @& e( h- y
{
; h. a3 q1 G! {1 [( c3 h TH0=(65536-50000)/256; //重赋初值
4 I6 r, C/ a9 d' q TL0=(65536-50000)%256;
: ~$ ?9 R4 j5 [( o6 e3 N* ~ t++; //中断次数加1
6 u z6 z" s& \4 i if(t==20) //到1秒
7 y7 ]; G4 t: z5 H {
U' }$ p4 V% W, _$ v t=0; //计数清0
0 [# l- S3 r1 }+ \2 Z m++; //秒加17 R# S" Y: H* i# u& h/ P
$ @. Y+ ?% x0 f! F2 l m/ l& e
1 |; f' R: D4 T6 N
8 t' o$ v0 d( E4 `…………限于本文篇幅 余下代码请从论坛下载附件…………
9 c% q- A& g1 C$ Q' g% s+ J+ D" L. G S. Y- J4 I# I3 x! }
4 T) y. ]) _- `. q7 Z+ O |
|