找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3513|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
8 ~7 o% K% x. Y, I程序如下:
- [1 a$ k9 [" V/ [' e: \#include <AT89X51.H>; P( D2 P3 v3 E$ u% D- v
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
! |8 W, [7 e  ?8 p' y! g) `7 K; Yint i=0,j=0,k=1,a=0;$ L( j6 a! a& R% K5 @
sbit beep=P2^1;9 @1 }6 g: J$ P& e0 h( _' m1 G
sbit P35=P3^5;$ }5 ?0 }" B- G* S( i
sbit P36=P3^6;* s' z0 M0 i6 u, K0 v: S
sbit P37=P3^7;- Q, n( U2 n* s" v5 Y* T  H# o4 ^
void delay(unsigned int aa)
5 N/ `& A7 E0 o8 K{unsigned int jj;  q3 G* \, B; a  H; j( S3 w3 V
for(;aa>0;aa--)
1 S) f% t4 ]: h: k1 ?for(jj=0;jj<60;jj++)
/ O$ k/ }( X) U, R7 ]- _3 _{;}}
1 H7 w$ [* Y! E1 B3 ]. e" F0 ~void main(void)+ @4 S4 z8 p/ k9 e! I/ L2 ^. b
{7 {; m6 F6 k1 n* f" b2 L8 x- P
EA=1;* o) J+ u& b$ O7 Q0 K
ET0=1;  W7 q, y% J: [
TMOD=0x01;' `& h) R: x5 U$ l4 X
TH0=0xff;
7 n2 s% _# E8 m) Z# n9 dTL0=0xff;
3 K/ S- l! c! F! @TR0=1;
! d/ B0 s: S) K, r- ywhile(1)
) C& I5 `, l, o* p1 B  k  u$ Z{& Q' W! \* |' S. W8 @2 \
}  }% {* P' x" l7 ^& N9 Q/ ], I

+ m2 q* b2 P9 F1 v, gvoid timer0() interrupt 1& @8 S1 q0 k; q% B
{if(i<1&&j<1&&k<1); V4 P- H$ n, J
{P37=0;
1 }( Q" K" l+ q2 z/ N: SP0=led[0];
2 K  k8 q0 N3 O; T0 X! S! z" g( n# ~beep=0;                                 
! H7 r9 I/ z, W2 b% J}
+ `/ {1 l/ @- delse  
* i* H# F/ q! T9 L1 Z  U6 x0 Q{# A. i3 y' J) I
P37=0;9 T& M9 b. ~! Q$ R! ~
P0=led;, l2 d# S$ v) A6 F
delay(5);
8 H6 p& L) H' j8 GP37=1;' |' b2 B1 r( l: E1 \5 f8 P
} 1 [# J4 ^. k4 k% m- A2 h
if(j<1&&k<1)) v- ?! e/ T/ E
P36=1;
1 I# G6 p7 l! s. D2 E$ N8 p! i& t$ nelse. W  h+ V1 j" f4 @
{0 o5 u; M& I* u  i$ E2 N
P36=0;5 Q8 a2 u$ C) q9 ^% m/ |8 l/ U
P0=led[j];+ W  I  g! e: {" G& j. F4 `: a
delay(5); 9 T! `" L, ~" x2 _* U
P36=1;   \* S- ~; }$ C* |6 u+ j  W" \" G
}* @/ m4 W- G; X! M+ ^
if(k<1)4 t/ j* j1 z: P  O0 ~% q
P35=1;! Y; k  b" m: l. p
else
2 \4 E- b7 M/ m{P35=0;
% }& I5 B3 B9 ^6 O' j( l( VP0=led[k];$ ~4 F8 x& g7 F$ Y8 o
delay(5);  
0 a4 V. ]6 @7 ~; T: ]P35=1;  y& P$ d6 V) a, T  x
}a++;7 B( R0 F- [4 t1 ]
if(a%20==0)& D" j2 U0 U6 k) N& u
{
, j7 c; K9 I* H. S' B* ~i--;" p' C: [1 S. F1 t. Z/ Z0 U
if(i<0)
3 Q, y4 q4 n5 T' Y' h{i=9;: ]; P4 w4 I. N6 ]5 a9 `9 l4 }
j--;}
- U& h5 j, {0 F' Rif(j<0)                     
8 H% N: V" g) p) I# [& `1 {+ j' g! X{j=9;
4 F4 }! ~( j. R9 O7 I7 Y) Ck--;}2 n7 ]+ K% m! X; ]
TH0=0xB1;
9 a, X0 w8 r6 ]; m) ^/ LTL0=0xE0;  D/ i5 Z. ]5 c$ Q
}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!% |9 k! J8 i( X5 z& T* f! h+ M
5 {/ L. u3 w- B4 I: `' |" O, w
你的延时子程序中的延时太长了,所以闪烁。& D  H2 T( C; P6 }5 R$ v
.
! ]# A+ S& N- J% Osyw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!. M& m: P$ Q- U- `& u' R
.
) {8 H8 h) i4 d; ^8 T" p! P5 j你用一下我给的延时看看还闪烁不?!
4 [/ O5 B+ M1 U6 O.
( G4 J) {( z( ?6 hsyw  091205---05.11/ e: z4 L; y! @* H$ D
9 k. n4 @5 ~. `9 I' v: e
' m$ z* E2 K- E/ k' W
. J+ u) U8 A/ J7 i- D

9 f! Q# i" Y" h        P0=xsjs[xsjs1];
8 S+ r" v+ L2 Q) [         P1=xsws[8];
. g1 j! H, l6 E5 e        delay(10);, }1 u7 v8 j  ~2 {. S
//****************************7 o0 c; f0 c3 t6 V
    void delay(int x)
& i4 P6 s7 {' ^0 B    {
$ i3 c5 Y7 ^. E0 G) M  f      int  y, z;/ {2 z+ d6 B7 b/ i
        for(y=0;y<x;y++)* Z# z0 y3 g5 Q4 y
        for(z=0;z<2;z++);3 T  ^; E/ _3 _  W9 Y# O2 T
     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。) k) R4 o0 Z! j8 H
#include <AT89X51.H>
6 d, h3 F2 H& T7 bunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
. o8 V( ]) k& H& V( u& Bint i=0,j=0,k=1,a=0,js;# }9 _& f4 L. W+ F1 T* g2 m% ~4 p
sbit beep=P2^1;
; N( T, B  n' a' ~+ y4 P' Jsbit P35=P3^5;8 n/ x/ Q" `0 X/ @
sbit P36=P3^6;0 l* O6 u0 [! G. j
sbit P37=P3^7;( @2 _% P5 Z+ @. v! ^6 `! W
void delay(int aa)
5 y9 @5 J2 D/ p{int y,z;/ Q7 v# M# K' W% e
for(y=0;y<aa;y++)+ p: f( Q5 f# x( g
for(z=0;z<60;z++);
# Y& e# Z5 k, _5 ]8 L6 D}
: d- A* K2 g( Y5 [7 x; y* p! m) Y3 [, j
void main(void)
9 f9 H2 E+ [1 _* f; v9 W{' d+ v* [; x* v& \
EA=1;
7 c: ]1 J$ [9 j2 k+ [" A1 rET0=1;# O6 A" ]+ R* w, U2 z! S
TMOD=0x01;; L7 s! P- C: r
TH0=0xff;. D8 _9 b* f) b9 C) {+ M0 B+ D
TL0=0xff;: L% V6 m9 i0 i/ f2 J- D, \; ^
TR0=1;
: \! ^- z. n, J+ W2 q6 i! Qwhile(1)8 K( S8 Y$ @9 y. g
{
6 J4 ?8 n) Y) y6 M4 Wfor(i=100;i>=0;i--)
1 S' g, b- k* X{: K2 ~/ D) ?2 [  k4 R' Z+ {; p
js=i;
% G3 i% Q! w' G3 ]- z delay(500); }
* ?0 B+ g) o. _/ `$ j7 G }         }. W& S7 `% \3 v2 e  e# d
3 W3 f  b: R5 b% C5 N6 q' [  M
4 x/ A$ Z% N* E) J9 i
void timer0() interrupt 1# w) d( C7 D5 f9 {& W% q7 A$ b
{7 e, ]- N3 G0 S
  P0=led[js/100];
3 ^+ Y, p# a: _$ c& gP35=0;/ w4 B% t% S2 i! m* e* K+ {
  delay(5);( B5 h: C9 d- e) e, Y
          P35=1;
( F! i' Q) }- G: K0 h% F  P0=led[(js-(js/100)*100)/10];' a3 K& _+ M% D9 F+ H' `2 ?  J1 F
P36=0;
' x+ r* ]; G5 y  delay(5);
  |+ P2 \+ c1 y8 C8 X: u P36=1;
  e* C& t6 V  D! P6 j0 E P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];, j! E4 l5 ~3 m5 I6 v5 y/ G
P37=0;
$ |, f2 K1 w3 n7 e delay(5);
+ r# |0 w: U; o% _" Q0 f7 I  P37=1;" V- \' @* {2 u0 E5 r8 A% P& ]3 e
9 i2 f  G8 I6 r" ?6 J
TH0=0xB1;
2 K1 x& x$ H+ g4 W. a2 QTL0=0xE0;
( _8 v. V; G  g1 y/ L
" `$ S* ]; u  k6 R}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-10-22 02:57 , Processed in 0.077668 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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