机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3189|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
4 `4 o# Q* o" ]2 K$ Q; ]2 F程序如下:- r4 A" f3 M2 |. R
#include <AT89X51.H>
9 r( d, r8 f# [& ]unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};# a1 i* P5 x6 }! p
int i=0,j=0,k=1,a=0;
& C$ w$ k* Q) r2 g( f" Vsbit beep=P2^1;
6 Q1 M3 [( D4 u, b8 _+ G  lsbit P35=P3^5;4 [9 [8 Y( C, I6 z% v9 X
sbit P36=P3^6;
1 ]8 R" U1 I7 V5 O# x7 R" qsbit P37=P3^7;
- z% z3 ^# [9 A7 L+ S4 h) |void delay(unsigned int aa)  j0 E6 s  G0 H
{unsigned int jj;
- E8 t% [6 Y3 x6 b: k% vfor(;aa>0;aa--)
/ y/ ^: }/ U& }, ?5 G: zfor(jj=0;jj<60;jj++)0 K& S# t$ a# G: n
{;}}. X0 z0 t- E. t. v: [
void main(void)
  d- ?' X3 r; _# H( S: O: `{! q* Q( K, L. P
EA=1;
7 E2 R& Y4 R0 {& x: U- L; e( ^ET0=1;
$ ]% ~8 v% {; P. xTMOD=0x01;+ J. k8 p. R; A; o8 [- C0 ]
TH0=0xff;, K' A* k/ c' V1 Y7 C/ ?* f
TL0=0xff;
' u" H9 g: ?5 j% _3 GTR0=1;" M/ |. v# x4 _- A& b
while(1)
% `5 B. {$ z  T' {+ g2 g{
3 O; o0 t5 J8 H9 Q( N' ]; u& T }  }
9 I! D1 L' M( p$ I9 p5 k1 C% y1 z; j' o- d4 e3 {! F# p' S3 k5 P% e
void timer0() interrupt 1
6 p% |, S$ `- p{if(i<1&&j<1&&k<1); Y0 N* E8 H- Z0 r  A* z
{P37=0;+ ]: p, z& B% c6 y1 `
P0=led[0];
. x0 Q9 C7 w$ D9 _; kbeep=0;                                 ; z( ~$ f& |$ l" }
}
; T& P  H. t1 n$ {, }else  " i/ x; i9 g9 ]4 P2 \* |3 [6 c3 e
{/ X7 y$ L' n6 r% k& F' y
P37=0;
9 x3 p# C* L9 f. {9 D1 BP0=led;
2 W$ ]* @, j$ p! R4 Ldelay(5);
9 ~! [* {3 q# Y. g* q+ oP37=1;
% j! I  e. ?/ {% K5 t} 3 H/ b) @: q7 `5 o2 B$ H
if(j<1&&k<1)
( }9 p/ `6 o4 g- K7 i; _P36=1;3 ^& d5 s0 n3 z' `8 \5 B7 n# l
else  s5 G6 N0 r1 v' C
{& d" y# T0 u* ]' K9 a& n* D; |, ?# \* O+ p
P36=0;) p0 p  T( e! z& G- H+ [6 r# w
P0=led[j];; z2 c! Q" N. ~) }" A% n
delay(5);
9 b$ u* B1 }( o+ HP36=1; ' {. N+ A+ T9 n' I
}
3 b- T4 C$ r: lif(k<1)
! D" Y1 o# c& Q1 h7 jP35=1;
3 F" U- y# ?$ A. kelse
* G/ L" F) v( I( w' U{P35=0;
! s( G2 j; ]' p- k! P& J5 u) m. qP0=led[k];- c* Q+ M( h5 T3 V
delay(5);  
( i1 U" X) s+ u) [# R8 nP35=1;; f3 ^$ X# f! }' _7 b* |1 o
}a++;" z4 g& j0 w( q. b& ^% {
if(a%20==0)
" i  J5 C2 D6 a{
4 F& s7 i4 L; n+ wi--;
8 |; J7 w/ ]+ C4 U: G4 e* jif(i<0)
8 o7 V0 ^8 T4 |) `{i=9;( p, W- z; q7 e( K0 r2 }( a( f- ?
j--;}( y4 }3 v# B& `" w0 J( }; n
if(j<0)                     
, t6 C: n( Z. ^, ]' E{j=9;# }8 P- h! r& N& b) u) _
k--;}. k. `, T+ l* u9 s6 z' T
TH0=0xB1;
1 b/ x2 s# @- o* s7 [, {" U& \TL0=0xE0;
$ i, k( e; a6 P( ^+ u! e  O# }}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!
, x5 d- c3 a, }# L: x1 L1 ^
+ @7 ?* S9 {% u, g/ x) D你的延时子程序中的延时太长了,所以闪烁。
, p, \8 H9 e7 W# }4 S+ g2 ^.( H6 _& [& b8 L; X1 @7 x  W
syw  091204---08.22
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!, j* m5 i! N" z* G8 I- }: N6 x; q9 n
.' |) [/ j- d8 i4 x) L  }' U7 w. V
你用一下我给的延时看看还闪烁不?!* a( O* x2 g3 |5 I/ \$ s
.
' {  t- I* l& ^! c- j  k8 M  Wsyw  091205---05.11
# ]. g( @2 t, S  W8 I3 o) d
, g0 Q: e/ z+ \( b% R2 U$ l
" d6 ^2 ?$ [+ V8 x' U* i8 M, {3 N) U7 c6 U4 [+ D
  u6 _: R, H6 R2 K2 o& ?
        P0=xsjs[xsjs1];
% Y5 _- I) x; S$ s         P1=xsws[8];
# W' R+ S0 ^& X: A7 G; G! A- ~7 n        delay(10);
+ A) q4 N5 y# x) \//****************************
; t' k% R2 K& r0 V    void delay(int x)
8 v& f5 l: O3 S" t1 K5 {: T    {" `5 Z: K& [; Z  @# n/ B
      int  y, z;
4 M" r) Z$ s8 m/ K        for(y=0;y<x;y++)
( ]  u7 Z. W  e        for(z=0;z<2;z++);
; f+ B* j* A6 _     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
7 Y0 V  U5 K% s1 P1 h% d#include <AT89X51.H>
/ K- l: @1 m4 k) i- bunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};6 x  X( |* E4 b! S% L) |! h
int i=0,j=0,k=1,a=0,js;
" C7 a' W, F5 G3 s# T. r% Y/ csbit beep=P2^1;
, S1 q" V: \+ t- N; U( rsbit P35=P3^5;: {/ D* \$ b, _) {& d; I) I6 T4 J
sbit P36=P3^6;/ [9 o: v% u) u7 Y' P) Q
sbit P37=P3^7;
9 e0 k5 o# k6 K9 P& b5 v2 bvoid delay(int aa)
% [6 V  v' h% E+ r* S& z$ l{int y,z;0 c, @3 H1 z! Y. \0 \2 ?; d
for(y=0;y<aa;y++)/ Y6 e. d6 ]2 e3 t# G# x. C4 w
for(z=0;z<60;z++);0 g% t! C5 d. J% `$ x, t: n
}
- S: E1 h9 G' B/ W4 G: O6 ^  k1 t+ q3 M7 K7 d/ r$ F$ X
void main(void)0 W* f4 p# o# y$ N: u% r
{0 z: f7 l" C) t; [) Y* Y3 I
EA=1;9 `* v) U( O( I. j1 R
ET0=1;" s" @4 I! Z5 `1 m/ x4 _/ J- O7 W
TMOD=0x01;% H& o2 E6 T9 C0 f. I
TH0=0xff;/ n1 H1 d( ^/ u) _' I
TL0=0xff;
% \  j5 [( K% o' X4 j4 e2 q# K) a: O( _TR0=1;* k# F# }0 P8 u5 g5 \1 P
while(1)
- a2 C1 L* d' Y: N9 W. F4 k% t# q{
* m" j+ p$ k) d* q2 jfor(i=100;i>=0;i--)
/ V9 [. P' y! c: _0 P1 F7 t{
* N8 O# d5 y" v/ {9 K6 W; gjs=i;
4 w( n# w; q6 Z! {+ H8 [' h delay(500); }
* O  q8 ~& I2 g+ a }         }
- G0 C( L+ e5 E6 l! o6 K: L. G* D7 _6 W7 q. t6 @& e# ~

" b/ i  U# g9 N7 Q! w* v# T5 Svoid timer0() interrupt 1& |3 w" T; X* |$ }* U2 v& w' G# |
{
1 w. j: z) f. f7 X# u  P0=led[js/100];
( n2 p" k& y% N1 GP35=0;5 ?! l1 _! k! s/ u/ Z
  delay(5);7 {3 ?. _8 [* P& }+ ^% x9 l
          P35=1;. `+ t5 k4 D; m2 i5 s3 F6 d
  P0=led[(js-(js/100)*100)/10];
$ }  l, d; ?! h  \2 U# m0 f5 J4 EP36=0;- y$ p' W, h/ N5 U5 l% s
  delay(5);* F/ h8 H" B* O8 {1 h& M$ P- a
P36=1;. L1 H/ ?7 a2 Q: x$ n
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];" v: d' I: s- w' q/ i: [0 r+ L
P37=0;
6 S. ]9 @, K. X' `& z# L delay(5);
: T' h. W# W- \5 M  P37=1;
1 V  c: m5 u/ z( L3 e
$ k. I; {5 H& R+ U3 y7 iTH0=0xB1;- C3 Y! I2 R( M2 J
TL0=0xE0;/ b" t+ h( _+ y+ Y
- `$ @; N2 P7 c2 z
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 09:49 , Processed in 0.047964 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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