机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3324|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。# z7 `9 T: y) T6 t6 K9 Q
程序如下:
2 }3 e( F! y4 Y9 ?#include <AT89X51.H>( F; X0 W/ Z! v2 m* n
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
. y+ J7 O- ^5 C7 Pint i=0,j=0,k=1,a=0;
/ h7 [. d2 e- O) M# V! y8 H' ?sbit beep=P2^1;5 M- @# h4 ]) ~# S
sbit P35=P3^5;) D7 n* b+ I% ]1 Z; M
sbit P36=P3^6;' A+ r& N/ S* D. k
sbit P37=P3^7;. C) }# F7 E3 ]9 C+ s6 Q" p
void delay(unsigned int aa)8 ~/ G# C# V) y6 S5 w
{unsigned int jj;
2 O1 r% z) t* ofor(;aa>0;aa--)
1 }8 Q; M( {5 t3 t8 a8 [6 Q8 Tfor(jj=0;jj<60;jj++)( u& @* S+ q( G& \
{;}}; e/ E9 ]' s$ i! E
void main(void). Q( t$ _/ p$ j9 S  }2 H# c
{" s8 N. p& t6 w- l$ P
EA=1;
6 r! P- `4 U5 Z7 cET0=1;
) I; l. T% b2 \: E- ZTMOD=0x01;/ q5 f: ^2 P8 [% x. F; k8 v. _
TH0=0xff;) [+ ]- h: l; O  Q4 `* @
TL0=0xff;
; q/ b0 K% {3 i; U5 t4 VTR0=1;
. [4 i) _9 U6 O- v" `& @while(1)9 }: V9 s0 c" l; j$ k
{
) G5 F) d% _$ Z: l' b& o' R }  }
$ b% H$ C2 H0 R6 y
7 Z. @# ?5 W+ r/ u; w9 I$ uvoid timer0() interrupt 1' x7 x' T( @( X- E7 e8 I3 `
{if(i<1&&j<1&&k<1)
6 D/ t* T  L7 W  O) u{P37=0;0 t# |3 S+ a  h! p. {
P0=led[0];
& a7 x- ?* q- {; x  Ebeep=0;                                 
. d+ F- M: `! c: P}
2 p# A" B6 s6 U* l1 K) Telse  
+ ]" B4 j8 ]* J& n& B/ ~% K{7 D2 p6 H8 Q. s* R6 ^
P37=0;& O1 P  ~+ t$ k7 U
P0=led;
$ O: L- @8 Y. i" @, Z0 [! k! gdelay(5); , e2 [2 i( M) f3 Q! B- L  _5 H
P37=1;
( E+ w- _2 j# A0 ~* u}
: X. z( e7 [3 wif(j<1&&k<1)
2 e: U% X  O( Z! s1 c; H; Q! ~/ I& h6 i" oP36=1;% z3 ?* l7 Y5 D; i, w8 B4 N! ?
else0 d, e: o; l* x
{
; t2 X  I! s" D# A' S  NP36=0;: L1 B% F% ]" c- V" O, x
P0=led[j];
) @% }5 a; t% F4 ?& q5 X4 p1 @delay(5);
. W. F3 U3 w7 ?2 q, T/ WP36=1;
; {4 j. C  I. k, |8 u}
* T1 ^4 R# l' ~- R% ^if(k<1)
1 P0 M9 x; K1 Y( S& P# N% ^P35=1;/ _1 J9 n1 X2 r7 o- O
else* |6 X& m: _% s( k9 l
{P35=0;. y% i9 O- l& k3 Z9 Q" i4 H" I" B$ D
P0=led[k];
5 g" P1 B9 Z& ?" I1 J, tdelay(5);  
9 M% H7 B6 l& L  l7 a2 T! eP35=1;  K7 ^9 h- k6 J/ p6 r
}a++;0 E0 s; r  W( Y$ p% a1 a' E
if(a%20==0)
1 q' x/ B" l+ ?9 c. s& G  D, R{
7 ?0 y/ ~- E! b* ~  B, _3 G' E1 vi--;
) q( ~+ x- w: m! v! m, j; _if(i<0)6 g9 P* Z1 ]  p
{i=9;" u0 ]% x6 ?# i1 F! |% I
j--;}3 \, G# h( Z, K* J) r5 [! k6 E' |+ U
if(j<0)                     * w- u0 [, P$ c. t! i& ^& `3 a; m
{j=9;5 \- R! c1 e4 W5 z! j; ]( c4 v' a
k--;}
8 E5 c4 M, w4 I/ z: @- NTH0=0xB1;
; t$ V% `9 g2 O7 B4 n/ }0 K& [/ ~* aTL0=0xE0;
5 E& h+ t% G7 l' {# P) D% J+ ^}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!
5 s: W& x7 ?3 s+ d6 R0 j5 a" j" ]$ b' K6 x4 L6 q
你的延时子程序中的延时太长了,所以闪烁。3 c; F- z8 N5 }* G" e8 b
.
* V0 |7 H% c% xsyw  091204---08.22
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
回复 支持 反对

使用道具 举报

发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
- b, V& b. x+ b2 T3 H/ M; J.4 }2 E: v: ?' ?1 g
你用一下我给的延时看看还闪烁不?!
6 h( j$ E4 [1 Q; h4 ?.# D% v8 S+ |+ Z/ g0 k
syw  091205---05.11" G& K. h' G! c
+ @& n) F& c) Y# `3 O

1 s( C7 n1 |: Q* G6 y' _* X" n8 P# K6 {6 V3 q9 n

) S8 U( F% r: |# ^7 H, {        P0=xsjs[xsjs1];
. \8 ?0 s8 P) l( e         P1=xsws[8];7 a7 G8 |) q! g+ r3 F/ \7 O
        delay(10);
' v! a# S( P5 X' l- _7 d//****************************
8 j  v1 j# Y3 O& I+ Z    void delay(int x). l- V# P4 l: ?! W
    {+ O  n  X# t) d/ Y$ P0 D2 @8 u
      int  y, z;
7 G2 I: M$ z# v; d% c2 ?' I        for(y=0;y<x;y++)2 ~1 i6 X0 m: ?7 j% T! w3 x$ o
        for(z=0;z<2;z++);
; m. G4 v, J! k1 q. v# w     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。% A" R7 g+ Q% u) m, [
#include <AT89X51.H>$ I+ c- n9 g8 o5 E
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};8 V2 L2 }- e! N8 N; c% V! y5 a9 ~
int i=0,j=0,k=1,a=0,js;
+ E7 Y! L6 U9 z9 ~2 d% tsbit beep=P2^1;
6 ^" ], l: U" |( y6 p; U1 N6 |sbit P35=P3^5;% K2 G: ]' g' u( q/ E2 q/ ^
sbit P36=P3^6;
) d$ g- c6 r, _1 Z$ w+ b3 Y# f; P+ Nsbit P37=P3^7;4 \) ]( I. C- K4 c5 ^1 U
void delay(int aa)
5 Y# z" R/ \+ A$ z{int y,z;3 E5 p, t( N' P. z. c2 G/ m
for(y=0;y<aa;y++)
) K6 M; p$ @  u; |& Rfor(z=0;z<60;z++);5 `! b% o/ V9 Y
}# C/ p4 H. s5 p0 N( h/ D
9 X$ W0 W6 j+ @. V
void main(void)5 f" M; b* H8 s, Q
{
( V( }2 e. e& w' `4 REA=1;4 d/ \& Q, X) A$ ^& ]! Z
ET0=1;
3 d; \2 d- K5 V) s2 I& }( X4 }TMOD=0x01;
8 y6 i6 y5 M6 M. n/ u0 K: aTH0=0xff;
+ x- t4 a2 ?, }5 R1 }$ \6 UTL0=0xff;7 t. i* j5 C9 J* q" G
TR0=1;
$ d) y" J2 s& r2 ?while(1)
! Z- X$ _$ M- z4 W{* X% ]6 f) ^9 D
for(i=100;i>=0;i--)- ?! ~( s" G- N# e- T  Z
{: k; \/ k$ T% M
js=i;
+ Y7 G; p" J, j# ~4 D delay(500); } 4 ~! s3 v2 A. @$ _& P
}         }
' c2 k+ t- B( V3 c- C
% n  R1 W$ @7 e/ [% {# ~, z; {: U8 N. ?* v3 C4 M+ k9 h/ v
void timer0() interrupt 1
$ U6 e' X5 Q. f! j9 c{
9 C4 r  Z$ G8 l6 D  K/ ~  P0=led[js/100];  E9 z) W0 W: s8 G0 v$ J
P35=0;
' d. B0 m8 b  ?5 a1 y, R  delay(5);
5 @# `; K$ ]3 ^          P35=1;: v6 ~) z2 C& x4 F9 d1 O
  P0=led[(js-(js/100)*100)/10];
) C  D* d8 d- B/ r7 Y6 v1 v, KP36=0;
7 p/ ?) d' F9 @  delay(5);
$ T( j3 Y( Q  F P36=1;$ X1 j' i/ j- \5 \( g
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];7 u/ g' U4 k3 }9 p: E3 t0 b$ x  {  P
P37=0;2 g% A8 o1 Q& y
delay(5);3 K+ R' S0 E# g- G. m3 o% J
  P37=1;
! _9 @0 P% E% N8 n$ |: }) g# y- U# _! ^( j/ L& p0 w
TH0=0xB1;
* v% I3 Q5 f7 g/ X6 ^TL0=0xE0;/ w0 w' X# R! z6 `

& [( h/ _2 ]6 H) I7 `0 Z}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-5-1 10:09 , Processed in 0.051248 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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