找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3396|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
) Z6 V4 |! @- }/ R' D程序如下:
) O; s9 e( G5 |5 D2 L#include <AT89X51.H>. F( A3 p2 [1 @$ x- R) P4 c
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
" @1 @$ `# d' j) uint i=0,j=0,k=1,a=0;
  e" X" ]& e5 B6 W. dsbit beep=P2^1;/ s  K; a& P& N( @
sbit P35=P3^5;) ^+ `4 F( A* k* O4 M" ?
sbit P36=P3^6;
; V; J. H7 ~7 q. T8 |sbit P37=P3^7;
1 o  k$ E# o5 J) c# k7 O+ bvoid delay(unsigned int aa)9 |6 p, q2 y: _: K
{unsigned int jj;
8 U( p3 k: y* d1 }6 h3 zfor(;aa>0;aa--)2 K! d2 l, V& R; {0 z3 ]2 j
for(jj=0;jj<60;jj++)1 y: R6 h' w1 r$ Q; R0 x5 |: x
{;}}
$ @; k/ T+ f8 ]' {/ Jvoid main(void), T9 H1 V% P' ^# h" Q0 ^- Z' W9 b/ N
{6 a& a2 e( i1 Z0 r
EA=1;; H  n  J& ^6 w0 Y
ET0=1;+ b; T) M) G, Y
TMOD=0x01;* D6 _& S! {$ q' x: L. r
TH0=0xff;0 g2 }6 m! x1 ]$ l
TL0=0xff;
' c% }! i7 C/ d7 F3 VTR0=1;
7 l. Q, D. l) k* @, `while(1); n, Y, i( ?- t6 S! k; u1 b2 J
{) ?0 E4 M9 B9 {7 }3 T9 O
}  }
5 Q+ ], |' \$ A. w, f5 U1 m# A. ~- R
void timer0() interrupt 1
( V( Z! T2 F& @( o3 s% ~- e{if(i<1&&j<1&&k<1)- l( q( s$ J; `
{P37=0;
$ w  n( T! z; h4 r( V, pP0=led[0];9 G1 E! Q+ c$ f
beep=0;                                 % c: v0 V- Z+ z1 L3 ^
}
, Q& B6 j1 G9 S) o2 ]; T; \" \else  + F3 N5 i9 P# H" o: C: {; K5 o
{6 K9 N: v: |. K' w
P37=0;) X8 b5 t1 S: K
P0=led;
- N0 U" j) O9 T  ~$ [# P+ q! g6 ~delay(5); , C: t# {' E  u! G  m* Q
P37=1;
3 E7 C  r$ R9 h% A5 z$ K}
& i: j, K  `. F" P7 @if(j<1&&k<1)7 W  v: {6 C* y0 |5 n
P36=1;
: v: l5 Z  `3 ^else
# f5 a  C# Z' @' ?" b{$ L$ I2 D! C3 `4 C
P36=0;
! e1 ^% I% b' C& Y* m! ~7 VP0=led[j];. g5 t7 b9 [9 _% Z6 M0 G
delay(5); & S9 Q- o" V4 O# @$ h
P36=1; ! p+ M% ?. A" W6 ^
}
# z& b; @0 P$ A. `( t6 `/ pif(k<1)  |9 H9 N$ e/ W$ ~
P35=1;
- t1 T  P5 I  y! D' h' jelse
0 H/ t8 H0 G- K: u{P35=0;
5 X9 {; W- @% d2 sP0=led[k];
/ b; u7 S9 o$ v  V# [( i6 f5 Odelay(5);  
9 c; f: a# D9 G3 w1 n, YP35=1;# O' L4 k+ \; z# I
}a++;% o5 `; [9 W: J9 L" G" j0 f1 [
if(a%20==0)1 v% Y. y' B- D4 }0 w/ B, D
{ ( l/ a& B- P- ~" n
i--;
% l7 E7 t3 K& N- d) D: g2 Cif(i<0)
4 J  d. `4 t  K+ b8 k7 e{i=9;. I4 ?- l. R6 {
j--;}
4 t! I2 A( N1 ]5 p; E  e$ Lif(j<0)                     
8 `( j4 L% O  L% `" b{j=9;  t0 R6 N& S  ^8 R
k--;}
* k8 n& i/ ]7 NTH0=0xB1;
$ K8 H/ w2 N/ N6 D4 qTL0=0xE0;
  R. C) C- {) ?4 X* x. d4 o}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!: h: W, w/ C* S3 c
9 J$ B: v( i2 x4 n7 d! G
你的延时子程序中的延时太长了,所以闪烁。. t, G3 V0 M) L7 T; U0 j  r
., F5 H' L0 h" n& _- T$ ~
syw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
! I  D, o3 H( {) m( z- i6 f5 _.
' j" B/ M$ q5 d: V; G  X9 H你用一下我给的延时看看还闪烁不?!$ b2 q3 W& Y5 U2 A
.
7 N1 t; r8 T4 H; g( [: Usyw  091205---05.11: d1 D! }/ ]* x! h5 o6 M' `

# F" O5 q6 r7 @1 s% p9 p( y$ E
# E2 h+ g4 G: H( P, y* |. z4 B* U0 q2 E, _( g: ?- ~& P4 D
& ^7 i  H+ B* X" ?" r4 |0 @% z) |! C
        P0=xsjs[xsjs1];# e% K% h: r# y0 Z$ h2 P
         P1=xsws[8];
7 Z. G! o, C+ t* _1 b        delay(10);. V0 s3 m3 F" m% s0 U
//****************************% p- q) |* w: f# d( @; b  h& Z
    void delay(int x)$ V, k% M+ D# _6 O$ H
    {1 ^7 E2 u+ G1 u  O
      int  y, z;
4 M% t6 U! r/ u4 ^- G        for(y=0;y<x;y++)
) s2 Z# N9 r8 ?' R! v        for(z=0;z<2;z++);
1 I* A8 a) Y- x9 J# h  p; a     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。, K4 R0 {, ~- K: [' H, d- I
#include <AT89X51.H>7 d5 X* K% H8 Y! x* q1 F9 |
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
$ Y* ^5 o) \( Y& G+ j% sint i=0,j=0,k=1,a=0,js;: C: r: m( k( ]
sbit beep=P2^1;
5 x& Z7 K0 p  B% ^3 ~7 v& u4 P" t  E6 Gsbit P35=P3^5;* l0 L5 Q4 G! e6 O3 I
sbit P36=P3^6;
: `, s4 f8 @1 Fsbit P37=P3^7;; N" j# K" V4 I1 h0 S+ s
void delay(int aa)
/ ~( w) ?3 H. {{int y,z;% q5 l) X1 B0 e, Z* E3 I/ M
for(y=0;y<aa;y++)
8 P9 \: f* H; m* }6 d; g  ~for(z=0;z<60;z++);
4 E7 K( z1 Z5 @/ M9 i) Y8 ]7 U, k}0 Q! n9 j% h4 D# x" @
5 k, W5 {: e8 `+ h
void main(void)5 `* D4 x& \8 L" f0 n
{3 {0 a$ ?$ B( _' W) r" E6 D
EA=1;& U, t- \+ L0 s" n. k8 W/ Q2 L8 ]
ET0=1;. ?9 L* C1 j! t. t. `  P6 X( E8 J
TMOD=0x01;
: r9 G* g# `; GTH0=0xff;. Q6 g% v0 z/ n- e  {: f
TL0=0xff;3 u# e* I! u, k' P: K% R
TR0=1;7 W2 t4 J6 j+ @( k- d5 e( {
while(1)
' N# u; }% O' X5 j{
3 @5 k' U2 _7 i3 w. b1 zfor(i=100;i>=0;i--)& J  U( p: b/ h1 q& N
{- X+ K, [+ u5 l5 W5 d: @  |3 W
js=i;
' B* [; s+ I& ~ delay(500); } & |% c3 u6 N$ p: m5 ]' p: R5 f
}         }
, a$ S- q3 j% W- N
, j  A" K/ a! X8 r( c1 s
; y, E& M& Z2 zvoid timer0() interrupt 18 l4 L: M0 P" x! H1 c  L
{) t$ U! v5 \7 {
  P0=led[js/100];7 @% w  d+ a! e% U0 n2 g
P35=0;) _, O% o, [5 o- f
  delay(5);
6 {4 s% V1 C# Y$ r# y( a          P35=1;
4 p8 a$ X+ j6 M  P0=led[(js-(js/100)*100)/10];
+ x# y  c5 P2 u. IP36=0;
. P  a) S7 O7 j7 u$ \  delay(5);
" I) s; v! ?# y P36=1;
' B5 g7 N& m7 X& h8 |( C3 ? P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
0 D1 j% o8 e, z+ |P37=0;
, s1 ?, b' m/ B% l# A: x. p" @ delay(5);
* S1 Y9 S; t3 t" J! t. B  P37=1;
& |4 J. a+ R4 Y% ]  ?
* j# ?+ u1 H6 p- o) {TH0=0xB1;
; f1 G- N  R7 W% P; i8 U1 q8 `/ r( cTL0=0xE0;
: u/ O! U# Y% Z5 u3 G, _; M2 {8 k8 R* c1 W0 s
}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-7-6 08:27 , Processed in 0.066426 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表