找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3512|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
; L5 g) w5 q5 k7 ^0 L& |7 E: [程序如下:
6 v+ l9 j8 Q3 H+ i#include <AT89X51.H>3 T# d2 D4 x% ]- P7 z3 `
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- m- Z3 H  x4 e/ Vint i=0,j=0,k=1,a=0;! I  z' c8 h/ g7 q- m; y/ u( ?& p
sbit beep=P2^1;# M* [! R7 k7 {1 v5 Z
sbit P35=P3^5;
1 e5 v4 q2 }1 |, v  ysbit P36=P3^6;
! m" G9 V/ c1 }8 ~/ D+ i. Qsbit P37=P3^7;
- F" i: V: A( M# Z1 v; q, B+ wvoid delay(unsigned int aa)
, ^8 q4 z4 C# J{unsigned int jj;4 ~2 W  U/ c% W) m* V3 {
for(;aa>0;aa--)
0 b, T7 M, X! F2 bfor(jj=0;jj<60;jj++)
: @# O' B1 l2 N9 w5 [; S% E{;}}
; ]* m) X- K, C$ ]5 \7 Rvoid main(void)
5 D0 x( }" ~$ S  h/ v- Z' a{
* J2 B3 Q5 x+ m1 [EA=1;2 l7 H6 G) ^. W- K* Z) R& T
ET0=1;
4 C7 q& A$ e5 ~% Y0 l8 `& \TMOD=0x01;# ?3 |4 c* E- Y9 z
TH0=0xff;. S( U* N/ x* u) G+ B
TL0=0xff;
2 W, c( z2 O  x  r: M7 @1 eTR0=1;
% l, A, b3 L' Q7 gwhile(1)
: K  J7 a0 F3 {1 ?9 y; X{  T: }% [8 [" q8 {7 j9 z; |) z
}  }
% ?, T4 Z' H; B' M: c% U
' a2 E# b) J& k+ f* P& E3 H: rvoid timer0() interrupt 1! S* N* v) m! _2 d# H
{if(i<1&&j<1&&k<1)
' P6 q* `8 a9 n8 F" y{P37=0;; Z) `8 ]- L% |4 v
P0=led[0];* o/ _7 m1 ^* X: N+ e; O% v' h
beep=0;                                 8 ~5 L. p. E# L( R
}) Q' A: V- E; W: o8 H! Z
else  
1 u" U& N  _" \5 w4 T) ]2 A{0 p  y6 j6 e1 Z$ E" ~, z4 @
P37=0;$ _+ r6 @& M( B' W9 j
P0=led;
' O  Y9 D0 I0 qdelay(5); " s9 k# p2 Y" |% ]8 x
P37=1;9 Z! S! Q5 I3 A, P2 H8 ~
} , }" X& Q4 ~1 k$ t
if(j<1&&k<1)+ U! d# w3 }. G2 H5 M
P36=1;
' u6 U$ Q& g' i  A  @, y/ k1 Gelse4 R" Z) Q& {9 k$ {4 R+ F
{# f. Q; c. u* e$ d' c3 f6 M- i8 D: I
P36=0;7 Z( c: A2 `5 l" r& X
P0=led[j];
6 g' U$ @! Y) f! X; x; Kdelay(5); 9 G& f% z$ I. D& Z
P36=1; / C5 A( A) B: V! f
}
# G. Q. N) L; gif(k<1)
7 O4 B- @8 Q8 D, r) b6 uP35=1;
. Q! u* s2 i% w" ]& D: velse
- u8 _1 m3 s, ^% a: @$ u{P35=0;
2 C' Z* A6 M% z2 `# UP0=led[k];
4 n9 u" a! k+ d+ t# x( h! {8 {delay(5);  4 u% w' x- R, l
P35=1;
3 }& t  o3 h: |3 d, m7 D}a++;4 S' m0 u  X! x; N
if(a%20==0)
7 Z' q0 _. r4 y' V2 f0 J{ 2 M5 ?9 h( X8 b0 i  Y, P2 ], E3 n
i--;
9 D, U2 i% E+ R. W* Z2 yif(i<0)
- L$ r. A- g/ j7 \8 o* O% k{i=9;
3 x+ m0 q7 n) T, Bj--;}
9 K8 D) h% x& ^if(j<0)                     
- P+ W/ `  ~7 P, m( T{j=9;& B' A3 h  t1 _& @/ N9 w3 H
k--;}
; M3 ]6 J' X5 P' |% W/ OTH0=0xB1;
2 W# Y; Q( q& XTL0=0xE0;
, P2 Y, g3 j7 t8 d% }}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!& x3 o- W: v$ p7 s3 _' q0 F8 |
- J1 f% v/ a6 P9 i1 Q
你的延时子程序中的延时太长了,所以闪烁。
5 |, S" c1 n# Z7 `$ i. @2 |." U0 s$ @% J* B
syw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
4 p- J6 }7 k# P/ {4 ^; `* \" k. Z.% \7 ^: N2 H0 r8 B; D
你用一下我给的延时看看还闪烁不?!
# C  F+ d7 {/ X# I9 p1 r4 S.8 k7 z' Q9 D2 U2 U# h; J
syw  091205---05.11/ z# n3 j, U4 S3 P

