|
|
谢谢楼主.顺便请教个程序.我想用定时器中段实现两个数码管显示00--59;结果数码管一直显示00;不知道问题出在哪,
& W+ _/ R, N+ ~* W, \/ R& g程序如下:
0 r1 G0 k" x0 q: k- @5 K; [3 u5 _) B#include<reg52.h>- `* R) f; k/ K3 x2 Q$ F& _- l8 r0 ^
#define uchar unsigned char //定义uchar uint
+ @. b9 X6 A" i" O#define uint unsigned int6 u8 _' b; a* R6 M l
sbit dula=P2^2; //定义数码管段显示" ]5 n, M, j$ F' N: k
sbit weila=P2^3; //定义数码管位显示: B0 U- A& @/ \# i
uchar code table[]={ //定义数码管显示从0--9
/ J A/ A' E- M* ?6 R. L2 o4 t' l0x3f,0x06,0x5b,
: |- d1 e+ e3 {# B0x4f,0x66,0x6d,8 D' M% S/ s! p5 D' o# P: m
0x7d,0x07,0x7f,0x6f};2 r( e3 Z, K: |; w: |8 l
3 V& x" ?( w6 \# u
void display(uchar,uchar); //声明数码管显示函数
; Q/ K, A/ |6 Q' fvoid delay(uint); //申明延时函数
$ }# _3 H) y- r6 }5 nuchar num,num1,shi,ge;7 L# K! C9 I. V4 ~
void main() //主函数0 e, ]8 e0 ^: p; i
{' B; q) J# h9 C9 B
TMOD=0X01; //定时方式选择
" }2 }8 |4 v9 I: Q! C TH0=(65536-45872)/256; //写定时初值8 D8 j: Y% Z3 b% ?1 e3 @
TL0=(65536-45872)%256;
; L! [* v. q0 v EA=1; //开启总中断" H: W" k( ]3 {6 W9 u
ET0=1; //开定时器0中断
; r& @( A. l6 e* T' i$ u/ J# V TR0=1; //启动定时器01 {" l3 H* p+ s# {4 b
while(1)! U& ]3 ?) p4 s3 p* U0 [
{
5 }) m! T1 a& }6 J. h display(shi,ge); //数码管显示函数9 i. m: T4 A2 B- j- Q/ _" w
}: P. n& z2 B, o
}9 q0 b8 J" Y( q U
1 \7 K7 ]% H e, I6 j- j
void display(uchar shi,uchar ge) //显示函数: ~* y2 b1 D0 U% U3 {
{' _6 d7 S% T" r0 g
dula=1; //打开段选/ w1 R' u ?6 b' k5 i0 y6 a! `
P0=table[shi];
. d* q- J+ |: N6 N$ i; L& v- h dula=0;7 ]) X0 O6 _1 A) h& M( q3 }$ I9 n
P0=0xff; //重置P0 防止数码管乱码
5 h% P' Y( L; \# M" @. U" {9 V weila=1;4 F& o; p, }/ S+ G
P0=0xfe;
2 B9 u5 W, b* P. t0 I( u weila=0;
0 @/ X O9 V! `# @* d# _ delay(5);
7 ? h4 {- ]& G, M! O
% _ B. S: g! Y/ K dula=1;
( @, {& \! }; {. b, ?5 K P0=table[ge];
' H$ `4 T- J4 A8 J6 g* h! m dula=0;
0 |1 o1 |* v& i) y. H4 ^ P0=0xff;5 y5 J# d8 w: U e" x5 v
weila=1;
+ B7 e Q' X, p- d2 [( O P0=0xfd;+ b. d( q* V4 g8 I+ `9 S1 p+ Q8 j Q
weila=0;
9 ^6 I( S6 E, { F$ V) O delay(5);
% B% X$ Z5 P2 o0 I" t}2 Q1 a- U6 g- M7 F! D3 M1 S
4 Q$ G1 F1 W( C- d/ Wvoid delay(uint xms) //延时函数 延时xms ms/ c0 x' N& S4 q4 W& N1 `+ b
{
* l4 x# }, s( a) w) `; _ uint i,j;
7 B2 o4 [4 B( |) s2 M" e+ C5 o for(i=xms;i>0;i--)# Y1 W5 j/ [; K( v
for(j=110;j>0;j--);& v7 I- y& g D, U) ^( J% c) a
}
0 h6 |5 H1 a$ X- v1 q* D0 n5 D$ @: l# p) G
void T0_Time() interrupt 3 //定时器0中断 定时方式1
/ `2 ^" |# q( R1 L{
( ?' R9 t( ^0 [# u, s/ L TH0=(65536-45872)/256;
' \ A, d. x+ z1 x4 i5 Q1 p: G TL0=(65536-45872)%256;& F) a' l* b) z9 O
num1++;
! I7 U" u& g& u" B" r if(num1==20) //检测到1s了没有
% N0 U S2 i! {* W" Y6 P {, k6 j+ [ d5 W3 e9 C [
num1=0;2 t) @0 F4 N- q' Y% H; K
num++;
! V( w9 t; m2 ]2 j) L9 _7 ~, Y+ I if(num==60) //实现两个数码管从00--59/ H- _+ h; j& \; t+ `
num=0;
0 P1 R' h3 V( r2 P0 T; X0 ^; F shi=num/10;: U7 E) ^& z9 U4 f1 d# v: s& h+ Q+ H- ^
ge=num%10;
' s6 I5 Q' @& {) l% R5 ` }
+ w' z! u! D' ]} |
|