机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3268|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。) l" B8 M: a3 k& ^! l3 R
程序如下:, M+ Y+ J3 f2 S) k9 y5 V' L- d
#include <AT89X51.H>
, g4 s: ~( m4 `. i) }/ m4 \unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
9 M- u- i* ]0 [# s* s& H+ pint i=0,j=0,k=1,a=0;2 ]1 H# e- F3 G) T- ~( B
sbit beep=P2^1;6 E( L4 c2 y9 ]% w
sbit P35=P3^5;1 Q+ y" C, o% l: m. S' V" u0 i) z: m
sbit P36=P3^6;5 k( z8 E9 e" U4 n) z8 C# p
sbit P37=P3^7;- y8 o6 S2 ]! j$ v
void delay(unsigned int aa), v/ S5 E% S. q  q* U! X+ l
{unsigned int jj;
- M. u/ Z7 e. f4 D! _for(;aa>0;aa--)
  k9 M9 f% g+ o7 sfor(jj=0;jj<60;jj++)
, q2 \: Q3 F9 L' b{;}}
' N- z" [+ ^3 X7 v  Rvoid main(void)7 A, Q) B3 g7 w6 N
{( _9 g) S) v$ ]' \; o& D
EA=1;
% j4 [) s0 \1 f) P3 ~ET0=1;
4 ^; s/ @) ~& }) ^; v- mTMOD=0x01;
/ O; f1 }% b* g% A4 D  D# F) f) gTH0=0xff;
# g* I* w+ _) @2 LTL0=0xff;
7 G! Q- `- A4 X) L1 OTR0=1;% a  T$ {4 {; l( i
while(1)
& }, z: E6 y7 R! s) n' _! {0 v{
2 _! n' ~7 M; Y; j+ ? }  }: D( b  W9 o2 \+ s' e  E& H

* Y( Z, N2 ~# J6 j/ zvoid timer0() interrupt 1: F8 J- z) u" o
{if(i<1&&j<1&&k<1)8 ?5 A0 a+ ?  D2 U
{P37=0;
- ]1 {  W' W1 Y3 x( a0 C7 B4 g& m9 SP0=led[0];
6 _, Q' L$ S8 h8 c: E  b! mbeep=0;                                 # j' k1 w4 S. i0 ~! U
}
9 W4 _+ R9 z; S% B+ ~else  * ~* A+ P) ^9 O; f- ]: Q$ V
{1 d( Y" U9 j2 s6 }( q/ n* ?
P37=0;0 O! F) p" D0 q5 T+ k) E; J2 ~
P0=led;
( k& J; {; W( ]0 f' V& Wdelay(5);
  z4 }! R, }. [P37=1;
" ^6 J3 Z9 n5 ~" Q}
  d1 z  Q6 ?7 n& H: H# ?if(j<1&&k<1)
; ~" ^% F  G8 ]( C  O: b5 \4 WP36=1;7 _2 h0 `: q; X$ N. K
else
# A+ S/ F5 B0 `9 [% e) B{3 u9 b: n3 d8 X# b4 r6 @
P36=0;
! l6 K- o. H+ l. h4 wP0=led[j];+ T* e* p" y5 T* |5 q
delay(5); 9 }1 k1 H7 h& s/ {) ]3 \
P36=1; 3 j% A5 m) z% v8 v; t" }- B
}2 B6 x& h, _" u/ C# k
if(k<1)
. M1 U- v: m7 X4 {! CP35=1;
* x: b3 x8 P( [else
1 H5 I4 Y, t4 I; b{P35=0;' X0 {7 n- ^% X9 g; w
P0=led[k];
( C' q) J! l0 \delay(5);  
5 R+ }; _0 P- [2 vP35=1;7 i+ z* b9 E; h7 S# q& s  I' |
}a++;
& b) \4 j# D( f1 M/ I' yif(a%20==0)
8 z* @8 i. n. C' P! f% U{ . p' i+ q/ j! _8 Y+ p
i--;
6 |, q+ _3 @8 o/ w1 D( K  wif(i<0). O9 Q5 g* m! W- ]6 k1 e
{i=9;0 T. `, A( Y+ d( Z
j--;}7 G6 L; T0 T, S) ~0 n- p0 Y8 t- ^
if(j<0)                     
8 S4 i5 r* L4 }" @0 `{j=9;# R( x6 k# K$ C( j4 f$ M( @/ N( Z
k--;}: r, ~, \# k& H; ]- n
TH0=0xB1;' \% i5 d2 \" y& A" `- g
TL0=0xE0;9 B/ U% p, D9 c- G! P
}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!. q6 x" u9 \% e1 D; r# w5 K
9 u$ s1 g8 }; F3 C% t+ K4 J2 d% F( b
你的延时子程序中的延时太长了,所以闪烁。
; s  Y; n7 x4 [" o/ [6 |$ G.& j7 L$ h# P! q( Q
syw  091204---08.22
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
" ^0 x, H% G- g8 `.- ?8 `& z6 O7 N8 T- X* e
你用一下我给的延时看看还闪烁不?!/ r, V( [/ y% k/ ]
.! _9 \( @& B1 F, Q# w
syw  091205---05.11
7 z0 r4 c& Z7 |' y: d# Y+ t# b) H- ^; j% A5 ]9 N" u) g
; d2 O( X- p5 ~
* N7 l% ?# }1 w

2 ^0 R1 ?  }( X) |  v  g- b# u        P0=xsjs[xsjs1];
; w3 _. S4 B2 W  }, a7 s$ j! b         P1=xsws[8];
" J0 W; m$ b9 S$ }3 I) k/ X        delay(10);
! I3 f; x( |2 l% D4 Q//****************************. C1 c0 }. G9 I& J" R5 c' l. m
    void delay(int x)% z6 }* ^$ \1 H6 ~1 r
    {4 k8 S, C7 u3 n* S/ y
      int  y, z;  T9 s, f8 m) Q  B# K
        for(y=0;y<x;y++)
6 }# X! ~- h: [" _- k        for(z=0;z<2;z++);
0 t4 _2 V7 D5 N& R' H$ p$ A: {     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。+ L9 Q; A- P( |- P
#include <AT89X51.H>. k, k! r/ a4 M
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};9 s$ i' h9 u! l( A: k
int i=0,j=0,k=1,a=0,js;7 Z% a$ n; H( c1 U- S
sbit beep=P2^1;) E' o6 V9 q* z7 \$ H. h7 O
sbit P35=P3^5;
" O. x/ _) o3 usbit P36=P3^6;/ T- k0 T7 @% s- V8 v
sbit P37=P3^7;
  m9 e  S) o) G7 {' gvoid delay(int aa)3 l# W! Z; l3 T- e
{int y,z;5 ~" S/ _% o" m, k) L
for(y=0;y<aa;y++)' F/ u. l; D' W5 b
for(z=0;z<60;z++);
7 w1 C4 U5 d7 W! P$ m6 a}+ k) N* w( @# v" ^: f
8 x. L$ g7 d+ ^) S- }
void main(void)
9 \( L, A8 F* d3 M6 T{
7 j2 N: @0 p. h3 e# Z+ A/ ]EA=1;3 y) u( ]5 u# {& e
ET0=1;, u% f) x5 [: y2 f
TMOD=0x01;8 u  N; M* Q& p: _
TH0=0xff;, L, t; W% g* c! ?7 [) |2 X
TL0=0xff;' d6 @$ \. l4 z, c" c, q% ^. L
TR0=1;
' x3 @6 E* o# q3 v* p1 k5 ?/ l, F% Bwhile(1)
  e5 w2 t1 M; @$ N3 _/ B{) X9 U* v4 r* P
for(i=100;i>=0;i--)
  z9 W( A" t- K1 s  A: a0 e{
8 ~! ]* [% W% V, j' i7 q5 ajs=i;
: M) u- a' U) n- ~ delay(500); } $ h' g0 `% m: I4 y! p
}         }4 W: Y: ?: U% S" d( t4 D

0 S3 P  r/ |, f7 I# S4 I
" H* X6 D( F. x" W+ Hvoid timer0() interrupt 1( z3 {" v( x( a+ U6 |5 ?$ N
{
6 M9 F3 D) _5 D* D5 R2 W  P0=led[js/100];
9 h" R7 [5 t) w* f5 ?P35=0;' ]  Z* k3 T1 o8 _
  delay(5);/ j; L3 v' I) Q8 t
          P35=1;) M2 g+ y' A$ H' u- i: `2 P  q
  P0=led[(js-(js/100)*100)/10];2 ^' `7 j% C. R# T" i
P36=0;( O6 Y) {% L; s
  delay(5);' X5 K  [' t" W" S9 s. q  {
P36=1;
( I( O) {, t# D% n  [( ] P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];7 ^" [: x- A# L/ V5 ^3 K4 m% y
P37=0;7 S7 e! m5 v& {' M
delay(5);0 |% v9 F7 E  d4 }: e" H" R0 x
  P37=1;
) m6 W  @+ i& Q1 J' g7 ?' w! W+ [3 J* G" ^, n: m
TH0=0xB1;0 h2 I; t% C6 ~& f( a) A
TL0=0xE0;
# o: B+ V; ~7 B
  X. f4 y: a# r}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-19 06:49 , Processed in 0.065346 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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