|
|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,5 D* O( @, G7 m, c* O
程序如下:2 B( V; O7 c$ i3 W% Q
#include<reg52.h>
% h8 z/ m* N: g6 v#define uchar unsigned char //定义uchar uint
/ R; t* g# E, l4 A, y#define uint unsigned int- G( U0 K4 U( P; v+ N/ y
sbit dula=P2^2; //定义数码管段显示5 e; L C+ m( p F7 \2 v
sbit weila=P2^3; //定义数码管位显示- Y7 p3 Z1 b- c
uchar code table[]={ //定义数码管显示从0--9
8 @: Q9 ?8 h- f0x3f,0x06,0x5b,: {6 |9 Y M# E5 W: z3 P& @" o
0x4f,0x66,0x6d,
/ v9 l+ z `( R1 c4 Q: o0x7d,0x07,0x7f,0x6f};
: } {; d! N. E5 F3 h' @
% ]2 q" V5 X. t0 O; u. g0 wvoid display(uchar,uchar); //声明数码管显示函数/ P7 J+ _, I( ~2 \3 a% R
void delay(uint); //申明延时函数
( N9 ~: A, C2 x- E% ruchar num,num1,shi,ge;
# i7 w# j( b; d& o4 ovoid main() //主函数. b n. C- p$ n* X
{' v5 u( F8 ?: A9 v
TMOD=0X01; //定时方式选择( {/ C- K9 w8 n7 A' R. O/ j
TH0=(65536-45872)/256; //写定时初值
9 g# X7 g6 g8 W. d, R TL0=(65536-45872)%256;) X/ Z- H6 H, Z/ z. B+ V. F0 K
EA=1; //开启总中断* Y( l6 |. f7 m0 {
ET0=1; //开定时器0中断' j j$ ?: ]" u1 M+ y* Y6 t/ l4 @( J
TR0=1; //启动定时器0/ B% ^0 n) c! \; |2 U6 v8 T j
while(1)3 ^. U/ {, W. Y# T
{5 h8 v. `9 A { U
display(shi,ge); //数码管显示函数; ~+ i$ }3 q+ V2 f* E( `
}
, x6 W9 }! w8 |4 H" d}* v" W% ~2 X- G' F" {4 F) I8 Q8 m
5 L& a' x6 d: j4 E/ V1 Lvoid display(uchar shi,uchar ge) //显示函数# g, q. S5 x( a$ ?) r: R
{6 D7 _$ a3 h8 s8 ^/ e! q4 Q9 l/ w
dula=1; //打开段选% e- q) {5 n. x+ m5 i: @; Y/ R
P0=table[shi];
/ u9 \/ V) u8 g0 n/ o) W3 M g dula=0;
4 V) ~ v: o. \ P0=0xff; //重置P0 防止数码管乱码
' P+ v3 t' j( f. r# d* g weila=1;) n. h7 x* N b0 D9 |& I5 A, Y3 y( G
P0=0xfe;& o1 c* A& Y4 r0 S9 X2 d' ^5 G. K
weila=0;- r2 X4 \6 l# j5 H4 W& o
delay(5);, Y7 E( M7 F2 `* s
6 c, u! w+ p& O- c, {. l3 n dula=1;
" t- k: f) |, Z P0=table[ge];2 N0 v# e( {* Y) u* z9 Q1 g
dula=0;- e H; k5 M/ |
P0=0xff;" e# g$ p8 A9 ?$ } b
weila=1;/ G. \& C: p1 ~7 {" t4 a0 Y
P0=0xfd;
" `' v8 V9 Q( N weila=0;( `: Y \/ Z7 ^5 {& @/ ^
delay(5);
: b9 ?& B5 m+ u, C: u2 |- k. C}
* c1 b4 ?) h2 q5 x4 `# W
: E1 T/ [# Z6 M8 W! g; Z4 q) R2 Q- Kvoid delay(uint xms) //延时函数 延时xms ms( X1 }8 _ V3 D" w7 E3 g2 G
{
6 g7 U; V5 t8 l& U% [3 Y3 W$ ?* u* M uint i,j; ?5 l3 K5 F S. b' i
for(i=xms;i>0;i--)" m/ {6 s, \0 P& f- I a& ~
for(j=110;j>0;j--);
- [% @: P; z( U r1 t0 b6 ] A }5 u* F& N, E) V
0 \$ o# d; H; \void T0_Time() interrupt 3 //定时器0中断 定时方式15 J/ c& v8 @; |9 J
{3 t; I3 D/ j+ l M$ y
TH0=(65536-45872)/256;* Z6 G% s7 P* n. y9 q
TL0=(65536-45872)%256;+ p' Y, D3 ]* I. z+ }' {
num1++;
7 a3 c& S7 V4 M if(num1==20) //检测到1s了没有 1 B5 P5 k2 H) J
{
; O# P5 `/ U2 U1 z, X0 S9 E num1=0;
7 H( t& z; t0 q, H4 K. C num++;- O/ ^# F' ~3 u0 B+ L" q& e, O+ }
if(num==60) //实现两个数码管从00--59
|# t- O6 N; N+ N$ P- P3 r num=0;
5 D( U- z! L" ?9 w) N shi=num/10;" Z, L8 x* i& ^0 g# B. n
ge=num%10;
) [+ ~/ c6 J) }' n4 w# V }4 c q |6 G# x) l9 n
} |
|