找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3470|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
" {; o# m3 D9 P8 P4 K0 D程序如下:! X& f( l& e& T  A& t' Q
#include <AT89X51.H>' u3 \. i0 [( O) z( i. e4 u' g
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
" H! l9 m% |  N, xint i=0,j=0,k=1,a=0;; T# D/ O+ K, A- V6 l
sbit beep=P2^1;
- w  V+ h1 A2 W, ksbit P35=P3^5;
" {+ j* i! U  ~7 Isbit P36=P3^6;
" D1 R0 f& E; C0 S! q( [1 A$ Fsbit P37=P3^7;
5 I4 @" S+ F3 m8 H1 yvoid delay(unsigned int aa)) z0 @( M; k* S7 M& {$ v, \0 N: B
{unsigned int jj;, x, l6 }2 V4 z/ S
for(;aa>0;aa--)2 Q' A0 n+ D5 V1 O' l, P4 o
for(jj=0;jj<60;jj++)2 ~0 G" }2 u! p% X" I9 ]
{;}}
% n/ V' a# b3 P. Mvoid main(void)
" A* X6 u8 W- t( d6 p- M  Z+ _{
5 w8 h1 g8 M+ b) c9 `1 I. jEA=1;
1 K( S7 z4 V1 K, AET0=1;0 Q# q; N# g3 Z4 M9 d
TMOD=0x01;! u1 d, W  u4 D& Y8 a2 }2 B% s
TH0=0xff;% r* j; G; v  v1 u1 v  t
TL0=0xff;
. p# A* n) J$ _* }: XTR0=1;# {, q3 K) O! O7 v& V
while(1)
* A9 e' a4 W" W; G" o2 ~{5 r. Q, L0 T. P( I( O1 N
}  }% `3 ~* ^7 {! o9 I

) v# _; t3 ~' P$ Lvoid timer0() interrupt 1
7 k% p- n" m3 a. v{if(i<1&&j<1&&k<1)
' _+ i4 t3 [* G0 f, f{P37=0;+ A- s5 ]( K0 c3 i; p. ^$ }
P0=led[0];
. k5 F9 N: e8 L1 bbeep=0;                                 
3 w+ B. V" `4 x& a+ R. `}$ ?, d' i8 i5 h9 C
else  ; T+ W; p2 b: d8 Q& s) T  ~
{7 N! R* Q1 B8 M4 ]  ]) }/ n- X
P37=0;# W) W. h. }$ v3 W- s8 m( s/ Y- B, g
P0=led;' d" `( W6 P6 X; r& b
delay(5);
' l4 M8 F( v; J" V2 o. D& |P37=1;( A) j+ P- T5 n) a, s- r5 _+ y) S* X
} % r: K+ f; A  Q2 n! ]
if(j<1&&k<1)
0 s7 F4 q. f& S. nP36=1;; J0 B# d# D; @2 z
else6 x; `, B+ `+ \" W. C8 m! [6 ^
{
% _2 g  w/ o3 l; Z0 y1 }P36=0;
8 \  y& L+ d( ?/ ^/ R& D% V( l  [P0=led[j];1 k+ g+ z- o2 q; u
delay(5); ; z1 B& N. m  H7 R& N
P36=1; 3 M" x- n2 a/ c$ L* [2 G  @
}" U0 ?' s* T$ Z4 L$ A' n/ M9 v
if(k<1)
+ h9 u8 d/ x3 G; Y8 T5 ]P35=1;
( }) x# \4 Y* Z0 delse) X& @9 [5 x# c! G
{P35=0;
. W) f. q: p7 S/ g% K6 L1 @* LP0=led[k];
& N% f  y! V7 _, Q/ `7 b  _delay(5);  5 I$ M( |+ A5 f( j% U4 l3 C
P35=1;6 g, j# g% n4 X1 N( j+ Y
}a++;
" ?( b' ~" r$ D5 E# z- v3 w7 J( Y' Wif(a%20==0)& i$ Q) _" y! a/ {2 S) ?
{ " m$ N' A# t6 m7 d$ Q
i--;
) B7 \$ R" Q/ _' |8 O- eif(i<0)/ V  }* e: F/ b+ o' }- T
{i=9;& t' X6 Y, }$ R/ {9 n; h! w
j--;}
1 W! m& y1 l6 {/ u0 A  H! P/ oif(j<0)                     ; h- O* h: Z+ G7 V
{j=9;
6 Q, }& V7 i6 A$ ]9 tk--;}
/ k5 D/ D* d( c; m0 |: U) JTH0=0xB1;& g, C& N. q; `1 C
TL0=0xE0;
  U  p9 E/ H4 `8 c% f- Z}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!. s% p/ {  S0 T
5 K& i+ |6 h/ T
你的延时子程序中的延时太长了,所以闪烁。
" T8 X# \+ s) T& l.2 N. K3 Z% w9 ^- {
syw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!2 s( Q) z9 I8 S( b3 y
.
1 X: I1 D  V/ Q/ Y你用一下我给的延时看看还闪烁不?!; m0 }) i0 U) c# E& d
.3 \* V, K4 a, Q. X
syw  091205---05.11
! R: g# t( I( `/ t( L7 G' P/ i
5 ?' Y% }( ^0 r: l
9 X! L' j* R6 H% t" ]- F$ t  T7 c: C! y' ~1 R! Y
" z' X3 ^5 `7 D; _9 F; Z* g
        P0=xsjs[xsjs1];
" s5 y# p: _5 R. @/ }. E7 i9 g         P1=xsws[8];
3 ~" O9 l5 T  V$ b, r        delay(10);
5 F! e1 i$ u2 r5 m  H& X5 B1 S//****************************
8 D9 S2 {- i% y+ v" N- C    void delay(int x)) S. M/ |5 B/ C2 o
    {2 U, w8 x# ?% w
      int  y, z;0 `0 r$ I. w/ i1 Q! R- r/ I
        for(y=0;y<x;y++)6 X) v3 j. ]! a. f- g& C
        for(z=0;z<2;z++);0 j9 `; o1 |8 x# b$ v
     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
+ _! q& i$ S( j) N+ D( M% P#include <AT89X51.H>
! k, z3 O+ c- z2 M" ~$ `, z) P4 \2 ounsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
0 z; ~! e' T" y" `8 m! ?  E% \int i=0,j=0,k=1,a=0,js;1 i0 K$ i' E8 R
sbit beep=P2^1;
% J+ @* V  K, I# ysbit P35=P3^5;2 l0 w4 ]* H; O- _3 j
sbit P36=P3^6;: q6 o& E' `. A4 ?
sbit P37=P3^7;# T3 V) h: t' i+ T, P. m/ C* j
void delay(int aa)
; e1 U8 D  x" {' E6 u1 R7 e{int y,z;
1 V) P) ^6 J1 _" tfor(y=0;y<aa;y++)$ H0 U/ ~2 K  \  h
for(z=0;z<60;z++);
8 L/ s2 T' n. y: c}, Y  c7 E7 _* a/ f' p+ f
# N4 U5 c$ @% |1 {. F3 V
void main(void)! @" W7 T7 r5 g# M7 W
{, y5 ^9 I) O; o9 \- J3 O
EA=1;
; Y- S* a4 G: a6 ZET0=1;
1 ~0 A4 s0 f9 p3 D( r$ MTMOD=0x01;: i& a  e; X% {, Y8 d% M
TH0=0xff;7 Q; w# x& P* N+ N' A6 h' L) z5 G
TL0=0xff;  k) d0 Z1 P) ?# _) O0 Y1 q
TR0=1;* F- ]1 P. V8 E9 F
while(1)
2 y& ~/ g0 v# Q3 W{6 @; r, ^3 p9 ?
for(i=100;i>=0;i--)9 a1 z' i' E9 J' Q5 |- B
{
* f* Q1 k8 P. r* {3 r) Njs=i;
4 f+ l. Q+ t- C+ W" g delay(500); } ( R. H2 @) R/ j  s2 K1 x( j
}         }
) O: C; }$ p& ^1 X1 O( A  G$ Z$ C, e! X% e  ?) G6 v& i  e: g

5 A$ x/ Z1 ]1 m+ H( E5 xvoid timer0() interrupt 1- B& j7 ^3 V& u( U
{" G7 v% [  @4 S
  P0=led[js/100];3 t$ X, Z, [* s
P35=0;
. q' y2 ]: U: q6 J2 o  delay(5);5 S4 h9 j4 r3 l2 x
          P35=1;
, D7 W: J& E8 U: [7 K  P0=led[(js-(js/100)*100)/10];
. N" W# f1 a4 wP36=0;6 a& T9 E& ?  k  f3 t  i
  delay(5);
" E) @, |, t; q( r3 [ P36=1;* G+ Q! v( ?# O9 i
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
5 [5 F" @* V  [P37=0;: X8 H6 D0 v$ h# f0 M
delay(5);
8 C  X/ y3 U( C6 `& Y/ g  P37=1;
- W9 l7 b, j2 z4 k
7 k/ |' e$ a- g& x1 B: O, U5 rTH0=0xB1;6 [- j1 ]1 o1 q
TL0=0xE0;* Y" z% W2 m0 R/ q+ f$ p8 i# l
, G0 \1 n: l. ^# e9 C- _; m
}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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