机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3225|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
7 X7 l" ?4 K) e& Y程序如下:
  `  h8 R4 y* [+ i+ |6 ~#include <AT89X51.H>
; B& V  c: b' C2 t2 d$ u9 @% hunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- H+ t5 ^* s" k" o1 oint i=0,j=0,k=1,a=0;8 m- ?: e0 s# u8 F
sbit beep=P2^1;
6 Z4 t& C7 o1 D7 K* Jsbit P35=P3^5;" O1 h; H1 u4 {9 D! A! d1 j
sbit P36=P3^6;0 M/ I7 L0 b) O2 M* E- |
sbit P37=P3^7;
2 r$ E5 t- Z) @% V) mvoid delay(unsigned int aa)8 T, ~/ ~: u$ d1 E
{unsigned int jj;9 C/ R% a+ H, ~& R) v# l. H8 t
for(;aa>0;aa--)' [) `( N. E* W+ j1 y) |7 G
for(jj=0;jj<60;jj++)& V- C4 a$ H8 \0 d6 d  f9 H* N
{;}}7 c; B# \" Q$ j6 J* T' U0 W# N
void main(void)* t" e+ I: B: C. ~; P* Z- m5 W7 f
{
) m4 f' C" n7 k6 J: w& \EA=1;& W4 G4 W$ V7 S0 \; n
ET0=1;
. l! P7 e3 o5 K  W6 x3 ^7 CTMOD=0x01;( N( l; y* x8 ^1 m
TH0=0xff;/ Q, f3 k) R. p) @) g
TL0=0xff;' a9 T( R. B% s) v
TR0=1;& t8 }# M9 d. w
while(1)+ I! P, C" O/ E. R5 ^4 e/ Q
{: X! g7 c# j7 ^4 o! G: {
}  }
) c8 z1 `9 }$ s5 B4 m6 T8 [! G, l
void timer0() interrupt 1* C) B, R5 _; S5 n
{if(i<1&&j<1&&k<1)7 X: O0 E0 C5 R3 m
{P37=0;
% _) x1 i0 T& m8 |: WP0=led[0];
9 b: n  }* ^5 Nbeep=0;                                 
0 |4 J0 d( [8 j}- m8 X: e' n/ s1 c3 r- G' j
else  * y! b. G& W! J0 V/ H: h) J
{" v7 y' i, T: B4 E3 B) Q& L
P37=0;
( E* R  O+ F2 ?P0=led;
4 g+ M. G2 M9 F% h. M" vdelay(5); 6 |5 ]  o1 q8 o  j
P37=1;3 A! k: \) z& R  B4 f, j- }
} * W, B8 F1 V/ a: L
if(j<1&&k<1)
- n5 ^- M/ ?  P- y5 |% w& \& DP36=1;
& S" z  \; d# G1 b& S) L3 velse+ A  p1 H  i2 u: {
{
6 v( m* b/ f: ]  m  G/ U  ]& DP36=0;& P1 b2 q0 y: H9 u# H% z/ S
P0=led[j];9 h* l# c$ D! E# i
delay(5);
9 \  L* Q" e4 y( I. b  HP36=1;
. R3 q  @6 a. g6 E5 k1 g. i}
) V* q* ]( b, j8 j. \if(k<1)1 Q) H( `+ Q  l" q7 l1 f; M
P35=1;8 b$ s8 o, j, _0 j6 Z4 z
else
1 w3 @  t6 W: P! V/ I) C{P35=0;/ y6 g2 q) m: a% K! L) X4 A" e8 Q/ |8 ~
P0=led[k];
9 J2 X7 c, k! Z) ?# A$ W: s7 Ldelay(5);  
. P* {/ m# B) @; zP35=1;
0 C( S" U% H* p# f. O0 z}a++;
, q3 {5 p; t- R. G1 T2 Wif(a%20==0)
* G: Y7 `$ b( `9 x& T9 P{ + ^5 n" @( v; W3 r
i--;5 J- S& J' m& N$ J) k$ T5 Z: W
if(i<0)
. c2 @+ z; R4 b& _+ A6 P% P{i=9;
2 R  W: D2 R4 N# Qj--;}
8 R# K# o4 ]! O# _1 Eif(j<0)                     
  O  U6 E0 ?3 h6 K* \% y8 }{j=9;1 V9 _  `/ V  H) \- j. l+ v7 _; o
k--;}
1 Z: X. B* Q+ ?+ k( Y: H, OTH0=0xB1;
+ K. D/ Y. v: y0 t% P/ KTL0=0xE0;
) F7 T$ S; w/ y: f1 q}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!$ D2 k- N/ L* a% P+ [

" K2 m9 {3 G8 X, w2 c你的延时子程序中的延时太长了,所以闪烁。" E1 |. B4 ^  W9 @0 E6 f
.
4 W* {9 B9 V! b2 u3 d" T4 Asyw  091204---08.22
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
3 b& J$ }# q4 y# }: M. v- V' }* ~( }* }.
8 r& Q, n1 }  k0 A# C你用一下我给的延时看看还闪烁不?!
" {" J  R$ M; p4 T! c& @.
  m0 V; |# _) B9 T; Lsyw  091205---05.11
8 t; Z" X, k/ s) q: A0 J) B2 e- S% b! _& g8 y

) N9 e- s  w- ]& E
& x7 U8 E/ R: a! I! k  U5 x' ~4 B) v* D# H
        P0=xsjs[xsjs1];+ ?8 \& Q2 \0 {
         P1=xsws[8];& I8 K/ C( u6 f0 X2 [
        delay(10);) V# W* w4 b+ u, d
//****************************
2 G7 V& [) M% l. m    void delay(int x)
% U5 c- G/ A* A# W    {. K! }7 c7 M9 ~$ T& A
      int  y, z;8 D5 K& v$ Z) y. C' E: z' P
        for(y=0;y<x;y++)
9 U+ ?+ ~- n" `' e  d7 l) `        for(z=0;z<2;z++);: e4 q1 Z* J& W5 [5 x7 V! R2 c0 D& d
     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
* u+ z3 L" F: a# |#include <AT89X51.H>+ E7 s( ~& `8 t+ t
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
4 }6 v9 Z9 _+ C7 H  s# \' C; ~int i=0,j=0,k=1,a=0,js;
* w0 ?3 B% Q7 }" v( Ysbit beep=P2^1;
0 U/ `4 G7 A: b- V1 C7 N8 b2 Bsbit P35=P3^5;
; u" V+ l8 \  m& @! |& J. csbit P36=P3^6;* G$ I' s. c$ L7 t2 z0 M
sbit P37=P3^7;' N" z' O: m0 M# O7 R
void delay(int aa)
% I2 X1 m3 f: K  \# A{int y,z;
. E* V, [( I2 qfor(y=0;y<aa;y++)! F) {5 H1 j1 Z; I) E$ L1 j* m
for(z=0;z<60;z++);$ y5 B9 g. ?0 U- g3 b7 f$ T
}
/ }( C& k7 V  d, |; z# O  _( L) Q& u
: x3 W9 G+ J( g7 wvoid main(void)' Z/ g; P/ v+ a$ |. R
{
, M" _& P2 ~& \: P. mEA=1;
4 \7 e2 E4 Q4 f$ J) Z' k) TET0=1;; a1 n# \4 }( r1 a6 v8 h& Q& q& }
TMOD=0x01;
' i, u& D3 b' W% J$ e) hTH0=0xff;9 H; D2 ?5 S& V" @/ E
TL0=0xff;9 ]5 v! W# [7 s5 }( L0 Q' a. U( b5 w
TR0=1;: q  B- v: q2 I# q7 p8 h+ J/ I& A
while(1)
# r$ u) a! ~6 v* g2 K; G8 J! u{1 [0 W* ~, m$ W' [/ \
for(i=100;i>=0;i--)
* J$ n3 c, N; \% S# B) I{3 q0 l* f  C+ V3 c2 U) q8 l
js=i;
0 [: y& O7 A5 j- b# x0 i delay(500); }
, V% y& F! r1 f6 D( O+ }) m! E }         }
" }, x, S: Q0 u- K# O: H
! m: D- m) t9 Z" R* y; H. P3 z8 ^  g: \7 D: B" H! a$ Y
void timer0() interrupt 1
+ ], G4 Y* X& P/ u3 F2 i{5 ?! g0 A- P4 l! @. X. a
  P0=led[js/100];
5 j4 ~0 i! k' M* A" hP35=0;
; Q2 ^) z: ?. u' {8 s  delay(5);
2 o' {  H2 f  L          P35=1;
0 ^% r9 K& O( T( L+ s$ \  P0=led[(js-(js/100)*100)/10];
$ R  T! p4 g2 ^. R8 h# J" [( zP36=0;( |/ D' q# x1 ~3 p6 U
  delay(5);5 f* d( S( k4 M: Y! ^1 u
P36=1;. r( o5 S, f4 q' l+ _7 G
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
8 i3 K4 U$ u- F. Q+ ~P37=0;3 L; ~* N: Q. \5 w8 R# v: @
delay(5);
4 N9 {! z4 K8 o' q) T  P37=1;5 N. F; s0 K& M& o% {  P# w. N
% T: X" N! R8 o) _5 f2 J4 D
TH0=0xB1;
( J% ^: l. |9 c. k, z* X4 ATL0=0xE0;
- i1 @4 C% T* N6 z0 {8 d$ V  {/ i
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-22 19:10 , Processed in 0.049924 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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