|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,
' }6 U5 J9 e, O5 Y. Q3 [/ c* M5 o2 i# ?程序如下:
: j/ t4 l. V2 c; a#include<reg52.h>+ q% w- Q9 T) b$ t
#define uchar unsigned char //定义uchar uint7 S: i; Z; i# M9 L7 W) D. I, V
#define uint unsigned int
0 H0 B5 I4 g6 p% Gsbit dula=P2^2; //定义数码管段显示' ~; d1 O8 q2 R; l; P( I
sbit weila=P2^3; //定义数码管位显示( n. J2 k% L, W* A7 k
uchar code table[]={ //定义数码管显示从0--91 i- e ], k7 D) G
0x3f,0x06,0x5b,
1 f, f( k- {- Q! @; C1 v) c0x4f,0x66,0x6d,& q8 j* J1 w5 u; L" y, V! Y; f
0x7d,0x07,0x7f,0x6f};
! n2 Q6 t# _9 }+ Q* r* G. E! `. S2 ~* A( F E/ S( q4 q
void display(uchar,uchar); //声明数码管显示函数
+ ?! @, B' D9 nvoid delay(uint); //申明延时函数+ @9 s6 D' _3 {7 v9 f" c3 ]
uchar num,num1,shi,ge;
+ n, P1 J8 d# ~& r) Vvoid main() //主函数
( o ?4 [$ ]* t3 z) ~6 @2 M5 Q{' V Y6 p: Q0 g9 q s1 t6 O+ Q
TMOD=0X01; //定时方式选择
q1 R9 {' {3 c3 u, j- ~, J" K TH0=(65536-45872)/256; //写定时初值) ? K2 ]8 ^. D: l+ B; T
TL0=(65536-45872)%256;) \+ s8 K& A& | Q
EA=1; //开启总中断
# I0 U* ]) r8 L* ^( w ET0=1; //开定时器0中断
6 a3 M/ x4 o. a |6 G4 W TR0=1; //启动定时器0% ]% u e; l* s0 @
while(1)% _' o2 ^! m+ D# P8 I
{
: {* d2 Q0 g% a display(shi,ge); //数码管显示函数
0 t! n6 |: W& Z! `7 D4 P1 C* N% c, C6 J }
' v r$ e6 c$ u3 @3 _}! Y/ D/ g8 L2 E. I
/ Q, X, i5 N! @+ B' dvoid display(uchar shi,uchar ge) //显示函数
9 g$ d/ d' Q8 ]0 O2 a+ r0 P{
* E: z# d3 T. k/ l: t dula=1; //打开段选/ i' z3 ^( d, v8 j/ z
P0=table[shi];& k2 L0 i, h0 _+ g9 w. t
dula=0;0 k8 c, C, E3 e8 L# r0 \
P0=0xff; //重置P0 防止数码管乱码
+ E- S4 o- ~4 |. Z4 B6 S) \ weila=1;
' y- v. A) D6 Y, W. d+ \: g P0=0xfe;
- P: u* B/ y$ [* A/ s! f% n: `* S weila=0;6 a( R+ }! Z; R* u
delay(5); T) e% P l7 j$ Q# P
. O& z) F3 D4 ?& p0 O* k8 ^+ S% k0 L
dula=1;6 F3 W/ F) Z9 K! o( Y; R
P0=table[ge];
$ v/ J, t1 |) A% d- K$ O dula=0;
* h9 p- |: C' p8 b: g% o$ R8 {4 I P0=0xff;4 l/ s$ Y. e) @
weila=1;1 p# @1 t) t1 U# V, Y8 r
P0=0xfd;
2 S" ?! N# z7 W8 R) U" d: m: B weila=0;
* U K& ~) `& W" C delay(5);
- Y0 I# }( _0 Y1 O) y7 W+ B}6 p# L) f( x& p# Z) z
\- [* @( a4 p: M/ a; p0 k
void delay(uint xms) //延时函数 延时xms ms
" C% l1 @& i5 d: b- R{ @ j/ A! c( S+ J8 l
uint i,j;
8 X- C2 Y) q$ S l2 `7 S. s for(i=xms;i>0;i--)
4 X. x1 _/ m \/ S$ w' c for(j=110;j>0;j--);
1 J1 T! n$ d7 @5 V5 W% p2 I }3 ^4 t3 r1 t0 ]# w
5 z5 |# F+ c: E# h
void T0_Time() interrupt 3 //定时器0中断 定时方式1
" O! @6 j( i4 P4 Q- W{' ^" I5 b6 M! q H: X
TH0=(65536-45872)/256;
3 H; W* \5 H9 n0 N% ^$ w: z0 J TL0=(65536-45872)%256;
- `. B- E' X4 H+ \ c num1++;
' B; l( \$ @8 n8 c if(num1==20) //检测到1s了没有
! D( V9 X# \ a. [' z {* ~8 }2 J9 W" Y3 x5 [ s. `- b
num1=0;' Q/ H% Z8 y3 v( _5 W! A
num++;. y% X& a* V" ^3 P6 A( Y: ]
if(num==60) //实现两个数码管从00--59* G0 G% {6 t" u4 L
num=0;
$ R1 z2 r" W# f4 t4 x5 s+ d shi=num/10;2 W, i7 p7 `6 @1 m, j1 b' @2 w7 b5 K
ge=num%10;
8 x( r" @& J/ P+ M2 o- r) o+ \) U! ` }
6 ^4 q( k2 o& H! s w} |
|