|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,, d' I8 n# C1 b0 s1 @, O
程序如下:/ ]6 T+ ~& u+ n' [0 J
#include<reg52.h>
% B9 D9 o2 ~) \6 ~#define uchar unsigned char //定义uchar uint
/ J: n* K! x p#define uint unsigned int
1 h: _9 ~) I' t) m6 Lsbit dula=P2^2; //定义数码管段显示
% v v8 \$ e& x7 e4 x6 Vsbit weila=P2^3; //定义数码管位显示$ J; M( o, Q1 U* r
uchar code table[]={ //定义数码管显示从0--9
* N6 k. v( A( j2 a* E, s& R5 @0x3f,0x06,0x5b,
/ o7 E1 F0 U6 H5 V$ y5 V0x4f,0x66,0x6d,% I2 v. B: c( M$ f
0x7d,0x07,0x7f,0x6f};, R, W0 V2 r5 [3 n' k2 f6 a
% ~* Z0 U1 S$ C
void display(uchar,uchar); //声明数码管显示函数 L3 J: W( E: f4 M0 }, w
void delay(uint); //申明延时函数
r; Y: N S( S- b+ C) Fuchar num,num1,shi,ge;
0 K/ N7 d& H1 _) e7 h3 ivoid main() //主函数
% z% J+ O2 L; Y$ C$ F" l' F{. E( O+ k9 c7 N
TMOD=0X01; //定时方式选择
$ k; y9 F5 a5 B9 f4 m0 t TH0=(65536-45872)/256; //写定时初值2 B8 R6 G7 y& v0 b/ O2 Z
TL0=(65536-45872)%256;& P z3 X; W, G1 C/ b
EA=1; //开启总中断( N# d* h/ K' e4 L; ~
ET0=1; //开定时器0中断
& |1 Q# ~. I- s( c/ @ TR0=1; //启动定时器0
9 D% r& p) g F7 i while(1)& g- F) R2 z/ [( A
{
$ A% S0 p M5 i8 F4 v display(shi,ge); //数码管显示函数
" C" n+ }$ J1 c8 o* x( R2 j }; u8 @2 B4 r: G9 |
}
- e% _/ \% x: p7 n' J) b3 e8 {: l" p
2 A2 s% w, o* s. p; w I) cvoid display(uchar shi,uchar ge) //显示函数- [ x' y0 k8 n1 }
{
. k3 \( v" t- K# r7 e7 M dula=1; //打开段选
* `$ `+ Z6 i; g# `, e1 e P0=table[shi];/ @6 y9 G; j6 E7 y. d
dula=0;
/ g6 S, e; Y/ w P0=0xff; //重置P0 防止数码管乱码+ N* c% t1 V+ _* w, k/ I
weila=1;- r# \& ? I0 b9 \/ ^: e3 _
P0=0xfe;
: C# r5 Y( ^& z& Q! M& P weila=0;( y" \9 R: H) T
delay(5);# B9 P, t( O$ f7 w+ O7 i( F
* W: b) h8 ?. t5 c+ ?
dula=1;
5 y6 D; l0 V3 C$ t C& m P0=table[ge];0 M; p, f8 d' X3 N
dula=0;9 B9 o! @8 o' a! O9 }8 s
P0=0xff;/ f8 x. j8 V; f: g+ t5 H
weila=1;
+ g; }8 J( `) G' Z- f P0=0xfd;1 u0 d s6 U, S8 R0 q1 c
weila=0;
h5 a; I* \ D h9 q6 E- P delay(5);
' a3 L9 k0 v# }2 t}
4 x) _: E J/ h6 F X- l4 ?$ q
8 j& ?; k* S8 W5 tvoid delay(uint xms) //延时函数 延时xms ms0 O( y# {& j% F u
{+ o7 z% ~0 M+ Q9 x
uint i,j;
8 {. \ u) |5 k' }; b9 s6 }& X for(i=xms;i>0;i--)+ e! G2 j8 s; g5 \! S# x
for(j=110;j>0;j--);, W! C. ?2 y" o% G( Y, T
}
4 }% @2 F5 l0 W4 q4 {% F( [8 h& l+ Y1 _ L6 m; K
void T0_Time() interrupt 3 //定时器0中断 定时方式1
' C" Z! n% Y9 @+ ? @{5 N& \) i$ g# B' i3 r& z
TH0=(65536-45872)/256;( A- n; w4 |: {" H3 f' k
TL0=(65536-45872)%256;
8 z8 X y+ U4 |0 P num1++;
" ~) f T' W6 X: v* n" Z `- Q5 d' ` if(num1==20) //检测到1s了没有 + f, |& \/ d: o9 d- D6 z) w
{
' F% ?* @( z( M" q% z }, E num1=0;/ m2 A+ I6 m% E' O5 i$ n
num++;4 [0 X$ K* _$ P9 y
if(num==60) //实现两个数码管从00--59$ I( T2 }8 G! t5 Z _3 c
num=0;
8 t! w1 ]3 p4 \, z8 a j shi=num/10;
* v, \) D4 u+ e5 x! D e- s) R ge=num%10;4 N' f2 e% H3 A
}; q8 y7 h8 ?. r8 Q: C
} |
|