找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3472|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
- ]$ E8 h! @1 N( R: E程序如下:- {! L, Z. q' O* e/ u, f* e) r
#include <AT89X51.H># o& j( C/ Z8 D- \& r- ]2 O
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};, {0 `! f& i" n
int i=0,j=0,k=1,a=0;
+ @" R* W% @* q2 D. ]# `sbit beep=P2^1;
) f& m5 F" w% j( D7 J. J  |sbit P35=P3^5;, L1 f" r; r* o; P- r+ ?5 b0 `, z; L
sbit P36=P3^6;6 p' i0 n; g+ \9 d  D
sbit P37=P3^7;
1 k7 Y2 S; q2 {2 C% ~void delay(unsigned int aa)4 x. L$ J  R1 l$ u+ N- n0 G
{unsigned int jj;
3 F; u! @3 Q- }; O5 U. `2 Ofor(;aa>0;aa--); T1 R% \$ b" j& ~: R) i
for(jj=0;jj<60;jj++)
/ b- x5 m2 u3 i4 y# t{;}}3 b; y8 s' J' f- r$ a0 b
void main(void)
( g& c: t/ |7 X. Q+ q: A: V8 x" |{  M7 e- G( ?- }
EA=1;
4 e9 R% B' x  s& c/ ?ET0=1;
" Q, W6 C$ T  S% vTMOD=0x01;- z* n7 o8 v& R
TH0=0xff;
4 O0 O, ~1 Z4 c, \+ DTL0=0xff;
0 t# f6 U8 Q% j; J8 P3 k$ N  ?0 @# e3 XTR0=1;
+ o+ _* P5 x# n# gwhile(1)8 l4 W4 x2 Q% d& V; S; s- M5 S
{
& j* f: D' d% ~' l* o% L }  }
9 b! _# v+ o: |  h+ d+ R% d2 E5 V
# w$ g, Y2 {. @+ Ivoid timer0() interrupt 1
: ]' C: a- ?. V4 u{if(i<1&&j<1&&k<1)* R) Z0 M/ S6 \# u: E/ H
{P37=0;
3 H7 p/ \) x# j$ Y9 y6 @P0=led[0];3 A2 p+ W: i0 G" z; h/ k) i/ A  G
beep=0;                                 
* G4 f8 _: U* ?. \}
  e' }3 z4 l' Y) ~: Lelse    X. X; y% y! K4 L, w; P
{1 u; q# F# |6 p: [% }
P37=0;7 i( K1 o" M% n9 A% @
P0=led;+ O% ~" J: e" U* ^5 a9 {
delay(5); 5 g, J9 ]3 Q0 D4 c; o" V
P37=1;- x6 b, a- F% G
} 1 e! Z' G0 P5 ^7 j9 `& N
if(j<1&&k<1)1 P$ ^$ |- K: F8 q* \
P36=1;
6 N/ G9 h& r0 j2 p) zelse
+ T  w8 d0 t1 F+ B: E3 B{; z! z& R0 K. f  j  H2 v
P36=0;9 t" a! C- `- H3 d+ X
P0=led[j];7 }& L1 d% a1 x: a2 f' b6 z
delay(5);
6 V+ s. C, W3 C0 tP36=1;
) V- G% s+ w( C2 b9 z) n}
. J. g  A5 i4 f: Aif(k<1)
$ @& S/ P0 j, y' C) tP35=1;
1 @7 `* V7 u+ \9 u  }else
+ v/ k% M) g$ B{P35=0;
, V2 F! k% X, m: BP0=led[k];, j, v" b4 U. Q/ I8 V1 {, S5 ?5 c6 m
delay(5);  ' B+ n$ n/ k3 F" b
P35=1;
& u" \; l& G0 I5 B+ ]3 e% w: L& X}a++;
3 u( ]  ]" y8 g: L, kif(a%20==0)+ B2 q# j# @; S* V. z* y8 }& S( @
{ 7 k/ U" i6 \, h
i--;  I0 K% `+ V7 y
if(i<0)7 r: z2 r9 G- v6 \4 H3 u
{i=9;  C4 @  P3 A8 Q8 P9 ?- a! K: _3 }
j--;}
7 L& ?6 k+ F9 o' |# Zif(j<0)                     & _8 L' d4 t8 I( E. Q: u; a
{j=9;/ h! v* b/ L! n: l/ b
k--;}
7 C7 D8 s& h$ |# I7 x$ M7 O( kTH0=0xB1;
$ H% W- T# j# x4 g) HTL0=0xE0;
( D, g8 a" P' m/ o3 F( R& I# ~  P}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!4 J* X* @$ u; o* E4 Z5 F+ b
3 ?, v& n) l+ A/ }: Y
你的延时子程序中的延时太长了,所以闪烁。
) r8 A, u; d4 L* W.
8 d1 l. `5 N+ R/ Fsyw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!0 H( {0 V, D$ t0 R# W) W& ~, k/ @
.7 Q% e* Y7 a% g) p$ g: A
你用一下我给的延时看看还闪烁不?!" u  O; E6 n. x+ N& L& u1 f( U; W
.+ h' T: v* [0 l! q- x! I! R" r
syw  091205---05.11
1 D4 w  Y4 n2 F: ]* [& k+ Z
1 o' L4 `" H  r( v3 ]8 O/ `, K: Z6 t" J
2 d' p/ G; X' Z; g, x. x

