|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,
1 F$ P! T; S1 q* o程序如下:
4 {* B/ J0 h& m0 W# E. C9 o#include<reg52.h>
) S2 r: y K! u; T#define uchar unsigned char //定义uchar uint
: ]& K7 m2 R7 Q% b* x5 r0 b! f#define uint unsigned int% u3 F% A/ I; |: `+ B# n
sbit dula=P2^2; //定义数码管段显示4 r+ ` j# @4 I6 `" x; g
sbit weila=P2^3; //定义数码管位显示
* H( T/ j/ O# \- n5 U. @& uuchar code table[]={ //定义数码管显示从0--9
$ u: |! l& p: {6 Z! R6 z0x3f,0x06,0x5b,
( p. v* ~ `( i% H& H1 F& r0x4f,0x66,0x6d,3 w5 V- Q" o+ t) ]/ G" Y
0x7d,0x07,0x7f,0x6f};
' S6 u7 n$ ?6 o9 V9 \7 s' Q& k. v- s% ` Y
void display(uchar,uchar); //声明数码管显示函数
2 Q4 F9 z8 }' e! T: cvoid delay(uint); //申明延时函数
, `3 F+ x: X- v5 Wuchar num,num1,shi,ge;
( R- X: V# c2 s ]: ?- {+ ~/ X0 Uvoid main() //主函数
% I* v- Z! x9 ?! v: @{" P& d9 f/ t4 b7 r' T! B
TMOD=0X01; //定时方式选择
# ~+ L# {, w1 \9 X6 y TH0=(65536-45872)/256; //写定时初值
; e g: F6 E) E7 t c TL0=(65536-45872)%256;8 F% x1 I" d" u$ [' D7 i$ J# w% Z
EA=1; //开启总中断4 O4 I3 o, @$ ]) H9 L L; D
ET0=1; //开定时器0中断
& L9 O \8 D0 \! ?( v7 n TR0=1; //启动定时器0
4 q, W- S4 n1 ` while(1), H2 b) g' a3 S" @. U
{) k# r" o2 j& f' ^; l1 J: H7 t
display(shi,ge); //数码管显示函数2 G) Y1 z9 x. H' e( x
}
1 J$ O' {7 v, A5 N2 o# D- X}( d, C5 I7 a* k/ x; Y+ w( m
3 c5 H5 I" Y0 E6 r$ evoid display(uchar shi,uchar ge) //显示函数
1 q; v2 O) R+ h! G0 y{
7 {( R! Z- O* E2 @0 N5 n, M- |* | dula=1; //打开段选3 `5 S# U. t: {3 i# [* f# N7 N
P0=table[shi];9 m- g" x+ u! c0 r4 ]3 T
dula=0;
& I5 ~$ t* D5 \ P0=0xff; //重置P0 防止数码管乱码! e, Q; C h4 y' s; W' V- o0 w# I0 p
weila=1;" f: ` S# y2 c" E
P0=0xfe;
! r3 m1 V2 B d- C; ~1 s weila=0;! \( Y' W: w1 o0 B/ u7 |$ E
delay(5);
! T; J4 ~9 r: y0 F$ {- @! U2 U & R0 w# [2 [0 h: c$ U. t: A
dula=1;4 _4 K3 O5 t9 C2 y& `# E
P0=table[ge];- z8 D7 w+ Y$ V) v# U
dula=0;/ j% s* U) j* K' K! q( |
P0=0xff;
; X! S1 d8 R7 T- P weila=1;
, Q5 }4 {9 f* I7 k' F P0=0xfd;
: ]6 J: g. W `8 \ weila=0;
; q' R9 U. X, C7 Q; z$ |5 q/ [ delay(5); D3 Y& o9 }4 [1 I
}
9 b S* k( P6 m) G/ o) K2 ]
V$ H/ n F% _( u) r- [. f8 `6 zvoid delay(uint xms) //延时函数 延时xms ms
2 R; y0 E/ x2 {. y+ L{) v6 \, B6 |0 F- e M- i
uint i,j;5 L* @* M+ n; x6 [. z
for(i=xms;i>0;i--)
% k2 p- s2 u4 c! ]2 d for(j=110;j>0;j--);6 u* v; G/ u+ |8 _2 M+ n# h" |! l# F
}/ k5 D& @4 [/ q0 D; ?
- G+ \) O0 Q: m! t. u9 ?5 z% m
void T0_Time() interrupt 3 //定时器0中断 定时方式1
' h, q; A9 B9 H' \' V{! ^8 l/ Z' r! r. |( ~
TH0=(65536-45872)/256;0 x7 z* _, J1 ^7 O' ]5 a
TL0=(65536-45872)%256;
4 n; O. [" g. {) i num1++;. g& k4 O; v0 ~
if(num1==20) //检测到1s了没有 " I/ s0 `- Q- F# B9 Z. ~
{
1 Y5 @0 Y( u8 s- c/ X num1=0;
& {- u; a3 a9 l6 y+ n" T num++;# j% ?. }4 H% U1 x; t
if(num==60) //实现两个数码管从00--591 W6 Q f, f Q1 l) I3 @9 a n% i
num=0;( j( n$ j* n. E! j- A: V
shi=num/10;
6 u! P! O. s @0 w ge=num%10;, r0 @4 z5 m( j; S% P1 H/ F
}
! V2 D6 q1 }9 H8 t: Q& _6 q; X, K} |
|