. i/ x# B' \; F& _8 [# M5 G8 M
- E/ f& N1 l. h+ V% {- J
( I4 S% O/ c" I0 a: h) h( e0 j
  E; b0 J4 A/ C; Y! b! H1 m- }: R1 N        P0=xsjs[xsjs1];: {# {' `* X8 n1 {* T" q
         P1=xsws[8];# f5 ]6 X6 I& ]; ]% M- m4 j' X
        delay(10);4 X) m/ j, }+ x) A. H, s" u
//****************************
$ @) o8 r' o. u7 U2 k" a% h7 k" S    void delay(int x)
! s, z4 g% r" {7 U) c; k+ k3 o    {
+ h8 u/ m3 c6 [! r      int  y, z;) ]8 J; _9 Z" Y0 n: B, q! d
        for(y=0;y<x;y++)9 f2 [* k! ?5 g; S+ k2 Z- g
        for(z=0;z<2;z++);# Z7 }+ Q/ j$ O' E' r  _
     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
* Y- j/ e* |7 ?0 M#include <AT89X51.H>/ [/ D* y7 H) t$ E' K, d
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};4 ?- Z$ Y+ f# [+ n4 I0 F( R/ y
int i=0,j=0,k=1,a=0,js;/ x; C, v5 ~- Z3 v: Q
sbit beep=P2^1;
1 Z4 j2 D: I1 ?sbit P35=P3^5;
, E$ L% Y5 z% m8 bsbit P36=P3^6;+ r# ~& r6 b  F4 p  T9 c$ E) Y. n
sbit P37=P3^7;
: O. ?# C* j: ]$ j% dvoid delay(int aa). D8 R2 B# e5 R: a; i
{int y,z;- |& M1 X! t# `) f0 f) L* u6 g0 s$ \
for(y=0;y<aa;y++)
% M8 ~0 b8 K, f: X) vfor(z=0;z<60;z++);# ~5 G3 I% B( U, x5 [
}
6 v0 [2 v, K) z; W1 P- N; [5 _6 n
* o; c2 j- Q$ D! a" q; gvoid main(void)
. g+ i: [. D: v6 Y. O; h# p9 v3 C{3 L) y6 t  ?  d8 f( ~. f
EA=1;2 L% w1 E/ X1 A& c
ET0=1;
" s9 V' y% ?4 g% L  iTMOD=0x01;
% o# c# h* |' z$ t7 R5 F' ]TH0=0xff;9 y* A( j4 d% a9 |8 P2 W& ?3 ~
TL0=0xff;  k4 x$ K; u3 }: c3 [
TR0=1;# B# N" Y: D7 j! O( X% D
while(1)
& ~6 a5 ?6 x# D9 D: T{$ |) V0 W' Z8 Y3 b% m% j( ^4 p' |
for(i=100;i>=0;i--)
/ \$ b, o! E; s$ w# }0 W{
. A, l4 j4 e$ P# |7 rjs=i;/ s* O% }7 e- e# Y; C) _5 U) a2 b
delay(500); } ! {7 Z5 `9 n6 U8 K  s* |; O
}         }
9 n& n, D. h7 _( b6 p& c& T# K; J- \$ O
8 z$ k: \* t! s% e
void timer0() interrupt 1# s9 x) Z$ w; u, u4 R
{: R  U5 [( x" H8 Q& D1 ~6 n
  P0=led[js/100];
! O5 [0 X4 h' f! I; MP35=0;
/ @7 B1 ~) d5 b  delay(5);8 f0 I) k  v: K5 ]" n$ w7 G0 N7 q. e
          P35=1;
; g4 L/ k- p# x  g/ S3 R& L  P0=led[(js-(js/100)*100)/10];, m4 ~4 f2 H/ t7 M  q. }# m5 R& Q
P36=0;
2 m" Z  o& ]$ E5 j% s& [  delay(5);( c. V+ L, t" l/ A- O2 @
P36=1;
. T  S( @$ h0 M- B8 Z( R' S P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
3 ], K+ b9 L, d/ D+ E5 I' f1 qP37=0;
; h7 v1 g8 }8 i7 d' L, W! ?# H* { delay(5);0 W9 q. @  a( P8 k7 P2 I" A* f' n
  P37=1;: q0 H5 q- f- ]3 r7 X& J6 u

/ x: \0 G; G: j% uTH0=0xB1;
" h/ P* C4 P- _TL0=0xE0;
/ L" c# ?, q* C- j* O/ E! K. Q
. F' ?" @2 Q3 A' [; \6 L8 t7 r}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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