|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,) p1 w6 i' K; W |
程序如下:# i( K% A) m5 w' ]9 E- G
#include<reg52.h>
3 {8 [4 p# X8 A! q* h#define uchar unsigned char //定义uchar uint2 C; Q) y K l
#define uint unsigned int
. c( k( [ i% @& w, N( Msbit dula=P2^2; //定义数码管段显示 R$ I Q+ @3 x
sbit weila=P2^3; //定义数码管位显示
# D2 V; I4 U0 W" p+ l0 M0 s2 Euchar code table[]={ //定义数码管显示从0--9
4 Z* R; C) I& L: U9 a0x3f,0x06,0x5b,
I: x, ]+ P7 J- A1 l0 K0x4f,0x66,0x6d,, h: ]- s8 ]. a6 y8 U
0x7d,0x07,0x7f,0x6f};) e$ W8 M4 D! d+ i _' j
, i1 V0 C# n D
void display(uchar,uchar); //声明数码管显示函数
6 g, y* s5 @4 svoid delay(uint); //申明延时函数
5 s8 e. `" P0 a3 L) Q' T7 Duchar num,num1,shi,ge;* a! t' B8 F2 Y9 l1 j* o
void main() //主函数2 M7 Z' g& P7 e8 q X
{
' G: W ?6 R2 D& x. p4 b! s+ P TMOD=0X01; //定时方式选择 F, @ O0 c6 J$ V$ ?2 r
TH0=(65536-45872)/256; //写定时初值
4 n- u5 N0 O* B: ]7 f TL0=(65536-45872)%256;
9 X, z7 k k7 `6 @ EA=1; //开启总中断* ]7 g& g+ ^) B, b2 ?! x4 J
ET0=1; //开定时器0中断
! a; _2 X4 m% P* c9 i2 p TR0=1; //启动定时器0+ E. ?' d) }, H
while(1)" \! E) ]8 ~+ R5 m
{
" \+ a. W* e6 x& \& [ display(shi,ge); //数码管显示函数
5 ]3 Y6 a- |' y- O }
8 J3 W. C' l. u- y}
L: S6 m7 @ h- m4 s* V2 L! i# }8 r9 {0 O6 O c5 H( k
void display(uchar shi,uchar ge) //显示函数
8 {" s; }9 v" ^{1 v4 w% v. U; l0 f& d0 q
dula=1; //打开段选
5 j3 x# T) t) f! n8 i P0=table[shi];
: W7 A5 w& X# I2 U# F) D C9 t dula=0;5 ~; P! w6 ]2 p( N) l+ D% k2 u
P0=0xff; //重置P0 防止数码管乱码2 h, L- v# C4 w8 \- ]6 L
weila=1;
8 `+ f+ x( {: T2 o$ K8 \( P- s P0=0xfe;; G8 r1 t& m. g1 v& k) D0 a
weila=0;
' K, B& \% D: j# c delay(5);
: N+ C+ ~# _: v3 V 3 e% t$ f4 b; x* G* @* x3 u
dula=1;
3 R; G6 U0 T+ x; s: Z2 f P0=table[ge];
3 \+ b8 | B; j- N6 ^: {3 _ dula=0;
* k8 G( a/ e; ^( J9 h P0=0xff;" w. C% i2 Y8 @$ b* V$ E/ z
weila=1;
, a. u& O9 S+ J1 _) V) ?8 R% H P0=0xfd;
7 l, I5 l+ u% P weila=0;+ W0 m7 p/ k6 o, [' K
delay(5);( N9 b+ ~! V; D8 c
}
% J) d! v% A" {0 k; n/ c5 ~
; B& ~) `/ M- @0 e( Nvoid delay(uint xms) //延时函数 延时xms ms
' E8 h+ C3 P; e2 ?- O- Q+ S/ t* I( M9 q{: B: I2 A) w8 ~' S! X! z1 v
uint i,j;
& r z: {% ^4 m- M$ b# u& m for(i=xms;i>0;i--)
, _/ D& r8 N5 b& U for(j=110;j>0;j--);
% R [( `& Y' o }
; q& ?' @/ ~" k! \) [# m6 I4 t; Q: M0 `
void T0_Time() interrupt 3 //定时器0中断 定时方式1
0 Y7 t i8 a% E{
- H6 |. \4 N* k5 H! p4 i# |" Z TH0=(65536-45872)/256;& u, ` }2 r8 i6 U0 O* s* S
TL0=(65536-45872)%256;
, u7 }( J; k- f W T7 a. @ num1++;
6 J3 a4 F7 K$ w* r1 e if(num1==20) //检测到1s了没有
4 R5 {8 H0 \( U {
/ |, w. V+ B) F W num1=0;1 x* H" p5 d0 \, O4 w0 O5 Y
num++;
) E9 i G& }& D' t! l if(num==60) //实现两个数码管从00--59+ `0 K$ q0 w3 y$ E% A
num=0;
" x' }/ H# r- ]+ |% F shi=num/10;
& ~- I- }% O" n1 B ge=num%10;! n' j2 l2 K2 u5 ]
}
" O% e% ]" W. N s6 B. ]8 m* D6 G} |
|