|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,7 g! X3 \- Q0 ]/ M1 G
程序如下:
1 ]9 Q( ?; @5 \( p1 x1 Z# N( c#include<reg52.h>
8 I9 ^# x* ]9 r#define uchar unsigned char //定义uchar uint
" f, U. v2 N- q- q8 t: x( z#define uint unsigned int
1 \1 w+ J9 a$ [& F# V+ e7 c, psbit dula=P2^2; //定义数码管段显示" p j3 E+ }7 k0 z6 P: s+ S
sbit weila=P2^3; //定义数码管位显示
4 U% x, w7 u( T9 `: R, k# C* Juchar code table[]={ //定义数码管显示从0--98 d1 t5 V: P4 r C; M" X( i! M B
0x3f,0x06,0x5b,6 Q5 z( _: ?- p, T6 h' q6 B+ {4 M
0x4f,0x66,0x6d,9 Y3 p9 H( \* k1 q. _1 T
0x7d,0x07,0x7f,0x6f};
5 v: }6 V6 O$ F7 g9 f! H# v
+ v" `% g8 y3 |! U$ P; l0 rvoid display(uchar,uchar); //声明数码管显示函数
# F" I+ H- g3 kvoid delay(uint); //申明延时函数) g- |' l: S$ y; b/ U! f
uchar num,num1,shi,ge;
6 c9 i! D! j1 j' y2 Lvoid main() //主函数+ q5 {" K R6 u# ?
{
4 ?; s- o; P* U. Z: P* c4 B; Z TMOD=0X01; //定时方式选择; e& s4 {- w/ y% w( S% [
TH0=(65536-45872)/256; //写定时初值. w; b6 T# s0 e; M1 b
TL0=(65536-45872)%256;. ~: l$ d& L1 v
EA=1; //开启总中断) u h6 n! b0 T$ ?* ?7 s
ET0=1; //开定时器0中断' t. W- a S8 E# q9 t) O
TR0=1; //启动定时器0
9 w* N! |1 G& X0 n$ m: X4 \ ` while(1)* p- _, J; q. y) z0 I1 {6 I3 M7 l
{# r- e6 u, o9 a# L# {6 `
display(shi,ge); //数码管显示函数
% Q |$ k7 j! R; U' [( x; w }
1 B2 J: H" [: Z' P* y% r( T}
# A! E7 k$ V1 C: {/ i5 H/ F5 n
9 H8 Q1 n1 G5 Hvoid display(uchar shi,uchar ge) //显示函数
: C- T2 H3 R- E+ u, c{; v+ S7 W) b% l. w' m2 r
dula=1; //打开段选8 U, E0 }0 c6 }: _( P
P0=table[shi];1 J' d- Y- G M: X, j% E
dula=0;
; q1 C% \2 g5 T/ K, @ P0=0xff; //重置P0 防止数码管乱码. L1 p. i' ^$ B
weila=1;
2 R/ f0 o- I2 T: q7 m1 I P0=0xfe;
3 V1 k2 m b+ w$ X! J weila=0;/ q- `- {5 s( }& l! s( {
delay(5);
3 s7 B$ B: l$ j7 I
* G) f- H) m9 h/ Z% O& z dula=1;8 ]9 h1 `5 A% G. f0 I4 N
P0=table[ge];
8 g( g" W+ |2 b" o6 M6 W dula=0;
3 a0 b1 Y& Z b) ^; h P0=0xff;
( y' I& l. P4 M+ e6 i1 T# J, O6 a weila=1;( e" Q( O( K) X$ L: ^6 Q; ?
P0=0xfd;
' I2 p+ z( S* ^: O! c5 i: ?+ `, [ }/ S weila=0;
# ~6 `! [$ v- D- w/ w6 W delay(5);7 @$ B- s( F- w$ u) H
}' J6 W* K5 M4 P4 T
! l8 v* u' h( m$ S1 W! q( q- H
void delay(uint xms) //延时函数 延时xms ms
( S. ]% c# I& s# ^% D) T; |0 h{# N2 C4 A- K. t! X) i7 ?* O9 c* K
uint i,j;7 K+ Z* K! a. P( S6 a2 |
for(i=xms;i>0;i--)% M t2 P l3 \, ^* F9 ~
for(j=110;j>0;j--);
- r Z4 {8 l/ ? }
" L: t( O8 P& Y9 f) e( |6 X& I# d
$ U% [: I8 A, w+ {void T0_Time() interrupt 3 //定时器0中断 定时方式1: K% Z* s9 D2 N/ ?
{
7 Q/ D4 Y/ s& s- m+ \ TH0=(65536-45872)/256;
$ D% ?3 ~3 i7 I3 f0 g6 Y" |0 `; y TL0=(65536-45872)%256;
9 j$ y! B. Q- b7 c num1++;# W3 R/ V1 I" h; A9 v
if(num1==20) //检测到1s了没有
+ c, Y3 v( b; e% L; P {' Z& ~. P7 ^8 F
num1=0;+ z5 S& G( ]. H/ D8 c. Q
num++;
4 k& ^' O$ `7 H1 l) \2 ^$ D+ E if(num==60) //实现两个数码管从00--59
# d" r8 x0 x% o5 X$ A3 g num=0;
7 i0 U, R# @/ a1 D. x: z$ v4 i shi=num/10;
: l( u# z( u8 C. d ge=num%10;
; i' Y$ `% D1 S6 ] }
2 U! e4 v4 q7 a/ }} |
|