找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3376|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
7 p: U$ s! _5 h: t1 D2 i程序如下:! j8 k0 Q' o+ Y3 N) r+ w
#include <AT89X51.H>
; w, M3 ^  ^; ~# X! C( bunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
4 M! n/ f8 @8 O, i9 v1 T2 I4 Kint i=0,j=0,k=1,a=0;) M) Q0 f& `4 [. o* X" h
sbit beep=P2^1;
+ a; ~; _7 F6 ~; S$ @' U' L" ysbit P35=P3^5;
+ E( \3 `4 Q, ?7 t  ksbit P36=P3^6;
8 y4 f# b! \# |& Bsbit P37=P3^7;
5 p* T. C6 g; u0 lvoid delay(unsigned int aa)
: }4 `, j' P  ]3 m{unsigned int jj;/ z0 E8 p8 i0 ]4 e9 y
for(;aa>0;aa--)
* p0 x/ Y& j* s' f7 afor(jj=0;jj<60;jj++)
/ ?' S8 U) s( ~. p{;}}8 R8 H* N5 ^. y/ S
void main(void)" v  P( f  ?  Q! ?' L3 Q
{' t- s+ }6 V! ], T
EA=1;
7 {7 M# _/ `1 F9 N$ QET0=1;
5 T) h* Y0 D3 K& X. S0 D; h# u0 `+ b; ]TMOD=0x01;. t0 S3 i; k5 V! S5 X4 r0 u
TH0=0xff;8 v5 w$ M1 ~, a2 \* U/ v- j
TL0=0xff;+ t2 i7 o) J4 Q; o6 n) T& o
TR0=1;9 }. ~* y2 O7 n6 }' X
while(1)
6 D" D; i8 E! l' h, k" l{, D. f9 S( f$ `4 ^* ]7 a6 ?: G
}  }
2 y+ t& L5 B& n( f3 W! {
: H' l1 z' X2 xvoid timer0() interrupt 11 [# W: b$ W8 }' e0 U
{if(i<1&&j<1&&k<1)' K' d, @1 f1 r- o& L) \. _
{P37=0;
* {/ a' ]8 ]& o4 GP0=led[0];  H; K, p. u# y+ N9 [# r9 N
beep=0;                                 
7 [6 w0 A, Y# R' q$ x1 u}
  F3 ~$ q# e6 a% s5 G1 ^else  4 q- X! H" k# {; K7 L. z
{1 w4 _1 Q' D+ D7 p
P37=0;2 [& a$ ^6 Q- Q  j, O7 @
P0=led;9 `4 ~' }+ }7 k+ x& e$ r
delay(5);
( o6 n4 [  A& S5 x1 ]) p, P* AP37=1;
# ?! r) y3 O4 k+ g2 g} ; m/ G# k. S  `; w
if(j<1&&k<1)$ l, B7 _1 W9 n7 V' t$ }7 k: X# I
P36=1;
: G7 ?  K/ Z2 X8 ]else  f; Q# W& S1 C. ?/ d
{$ ]! j+ r- ^/ O8 [( |
P36=0;4 G' h5 U5 Y% j1 ^: P" I
P0=led[j];
& ~; m6 |; z- a# K  qdelay(5); 7 y; y1 s' T0 e3 v# V
P36=1;
# j5 a& ], ^, m1 L}
) U1 v/ |- M. y2 X: Yif(k<1)
/ F6 {# U- @9 {3 O1 u0 f* ~P35=1;
- }3 f/ Z+ ?2 V6 p' h1 e9 lelse$ i+ A5 h9 X9 [8 b# r0 Z- q) \
{P35=0;* _. G2 k7 P; C7 c# n8 C  f
P0=led[k];4 @4 ]* b6 m8 G# f' c% \9 A
delay(5);  % W9 N* d1 i! u7 V2 e5 e1 y
P35=1;
7 a$ b5 \9 f4 g}a++;! i1 R6 p+ k7 d0 k5 W
if(a%20==0)
& \8 O1 Z& u- c/ O) i{
6 j/ B) t3 H8 o4 l: \+ Ti--;/ q# s' B7 v6 g, ?8 R0 T- a
if(i<0)6 d; z* b& Q) t1 o  o" u8 A9 s& L
{i=9;  i5 x0 T! t9 v. e
j--;}
8 N3 O& ~2 @& L7 `8 x$ pif(j<0)                     * I3 y* o  u8 `' O
{j=9;
: [5 d- X" Y4 S* Z1 [. ~- Tk--;}% ]8 y1 W( \4 i0 }) j+ Q
TH0=0xB1;. b! D. Z7 O2 k
TL0=0xE0;
5 f; {3 \6 I! |% H8 `; f% W}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!0 N- a7 H6 a, u2 {$ d0 ?/ b" J

& R) `" \* {: V+ B5 |- Y你的延时子程序中的延时太长了,所以闪烁。
" ]3 S  Z, x$ \6 \.
! G& M4 M3 ^  c/ ?syw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
0 D. \; F! A# n1 J, A.
3 J4 p$ P3 s/ F$ C% Y你用一下我给的延时看看还闪烁不?!' r9 L0 _, V: G# x) N
.; q/ B1 z1 D5 t$ f6 h' u5 `# v8 M( _
syw  091205---05.11) ]* E5 _& d4 W0 f; V; }7 X( o( S
1 u4 @3 |+ T1 Y6 p6 K0 _# V

6 w& S$ D+ d2 ~8 I! F7 ^) R8 I% Z5 k9 e; p8 G9 c4 g

1 R1 _. n6 p* X( P        P0=xsjs[xsjs1];/ m* k  v% h4 B/ o. t- s) Z
         P1=xsws[8];
+ i& A9 [, \9 O' I, `; ]        delay(10);( F3 n& V0 `% K" c  `) _6 U$ v
//****************************
" c( A: Z# z  f$ u7 f/ A    void delay(int x)/ m' |6 C8 A' o- R- C
    {3 J  `; h; A) i3 F/ u0 v4 s, y
      int  y, z;
% Q3 {- Q: a1 m$ Y: n$ u% Q/ {        for(y=0;y<x;y++)
. ~1 L7 Q3 G# z2 A        for(z=0;z<2;z++);
2 ~) @9 m- N. S! v% h- y     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。7 Z9 A* `0 w- q& L- B$ x% o
#include <AT89X51.H>! \2 b- ]0 e' ^5 w2 S! i5 F
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};$ x1 J* B7 Z, N/ i: b
int i=0,j=0,k=1,a=0,js;
5 H3 ^; p9 p2 d5 p+ _: x6 |. T8 csbit beep=P2^1;; s# y. [8 n; L& v. c+ t: e% }
sbit P35=P3^5;
; Y+ y* {) N( g0 a4 s& t5 b4 P; [sbit P36=P3^6;: p- W/ \0 k7 L0 R! D. K7 {
sbit P37=P3^7;
6 S7 Q3 h. q: T% xvoid delay(int aa)+ T" N1 R* u2 w) n7 i& T" V4 k
{int y,z;0 Z6 e! u: U9 {! C% S
for(y=0;y<aa;y++)9 M+ o, H8 B, u8 f$ R. i6 n
for(z=0;z<60;z++);
" T5 @& o5 b: \# C* E1 y0 W}
9 k- {5 L, \" ^/ i' t
. x% @. j4 P0 ^7 V! \void main(void)
& u2 R- I* V0 I* d{
3 P- a5 A; C: V, REA=1;# J6 A/ c7 e4 X+ B0 F+ x- \
ET0=1;
( F3 {% a" m9 I1 U5 D$ _TMOD=0x01;
: Z8 O) v7 t; H: n0 |! M0 aTH0=0xff;" V0 o8 G. X% e% b9 p8 X
TL0=0xff;
- j0 t9 j$ n: i  F( uTR0=1;
* M% t9 s$ A2 T, f% d  zwhile(1)
5 h, V& q0 s9 a& c" ^2 l{2 }/ d: b6 J9 H9 @$ q+ J$ A
for(i=100;i>=0;i--)# E; \; C! x4 E8 |; k2 F
{
1 _8 s& p% {  i, |3 H# }: njs=i;
# k) u" R7 X: k+ u- ]8 V delay(500); } " T& T0 H+ |, ?4 g
}         }8 |  ^; q: s$ l; D
$ |9 m4 u6 ~$ ^# B9 i% z

* r" E2 h& k, s/ \: m2 P) V' Jvoid timer0() interrupt 18 ]/ \& g# A4 r! T' F% ^' _
{# g: d7 K& M! j3 T0 [. I+ e
  P0=led[js/100];
- J& j/ l) J7 |3 i5 b+ C) M2 J& B: kP35=0;
7 S# [( _0 _( j9 M  T) }( a& C8 q  delay(5);' n# h% k2 \! T6 F2 W! m! H
          P35=1;3 N! e" ]0 S3 r2 `$ P* R' p7 H$ A  i
  P0=led[(js-(js/100)*100)/10];
& k* l! Q2 z# g% oP36=0;  C7 D7 {# H' k( A2 j
  delay(5);' {7 G8 ^5 Q# F
P36=1;3 |& @" O1 u% v1 e0 M3 I. \
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
% _) o1 \, S6 WP37=0;
2 W; g& k1 _& R" h8 q delay(5);# Y4 ]1 @6 B5 G
  P37=1;( @. U- A. z2 J: \! n) w# f' K
8 n8 \% k& {) H7 d4 y
TH0=0xB1;
" A/ d0 }2 `3 t! mTL0=0xE0;
+ E: {: L) ]# q9 J
$ }- {7 e6 [: X# x}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-6-19 01:03 , Processed in 0.068845 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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