|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,7 |3 Q$ w- W o
程序如下:
: m1 R7 V% w0 {0 R# d#include<reg52.h>
n" [( V# f% X6 y' L4 `$ a$ y#define uchar unsigned char //定义uchar uint& a" R3 z% j e2 v
#define uint unsigned int) t/ u( {4 p! B$ K- ?
sbit dula=P2^2; //定义数码管段显示' ^/ ^0 b' `5 q' _- @; y9 s
sbit weila=P2^3; //定义数码管位显示
2 X$ t( J# w, J( P8 Kuchar code table[]={ //定义数码管显示从0--9. ` g0 G& P! h. i) |- v
0x3f,0x06,0x5b,( O4 l8 `! ^# D! m L! s
0x4f,0x66,0x6d,8 j8 i* H7 E! t
0x7d,0x07,0x7f,0x6f};
% h$ t) ^2 s' g3 H+ u7 z$ y( G8 j% V8 M1 \7 ^
void display(uchar,uchar); //声明数码管显示函数
: t! f9 s0 t7 j0 J5 [ I0 A2 Svoid delay(uint); //申明延时函数 O: W1 P, U0 V; y& b" E% @+ _
uchar num,num1,shi,ge;
) r$ N; J3 M- ~( yvoid main() //主函数. J+ c1 x8 U$ ~
{) U8 H* Z8 h( ~
TMOD=0X01; //定时方式选择9 I+ i% W! T0 [
TH0=(65536-45872)/256; //写定时初值
& N7 w* H3 X8 ]3 V0 F# D: w! H TL0=(65536-45872)%256;
. S9 B) I$ F3 } EA=1; //开启总中断
# w9 h$ j7 I" m$ K4 H ET0=1; //开定时器0中断6 [$ ^3 m9 L8 n' n; O! C( |
TR0=1; //启动定时器0
: B1 D4 j5 ~# h B/ O$ ? while(1)
9 Y& n P$ U7 R1 e! | {& G8 l3 V( d; o+ o& ~ N; z4 R7 I
display(shi,ge); //数码管显示函数 |# w3 b$ b% n0 \+ C6 O5 d
} N# T5 s* J5 l, W$ V
}
# C! z! K' x. M* K, a7 ?
+ P0 K7 y/ w% `" h* [5 \: jvoid display(uchar shi,uchar ge) //显示函数+ ?: Z# |, S6 P' q
{& L7 q" F& x& U) Z ^
dula=1; //打开段选
3 v4 N& b8 o! k1 {# ] P0=table[shi];
0 F! ~# j; S, j1 y5 _ dula=0;: l- i7 A j8 V$ I
P0=0xff; //重置P0 防止数码管乱码' E9 Z( M. ?3 P! _/ ]& x' H- k# S
weila=1;
! Z F4 @1 b) } P0=0xfe;
" I/ \0 W+ P- \& ] weila=0;' g B! w1 I* j5 I* K+ g
delay(5);
8 l1 L/ _/ k8 t# C J5 o6 k
4 `! I& |6 ]/ k. |$ s- a$ P dula=1;( V j+ o) L4 q1 p
P0=table[ge];
. r" j. t) n9 @8 B$ C" K dula=0; ?! ]4 W# Q W$ N4 x" ]' d
P0=0xff;
; K1 v5 K& K9 k `& j: o weila=1;, v* f' H. a8 o: U- A
P0=0xfd;
8 ^; {4 A4 q m7 e' P9 `9 u weila=0;: ?/ P! ]6 g; ~8 }' c: p/ A
delay(5);
; _$ H7 \; q- t5 d* d0 [$ N}. ?+ ?5 M- R1 M: |: w% l) w, G
' Y! W% w0 f. j% }0 Bvoid delay(uint xms) //延时函数 延时xms ms/ d l) U. w( n n7 o( Y) i
{
/ y# e6 @8 t+ K L% `" f uint i,j;$ O. a6 I2 I2 v" r& r& f1 U5 Q
for(i=xms;i>0;i--)( p( } l T( D) b) S4 t' k
for(j=110;j>0;j--);. z0 @! J- w. p6 a8 M& T' k& w
}
, z( o# N5 Q- q& v( Y2 y* d7 v3 D4 |' B
void T0_Time() interrupt 3 //定时器0中断 定时方式1
$ k5 g3 U. V/ v* P2 y* O2 z# y{
# `1 }8 w5 Q3 x5 B TH0=(65536-45872)/256;
+ M) v" M5 z4 s! f: {+ `1 Q R; p TL0=(65536-45872)%256; D* Y3 W E& r
num1++;
/ {. i; Z) s! ^: T3 B- j if(num1==20) //检测到1s了没有 ) }$ Q, J$ z/ x2 Q8 R
{
) B% L- S, d+ L5 c/ p num1=0;) ?/ l+ C& h# n. Q. }1 B
num++;
z1 O+ H6 J* W+ Q$ ~+ M3 q if(num==60) //实现两个数码管从00--596 l, n0 }8 d' b5 K: r
num=0;
5 H/ N, Y+ L& {3 T4 U shi=num/10;* Q d( F8 b+ w- T" \2 `8 X
ge=num%10;- u o3 A5 f* |; B
}
! a5 l! X# p- ^3 {, x0 Y1 @6 u} |
|