|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪, s2 Z" W8 c+ M5 v9 z4 G
程序如下:
0 ?) A; r' L9 d4 ]/ V& x#include<reg52.h>0 I8 C$ `' A, d8 J1 c. p
#define uchar unsigned char //定义uchar uint
* Q" n! {* m) [9 S#define uint unsigned int2 V. G6 p s; G% u7 f1 z
sbit dula=P2^2; //定义数码管段显示
! r" @* l0 o! c8 e- Ysbit weila=P2^3; //定义数码管位显示 U$ r; m3 S4 H* q) O- ^
uchar code table[]={ //定义数码管显示从0--9; u$ i! t/ V+ P' C0 U
0x3f,0x06,0x5b,, R# x1 E7 r2 k% [( T
0x4f,0x66,0x6d,' M3 T6 M% G' g0 ^
0x7d,0x07,0x7f,0x6f};
, M5 z' s8 I! P$ q/ i7 u' e p }- V" e
void display(uchar,uchar); //声明数码管显示函数7 \2 k) P, \; J4 N7 ?7 y
void delay(uint); //申明延时函数) G) D4 O& A# X
uchar num,num1,shi,ge;& x7 c8 Z& x: H' Y/ z7 O- T( C8 t
void main() //主函数) Q: B" k- C% \# P1 C* G
{
7 K+ S6 P, ^$ [% {% o1 |7 A TMOD=0X01; //定时方式选择
7 ]' K* y7 x9 F TH0=(65536-45872)/256; //写定时初值2 b: C0 [2 ?) o( ?. U
TL0=(65536-45872)%256;2 \' {# _/ O& T( M
EA=1; //开启总中断4 Q' Y0 t; j. }3 L* a
ET0=1; //开定时器0中断
4 b" K+ L( ~* L# ~8 N9 T9 ]/ e TR0=1; //启动定时器0
) W& v! {* @, P% N. k while(1)
" W( g5 F! c l- K* t. c {
5 r3 t; s8 w2 b0 Y display(shi,ge); //数码管显示函数
/ \& G* ~7 m: Z2 d- r' T }: ~. S; ], d* Q0 o5 F
}, r" \$ [! W' z$ [- Q8 v( v" b
, {0 r0 K! C7 u2 f4 kvoid display(uchar shi,uchar ge) //显示函数
0 T' q; ]7 f- c{3 F; Y1 |# }+ _, {7 \
dula=1; //打开段选
9 i- Y# S. M; F/ h P0=table[shi]; i( B' d2 t0 l2 _, U
dula=0;
9 s9 z8 d( `- C: `. _( t: k P0=0xff; //重置P0 防止数码管乱码
0 Y5 G. f' A) h: N weila=1;
& c- g8 ~9 @' p+ `' f0 \! h% i P0=0xfe;
/ V9 j( }# W. W# p/ C/ ?& n# w weila=0;" y9 l( Y. v8 `7 g# G( z
delay(5);7 ~+ x/ a) B* l* P* s8 L
4 z) Z2 _1 Q# H7 T; s7 V. v: d dula=1;
$ a5 D/ j& \3 K2 q, O; A P0=table[ge];# @/ V4 M4 y4 O n7 e
dula=0;
0 c$ I6 L, `0 ]% @" }) S P0=0xff;* a" P3 q3 j. X8 Q
weila=1;
6 z D8 x; e+ o8 s' v# [ P0=0xfd;
' m2 p, Y L; Y* C weila=0;" }- q. E; N( j7 [/ o1 }; @
delay(5);
6 P( M9 r: @- C" B, F5 A g}
/ J/ r; s7 y2 [7 d
! K' Z( u4 F( _* d( j$ Dvoid delay(uint xms) //延时函数 延时xms ms
- ^% c# p, Z8 z& f{' T6 Y; w) i3 r& Y) n
uint i,j;( F8 H1 W1 e X6 J6 d& q
for(i=xms;i>0;i--)4 f: t/ Y T/ x1 ?; p
for(j=110;j>0;j--);
, ?8 b: k' V$ I! p$ W! f) F4 } }
( e) C( H; U* |8 S- Y1 P: S# f# v3 m8 C
void T0_Time() interrupt 3 //定时器0中断 定时方式1
- ] B; e; u& _5 B/ L{
9 U, {) Q# ^, p! \ i TH0=(65536-45872)/256;1 F. s' H' Y4 S$ ~5 p
TL0=(65536-45872)%256;
; N, F: g# V7 S+ ?0 J5 c) S num1++;
8 B/ S! u; x) R4 M( W9 P if(num1==20) //检测到1s了没有 # D# K. _1 f' L" W( {1 m
{4 ?! K* k+ O) u2 W5 |4 Q5 G
num1=0;% D- e6 L+ q/ W0 j
num++;
, K, C) X! `8 n6 ? if(num==60) //实现两个数码管从00--59
( D8 ]2 ^/ n0 n num=0;
8 w2 c, I- Y1 O, A shi=num/10;
$ `" C) F, Q! w% `5 f ge=num%10;& d9 g4 ^: B& r- Z8 C' w; Z( W5 |
}
2 u" x# s1 p4 Q+ }} |
|