7 d; Q+ `/ c. H/ _# |% H        P0=xsjs[xsjs1];
9 {2 v' U' E! }+ Q         P1=xsws[8];
( Q- M! W1 i0 p  F  |        delay(10);4 f: r' _, A4 @
//****************************$ Y/ d# C% z' t: N; n( p$ t8 k
    void delay(int x): P5 _. [5 ^9 ^( b. Q
    {- o- c# S% p; z- f
      int  y, z;
6 ]8 L1 G4 g' a7 {5 t/ N+ O        for(y=0;y<x;y++)
* `: A; N: [% B; W* q        for(z=0;z<2;z++);
' ?- a2 B  p) Z1 [     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
2 E4 }0 A' ]8 D) b1 {* G. T6 j#include <AT89X51.H>$ ?' I% K  C: [* Z- E1 l
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
5 `* [, m1 X5 Z& a6 c& ~8 xint i=0,j=0,k=1,a=0,js;
& a1 H/ h1 h( J% f+ y) Ysbit beep=P2^1;
3 Z: B6 c$ @6 b2 B8 S& I. h. ~sbit P35=P3^5;
. h  S/ g; [4 |. P* D% lsbit P36=P3^6;2 q3 h3 M* ]( |# P$ h/ p
sbit P37=P3^7;: i, N. {5 R# f2 j! Y
void delay(int aa)
% D9 H1 p- {0 `) u/ r$ l. t{int y,z;/ B6 i) l8 O4 t* n: J9 ^/ m* ]
for(y=0;y<aa;y++)
" w, Y$ Y% o6 n3 _( D- Rfor(z=0;z<60;z++);. t5 _; [7 d9 h& n! L7 y- M
}
- f5 O, e. \- K. I
3 h$ l% ?3 e) V/ d0 rvoid main(void)
5 U! r4 X1 w) g% E{0 b6 P$ s0 ~* u/ ?7 k; H9 ^* S
EA=1;! S1 c# |" R0 S$ [5 f" m
ET0=1;4 }! `, d- e- t- p8 h% y
TMOD=0x01;7 j8 a% S$ {/ C+ E
TH0=0xff;
1 N8 j  U$ y( ~& MTL0=0xff;
6 I6 h. T4 m2 f0 {$ PTR0=1;8 _- H! B, |6 M/ O  w6 T
while(1)
7 J. z  n2 ?  j( ~8 V; }{
' b1 _+ `% Y9 `1 m1 Y& hfor(i=100;i>=0;i--)/ N6 Q+ }4 J. X4 y8 {5 J
{# o4 t$ ?& n* R
js=i;- F( D+ Z, h7 @+ A; n+ Z
delay(500); } 0 q) j8 ~, M! A! T6 P( z- N
}         }7 d7 m- J1 S5 _5 @+ ]; U& a

, {, ~9 l4 X6 C" K  _- a% H. u  B. K" q4 ~
void timer0() interrupt 1
8 Y  l; l% V- Z$ U& Y{  S: G4 u: a( a8 f* l
  P0=led[js/100];
# g- s1 G' H$ V9 \& G, t: zP35=0;" [  ?  }. R$ @$ B& ^
  delay(5);" t$ o* P5 N8 |0 B2 K* w9 H
          P35=1;
& [" F* x- h  i5 V* j) s  P0=led[(js-(js/100)*100)/10];- g7 C5 g. R2 ~
P36=0;
4 k7 Y9 B# D# E  {  delay(5);8 v7 }4 u1 q! r2 Q, b7 \) H1 p
P36=1;. J* [' L- K6 [2 f8 h
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];, p2 ~4 x+ J4 L( m% B( C, E# y) s
P37=0;# x) z# s! d) U7 b1 _2 W
delay(5);
8 Z. B/ n9 _! F6 o, Y  P37=1;
) p, w3 p* s4 {! s- ]0 F6 j1 X$ v) Z1 E
TH0=0xB1;4 |) }/ c5 f$ B6 e) w# `
TL0=0xE0;
* K4 J! e; i1 Z2 w7 ^
4 y3 K7 g/ N8 h$ e# F& O+ f) |}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-9-19 14:31 , Processed in 0.080214 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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