机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3164|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。2 ^/ M5 h3 Q* f2 A4 t) X7 ?$ Q
程序如下:- b/ e* n  n$ k- U( s2 y8 l5 Q1 f8 [
#include <AT89X51.H>0 d% J2 u6 ]3 f4 U6 P% z& |
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};4 m& j! S9 B: f& k! O9 r7 |3 h
int i=0,j=0,k=1,a=0;) D! @# U2 m6 _
sbit beep=P2^1;) l6 C. A5 [2 j0 c% @) j- }
sbit P35=P3^5;
: F1 }7 x5 u8 {( D* P6 d0 b* Isbit P36=P3^6;, {% }  E; q8 d
sbit P37=P3^7;
% {0 I1 M" `! B- zvoid delay(unsigned int aa)
0 i0 y! Y) j! h- r- k( R7 T: d{unsigned int jj;: z, m: q. o" ^" s' u# J
for(;aa>0;aa--)
: @# j; {- |/ Z0 T3 @  q. [' ?) Bfor(jj=0;jj<60;jj++)
6 R" _( q3 i: u3 y' S( s{;}}  {  \1 ^% }- |; w
void main(void)$ a# L: J! Y, y' h5 t6 n3 N
{/ F8 \* p5 n/ t: k  _- \
EA=1;' G: L9 {- R* X1 s- ?
ET0=1;) k- v  r/ D. o7 A8 c) A( I( Y
TMOD=0x01;
# f9 B+ E2 s5 a. o+ V% GTH0=0xff;
' F+ K' R1 ^/ G! w# _TL0=0xff;
7 }5 l! @: f- ]& a  p: kTR0=1;
; L- O  C4 _( u2 p( P( K6 |while(1)
7 ~0 h6 a; ]: t{
( C7 a$ g' U9 }5 U% l }  }
4 [& q  m; X8 S: h+ B$ F5 [
) w! z# C7 ]) Q" l! `void timer0() interrupt 1* K  f4 o! k, O  H; t0 s! v
{if(i<1&&j<1&&k<1)0 m" ?  I  g* [0 U4 A. O! C8 M7 T6 C
{P37=0;
* P: `% t$ Y5 ]6 D: F9 Z. Z4 u4 [4 k0 WP0=led[0];+ k* x4 C0 f+ O; B2 n# F# C
beep=0;                                 
* w. Z- g) v" ]- k4 t. k/ Z$ o: [" Z' h& e}
6 P% f1 f" ?: S  f3 y# `" N- Melse  
3 C' j; a  Z( i{
* L0 u2 \% x) ?# _. ?& hP37=0;9 \0 {* S$ w2 }% r
P0=led;
; N; N. }6 n! A! y6 _7 Ndelay(5);
/ q$ [$ X4 z, ^6 S0 M+ TP37=1;
0 `( Y% V: t$ d1 N3 ^. ]( p9 h6 F}   m. W4 Z& a; l" k
if(j<1&&k<1)1 a* ~) Y1 N! E4 N) H
P36=1;
. m& n) H1 i' D# A1 `9 j8 selse" E1 l8 ?; j: [5 T. a  N
{5 Y. E9 G+ e1 Q) G0 v) T
P36=0;, z" b; p2 O1 m4 o1 S
P0=led[j];( I) y4 e2 Y7 Y$ {
delay(5); & g7 R4 D5 L/ ~/ u, Z! r
P36=1;   M: O5 t* @0 r; A& _
}
4 @4 t* m$ a: Dif(k<1)
. ~* r/ P, l5 I; ], E8 zP35=1;6 W3 s3 x% a- f% k  _6 O# Z4 d
else
5 Q# {3 G0 g- y& `+ u{P35=0;5 f, R- s+ q( Q) Y) h& A+ @' h
P0=led[k];
% O$ V3 D8 c4 Edelay(5);  4 E* Q7 g  I+ K9 Q  V) K
P35=1;+ G8 ]! {! E6 v6 b* f& Q/ B: y* B
}a++;/ ]4 k: _4 d$ U" T2 @
if(a%20==0)
6 y0 w$ C6 I6 R! S$ B{ : d' F; b; ?: D2 O( |- R
i--;6 a" W7 E) b* v! \  M
if(i<0)
- V4 J) V4 A$ L/ W0 E' i2 c3 `{i=9;0 Q4 F% {6 e9 L0 S2 m' Z: K
j--;}
% g7 t1 D/ ?+ W/ b3 zif(j<0)                     2 I* h" E( L. \7 j9 M" G
{j=9;+ s( N1 ?. O$ o2 o
k--;}
9 f* g2 U. M6 mTH0=0xB1;4 A: ?: X0 `2 {. J4 H
TL0=0xE0;9 Q0 b( D0 v" N. l% B- T* f
}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!  @' n) [% x" K4 d. m
5 B9 N2 f+ S# c  ?9 W8 A; z% K
你的延时子程序中的延时太长了,所以闪烁。
- i' K" }7 N# E.+ v! E! b: k1 R( X' D
syw  091204---08.22
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
1 \4 y2 Y. Q7 W) _$ P." q/ A3 r7 X8 _2 G- s3 G( V
你用一下我给的延时看看还闪烁不?!
; p; u# P+ |( M- s! O  n( K* l.
& K) a3 i. ^9 C+ isyw  091205---05.112 v$ \& `" o! N
, ]) {# M! v- I7 Y7 Q5 z! P4 K+ W) B

- Y7 }- t' i* D7 D8 R; _0 s3 y+ f; n( n8 x3 H

8 A$ t4 {! N1 q: O5 G) d: J        P0=xsjs[xsjs1];
  H" v, U4 T, t9 a+ u         P1=xsws[8];
  u4 m  ^, X# U        delay(10);
/ v" ?7 ^8 ^. p+ d( u, m//****************************
" t/ Z) I4 Q$ a% G    void delay(int x)
! q( e) g# u3 s& L* O9 S    {
$ Q8 [  x* [, Y% Y      int  y, z;# ^) c0 d5 M- H( D/ M, t
        for(y=0;y<x;y++)/ [; |! ~  P: G8 Z/ `, A
        for(z=0;z<2;z++);* D6 M- X0 {2 R/ m
     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
: j2 {# D2 y& w5 Z! {! w3 O#include <AT89X51.H>
0 Z( X! G& a# L$ W: ~unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
8 T& G* k  ^$ Bint i=0,j=0,k=1,a=0,js;
& r& p6 W3 x2 ^1 H. Dsbit beep=P2^1;: s6 g5 i$ n, ~# O
sbit P35=P3^5;
) T9 z7 C: S) }/ k! T+ _* _2 Qsbit P36=P3^6;
7 {8 @4 v+ O$ o7 Zsbit P37=P3^7;* Z" f# [& X) o
void delay(int aa); l3 `! z& V2 t, l- O
{int y,z;
1 M9 r: U/ r1 I3 e+ h- k# d1 gfor(y=0;y<aa;y++)7 `' d, n( f( Z: S
for(z=0;z<60;z++);
) `9 q' y1 c/ S5 C( {}# \  T9 w9 N+ ~2 ]+ K# U
" E1 B; R! W& ~; s; I
void main(void)2 i6 J2 M4 d8 t; ^, Z; d$ H0 M
{5 Q2 ]" Q3 H. ~
EA=1;3 u. [2 r6 @, s; `  D4 }
ET0=1;  J3 O1 n9 [1 G6 C$ }. _
TMOD=0x01;
4 s- J& Q4 ?, \TH0=0xff;2 q% x. v8 ]; J9 X! u9 u% c  C
TL0=0xff;
! b+ {; P- t1 R$ I/ }! GTR0=1;
2 E( ^, v: k8 q4 N+ ]- gwhile(1)
. J7 W; [# m- L. q1 ~# o0 a. N3 q{9 f0 p  G+ r6 E! r- @2 b
for(i=100;i>=0;i--)# V" n# \! ~( |9 g! e5 G0 v
{+ E$ {. [, w( }+ A2 I* r
js=i;
/ Z% }/ [" z3 Q; ` delay(500); } 0 K- I3 |  ~# |% m" i& g  _+ I* f& I
}         }
0 c; N' ^1 z+ I* b* u
( t4 y1 a( {! H+ ~5 {! {) i8 G) A/ j8 u) `6 V5 E
void timer0() interrupt 1
3 b8 E+ P4 o* H" J) d{  M% i. }4 c1 l3 k' U
  P0=led[js/100];
" {+ n: d8 \" d& \2 s/ ?. [P35=0;
. I# c( ]0 ^& N5 }2 A4 f; U; |  delay(5);
/ Y. b! h' x9 M4 k) @# L7 n6 D          P35=1;% }. s2 D) w" M  l
  P0=led[(js-(js/100)*100)/10];
! O, b/ i. b. x  p0 R1 @/ o" SP36=0;- E5 _) @) _' w2 U& C
  delay(5);
3 f6 t! j* s: L7 E& a P36=1;
( ~( v3 U( v; L P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];" n. D$ i/ T3 G6 b, D- `
P37=0;' o  A$ Z2 b3 r* x" S
delay(5);& ?- q3 e$ Y5 S$ [) Y% i: H% P6 ^
  P37=1;" W$ r/ J  W+ o9 u! \+ t

+ x1 G! L. C, P  P- ]( GTH0=0xB1;
9 _* S  V5 ?; v) nTL0=0xE0;" E$ e) f! `  g  \

8 E6 H8 b* r8 Z4 z9 X, M}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 03:40 , Processed in 0.051122 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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