|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,
; H/ j2 C3 ?$ T+ G. h3 s* p程序如下:
2 l# I" [2 e' ~$ z: k7 G# w#include<reg52.h>1 x' v9 n: t& K; O# F# w5 x" y
#define uchar unsigned char //定义uchar uint
- p$ _* t3 \% c4 A#define uint unsigned int+ u- A4 \. J8 Z6 F0 {# [6 w# @
sbit dula=P2^2; //定义数码管段显示
" x5 P: c) C0 m; H2 `4 o) w3 Hsbit weila=P2^3; //定义数码管位显示* W7 d8 h3 y9 W/ e! g6 B
uchar code table[]={ //定义数码管显示从0--92 l' X3 N4 j- X5 w* y
0x3f,0x06,0x5b,
+ Q1 S6 f1 m5 C0x4f,0x66,0x6d,3 ~2 a6 q! x: C8 D- H! j
0x7d,0x07,0x7f,0x6f};
& E5 i# @" U6 ^' O' K, K) e+ K
8 ` Y* _5 D# e- p/ R+ svoid display(uchar,uchar); //声明数码管显示函数) E5 \; m. c) u! w3 i# E
void delay(uint); //申明延时函数3 N0 o P/ ]' d) C0 F8 m% [
uchar num,num1,shi,ge;/ ^( X9 \% F" Q8 V: l
void main() //主函数8 [- d# U3 L& L$ o/ Y
{$ T) ?' o- I4 B
TMOD=0X01; //定时方式选择
3 J1 z: D) a, K. B. k; P TH0=(65536-45872)/256; //写定时初值! x* v2 c0 W# _/ F5 c! \
TL0=(65536-45872)%256;
t b9 |1 P8 f$ n# C$ j6 U/ e EA=1; //开启总中断& @* r* t) ^, n" J; K/ N! w$ x
ET0=1; //开定时器0中断
- }; E( ]& L" W* u! I TR0=1; //启动定时器0) T# f* ]! Z& g% T0 }( V, |
while(1)
3 U* S8 r2 v% n8 f0 l7 R {- j" }2 `. p9 {% L' Y
display(shi,ge); //数码管显示函数, ]( A+ n6 A5 f$ F
}
: v M" ~+ Z) N! }5 v- M% c `) N}
/ x/ i: X( `' k M% h. k: I. V$ B
& K5 ?( j* b+ m1 I( h Uvoid display(uchar shi,uchar ge) //显示函数* P1 U* I+ k3 T7 r( ?
{
) s- [' {& U7 w5 Z+ b* B4 X8 N3 | dula=1; //打开段选6 [( x$ e0 _$ ^4 h
P0=table[shi];
8 a) n# }- u$ L, D8 j# k1 l dula=0;
. \+ @, l+ A% F/ h! U P0=0xff; //重置P0 防止数码管乱码
0 c: l# U- o" _2 U3 h* j0 ~ weila=1;% p: S. ]$ ?3 e9 j3 ?
P0=0xfe;
7 _9 ^" h. @8 T. T weila=0;/ F& U: b7 Q( h. J- Z, a" u
delay(5);
6 n$ ^. B+ k3 v$ w# n; R 5 m! j/ c6 h* w% g; ?! @
dula=1;" \/ B2 I4 _3 \6 q' J; k! Z5 }8 l
P0=table[ge];) A7 X, ]" R6 W* r
dula=0;) }5 B. O- Z0 I+ q/ o* U* j) h7 G
P0=0xff;
t7 z% m/ |" z6 B# X( _ weila=1;
/ B, h( }- X1 b w! o P0=0xfd;, O6 W9 m/ X8 E! Z
weila=0;
& J7 n5 F# A8 X delay(5);
: A1 M: v1 c! z6 }2 O}
$ [" W6 [4 @3 ]2 R2 Q {
" T( D ]5 X- m B0 lvoid delay(uint xms) //延时函数 延时xms ms8 h. b+ ?* \: I& Z( k
{* T9 M* G, s, i8 f( `
uint i,j;
3 |$ s* `/ F# s' a, T; ] for(i=xms;i>0;i--)% W5 [1 [ I5 T9 [% o* N
for(j=110;j>0;j--);, D ?6 h B" C/ g. E' e5 e: \
}( ?! ]; k3 M/ \5 ?3 {9 |2 i5 ]+ b( g
' L$ k' J6 A- j7 B( f, Dvoid T0_Time() interrupt 3 //定时器0中断 定时方式1
0 b% u+ ^: e1 X1 x2 h' ]2 y{: _$ V% a$ k) W+ y1 q
TH0=(65536-45872)/256;) S5 v4 G* S/ U4 E A
TL0=(65536-45872)%256;
' W, F/ \6 z( T num1++;' J5 s5 d& l! `* Z+ W. I( p* g
if(num1==20) //检测到1s了没有
+ e1 |' b- |; U4 t4 ~) n {
* W" _) t- s0 ^! X; G- A( T num1=0;
+ \( @" x2 S5 B( S- \- `4 u; I num++;
8 q9 W- Y' \4 G# M! X. D. E) h) Q if(num==60) //实现两个数码管从00--599 c4 x- q* X' W& Z! W
num=0;- x& d0 J4 v. o" k1 r$ l
shi=num/10;6 I$ V( }7 W R5 G( }
ge=num%10;5 `" z0 a" n; v$ }: ^) f
}3 k# x) p$ h' _
} |
|