找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3436|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
2 k1 k7 R; u/ f) O: C程序如下:
; d8 Q/ l2 b) @) L2 P. v#include <AT89X51.H>7 n* k8 y8 j3 y$ l% C$ \
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
0 u$ h6 O/ `: G2 i% M& P' L( v4 m4 nint i=0,j=0,k=1,a=0;: o3 ^# t; x( _8 ^1 ?1 Q
sbit beep=P2^1;6 n- S. `' m! N! e" j7 }% s
sbit P35=P3^5;
* x% t5 f. X6 A+ s2 ^* Wsbit P36=P3^6;
* d! v- `' x. E) O; Rsbit P37=P3^7;
7 e* j9 U2 h7 i# m0 R% L; qvoid delay(unsigned int aa)
1 {$ \" n( L& K- ?* v7 ^{unsigned int jj;) G9 _* }2 d5 s  w
for(;aa>0;aa--)& X: e# S4 h3 i+ R+ o
for(jj=0;jj<60;jj++)0 O  E, W0 u+ l% [7 Z  @6 f
{;}}
) i0 _4 [# x  K$ Gvoid main(void)
& p( T4 y  Q$ I3 D# `{' }9 V6 [' H- _! K) X8 r" F, E: f" m/ U
EA=1;
5 U# @; K5 R# L" _+ pET0=1;% H5 \! T' e/ _8 T+ h; Y
TMOD=0x01;, j7 c1 p7 h7 F
TH0=0xff;2 {: F- s# R' d9 w. j
TL0=0xff;
0 G0 n9 D! Z$ c* C2 b. c( ITR0=1;; B6 [, _6 u9 O- G
while(1)% |& B* S* \  O+ |) V& J% |
{( d' B& R: |% ~% O  b; ]/ v
}  }
. q" _% d% `8 a* _$ v5 Z) x0 n+ B. o$ k% O: u& |5 {
void timer0() interrupt 1
& e$ F" Y/ F8 V! r8 K' Z{if(i<1&&j<1&&k<1)
' n5 M; |  y2 r2 e) m8 o6 V{P37=0;! g3 T7 B+ ^/ x7 N: t" q6 a* Z% k
P0=led[0];
! x2 e0 y. G8 Ubeep=0;                                 6 H8 F& |) a! K9 X% _
}5 `2 S4 Z! D, y4 y+ z
else  
4 }% ~+ j+ ]2 S& d% C7 X1 Z1 N0 r{
+ J6 P  [3 x, ]6 f$ }# t: BP37=0;
- z7 {0 _9 e4 [, k& N$ T, b' U3 ]P0=led;0 W3 B- r! v7 Y1 W( F' A
delay(5); ( k7 G0 K2 W* q" P
P37=1;
, O1 ?3 q! R! K+ J}
) R7 R, E0 _- l; u8 O" dif(j<1&&k<1)7 |6 w' V# D# v0 ^
P36=1;, u% o* y+ N- N; C% `
else
8 H" B( h4 g# i. y{# u0 M1 E3 n8 h, q8 e" x
P36=0;
2 ~9 P1 R3 I9 _  C7 w. RP0=led[j];
$ G2 l3 P! A, mdelay(5); 1 |! ]8 t& I# ~+ g: g- f. i
P36=1;   t& Q: r5 I& @$ j' v3 E( ^- W
}
+ G, S! u2 @) P# c6 k- a4 Y! fif(k<1)& c! w) g) e% U) g( [* j+ C
P35=1;( |& e% f- M) }9 w
else3 _8 ^; y3 s: q8 C9 z
{P35=0;( E  ?+ u/ R( D; {
P0=led[k];3 Q+ B1 G5 e4 i% I# Q
delay(5);  . L$ J$ u7 d2 `- k" O5 b
P35=1;4 j* Q/ g) v: e2 B6 a- @
}a++;
2 K- C; @6 ~) `- v( jif(a%20==0)
+ M/ O& D& y# J, n' o# x9 e9 g{
6 |. I9 B, g. W& Xi--;4 S: }7 ^$ q2 m- q+ ]6 h/ r" b* I
if(i<0)
5 S; x5 D3 F7 b8 W( U{i=9;4 G% N/ X9 F$ g: V0 m' O3 e
j--;}
, j' k3 E4 B. r" E9 ?/ A  |# G6 yif(j<0)                     + i& K" Z4 T$ V" C) F( C/ p- w
{j=9;
' e. R* o- G$ \% b4 Ek--;}
9 C" x# J* L3 u1 j: VTH0=0xB1;3 l' k& Y3 h# p# g! M" \1 c2 t
TL0=0xE0;2 F7 Q( m9 a. g. K, a/ w; ]
}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!
3 x0 u# V+ I$ ~0 z7 V. t4 R; \% z7 _$ a; y
你的延时子程序中的延时太长了,所以闪烁。
5 {! t; C$ q5 ?3 w; M9 s$ D.
  x" \5 D, o1 V* _+ w* G- Wsyw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
1 Z2 x# f# J$ W. U.
) g! u' v6 @  S' [5 y' I; t你用一下我给的延时看看还闪烁不?!: l; C  q: J& {/ N9 `
.( K5 a  ~) F+ p, v4 u
syw  091205---05.11% K2 v+ \) a; P7 }

# C" L$ F% n  t: ?: _% O5 a  ]3 y. W( I' _; I

, K0 u6 [. O& a+ I  l' K1 V9 C+ \' f- C  Z
        P0=xsjs[xsjs1];* P/ l6 W6 Q7 ^  R- k
         P1=xsws[8];; l$ m: q& h; D& @/ ?
        delay(10);  s5 `; M1 [4 F2 _& {0 a* U% d
//****************************
. T+ [- Y) I& F! I    void delay(int x)
, \& G; t+ z( o6 l/ n; g. S& J    {1 z) C. b+ C+ ~2 z
      int  y, z;! y9 T, f: \( m& Y( Y3 W
        for(y=0;y<x;y++)/ k% p& C. I7 n8 |9 R" Y% l
        for(z=0;z<2;z++);
$ R% _' x7 J" {     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。6 \3 b' }9 Q/ \% _
#include <AT89X51.H>
3 W  j3 E, F) K* d2 v+ Q! ?unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/ f8 b$ _- S7 X  a. Cint i=0,j=0,k=1,a=0,js;
, D' W  b! f4 ?: X8 g' Fsbit beep=P2^1;8 e; @0 s* U) ^, @
sbit P35=P3^5;" S9 d% l( B, I! g. B, A
sbit P36=P3^6;
$ t9 e; n- Q& b% Y: [; |4 E& A& wsbit P37=P3^7;! k" j  z1 O$ t8 J- H9 i
void delay(int aa)
  x* {1 r1 [2 T9 T  K{int y,z;
) r4 K9 m7 ?6 ?8 dfor(y=0;y<aa;y++)
4 Z: j/ w+ s$ ]2 p; Rfor(z=0;z<60;z++);. H" r' |; ^: M  }  l
}
3 k9 O5 |  l  ?* Z: H( Y+ t7 d, ~4 w$ q! f. ~
void main(void)
0 ~3 M2 e  t7 y{2 a+ X9 ~& C& e4 v) U6 o( w: a3 q( i
EA=1;- ]5 O$ G% S% x5 r- v
ET0=1;) G- H. B* \8 l3 d1 P( P" ~
TMOD=0x01;3 w+ a6 c/ W: B
TH0=0xff;
( P# U7 u+ J' g8 k7 P3 aTL0=0xff;
* h# X) Y+ M6 m2 A2 C2 [. z; @TR0=1;& L( s; T4 a" }% y+ o
while(1)- h* G2 ?3 z, }! b
{
. h/ ?0 X5 P& r% S, I( S: ]5 l4 Dfor(i=100;i>=0;i--)
) L# E7 ]0 K9 E7 R( Q4 w{5 k! R+ E& j: f7 W5 T4 H( P+ V% z
js=i;/ R8 D' T8 _, b! H! Z# k% q$ a) W
delay(500); }
3 D+ |# Q, c) o9 u3 ?4 Z }         }4 Z( T6 w6 z* i" R7 V. p" w

$ N& e; l) N1 }8 W; x5 n3 Z$ g
% j/ {9 k) a& g+ L) V- rvoid timer0() interrupt 1
+ e4 j7 ~' v5 T% ~{2 N5 Y1 A: Q9 S- G7 ^/ L; L
  P0=led[js/100];% X1 p! }- U* H
P35=0;
8 O7 Q+ t  e1 _# G; T  delay(5);2 z  Y6 e7 g3 G7 f. Z- h( Y
          P35=1;
6 V6 c/ R2 Z9 N3 g5 S7 a4 d  P0=led[(js-(js/100)*100)/10];8 T* [3 t; ^) {# q1 W2 x, J
P36=0;( x8 `# ~& e9 q/ G7 @
  delay(5);
3 ^6 b& o  {2 A: G& c" _: b* i7 K P36=1;
( c) g2 q- m# M P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
. E) ], V' w1 O: W& aP37=0;% W+ O, l3 B: E
delay(5);
' L# W$ l  C1 m8 y) k( M* u  P37=1;, Z2 }/ i7 u7 b! ]8 ^  @

" P5 J: s) q3 aTH0=0xB1;1 M# m7 D: d8 D0 T; I/ c
TL0=0xE0;
+ `; }1 P9 [: Q; O5 C* ]& w* N% @
9 f+ Z: N5 e* W6 \9 P}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-8-15 05:17 , Processed in 0.066234 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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