机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3211|回复: 4
打印 上一主题 下一主题

单片机新手,请教问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-12-3 19:57:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
# v8 e2 a6 S  Y4 O6 }8 p; O0 g* P程序如下:
8 w: M( M% b" D( W! }8 R, ~#include <AT89X51.H>
8 A, j# v- E. H/ _! o5 sunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
0 V3 K: M& L8 f% Zint i=0,j=0,k=1,a=0;
5 J7 q, o. s& E% r" y4 Csbit beep=P2^1;, E' K! Y0 Y! c: L* x, |/ X
sbit P35=P3^5;
0 S1 ^6 k8 {; R9 m# l) b% tsbit P36=P3^6;
- D1 W9 g; Y/ |! |sbit P37=P3^7;
% B' t/ a- D9 H% S# N: |8 |void delay(unsigned int aa)+ ~& d, @' `) O
{unsigned int jj;  q3 p2 X" [: |' G5 V' b
for(;aa>0;aa--)
8 T: Y8 c1 _/ xfor(jj=0;jj<60;jj++)! [2 [7 d% b* R! S
{;}}
8 f8 `  H; H1 Bvoid main(void)- K3 q2 H0 T- v8 M; K
{
* E; _" f' _9 G" |$ @) p# _1 zEA=1;0 J, q" O; N0 D
ET0=1;; @) G: k% Y0 g: S% P
TMOD=0x01;
. H7 a* E) @7 X% }* XTH0=0xff;
5 P  [( y* N8 X) d- r7 {! f! eTL0=0xff;) I; \+ {! Z# r
TR0=1;! _1 w2 C0 |/ {" f0 I# L
while(1)
7 ~3 F* q! d9 V- y( T& M" B6 t{
# G* E9 t+ f0 H3 v  g" v }  }8 U, Q1 l) C4 N' S
) l; i: {9 f1 t* o4 x. p
void timer0() interrupt 1
& ?' U" O7 a6 A0 @2 H% k* I1 J: O- \{if(i<1&&j<1&&k<1)! \6 N; r, c1 k, a' H9 X; R
{P37=0;
# s6 o3 S2 f2 ?: U3 g3 C9 Y# [P0=led[0];
0 i  l& C2 ]5 ~% x/ @. X4 X1 P% G4 {$ tbeep=0;                                 5 ?/ g; K  t; J
}$ E: F6 k  a+ d
else  
9 m& |  Y8 v1 Z$ ?{7 T" }% y# L( _3 p
P37=0;
1 |- f, i2 C0 jP0=led;
2 R2 B( s( ?) c0 ^1 tdelay(5);
0 j, \( h- G9 A3 N/ vP37=1;0 J% p/ ?, R+ M
}
- ^+ \7 }4 W9 r  ^/ Oif(j<1&&k<1)
3 c+ F! b1 W4 p& x* `P36=1;
- }$ ?& J% J& kelse' C* L7 N6 P! c; _. R/ U
{/ F; w; ]& y( B* M% `
P36=0;
1 [7 q/ S. e  y# jP0=led[j];
/ ], n1 t( b! g  f" P4 `: T! h5 o, Sdelay(5); ! P/ q7 D5 x" U2 y
P36=1;
9 o% T: O3 }+ g6 L) a% j2 y, J}5 q4 f4 Y. b& Q
if(k<1)
7 A, S! ?% m1 c4 W" C: h, xP35=1;9 j) x' f# P1 t: S! }% T  o* B1 Y
else
! F8 A. A6 F( h9 E& U{P35=0;/ N! v  V2 S9 I4 J' k
P0=led[k];$ J$ I: s2 d5 ~* Y3 C+ j& T7 J5 V0 S( c
delay(5);  
- C2 F, n4 t& j0 D, z- |" bP35=1;5 c3 y3 G+ W% I2 V" @3 W
}a++;
$ X7 ?& h) K3 e# wif(a%20==0)2 v8 f) j1 \6 _0 d; L  c
{
9 ~6 L- h6 z$ ni--;5 d2 i7 B) x# {# y2 _5 T9 J# G6 D
if(i<0)' D9 K* I  `* q% ]8 i
{i=9;8 B$ K$ E* G1 X) k* B/ ?! V
j--;}
0 j# A4 S( W- {7 a$ [8 t# V  ]if(j<0)                     
! F' v1 ?( I/ e7 F9 f{j=9;& v  ~/ H5 S* l2 [8 n9 t
k--;}
8 D, D; A# ?5 e# I) c# wTH0=0xB1;
& _9 \# _' P; BTL0=0xE0;
$ Y  y# z. O1 l" V# p}}
回复

使用道具 举报

2#
发表于 2009-12-4 08:22:36 | 只看该作者
何其 网友好!
$ }: l% t6 l, ?
8 Q0 O' b1 q$ A8 T你的延时子程序中的延时太长了,所以闪烁。7 ~, }* m, h: z% O# T
.0 s/ M6 H  u% l- P
syw  091204---08.22
回复 支持 反对

使用道具 举报

3#
 楼主| 发表于 2009-12-4 13:06:37 | 只看该作者
不是吧,开门大侠,循环60次,一毫秒都不到呀。
回复 支持 反对

使用道具 举报

4#
发表于 2009-12-5 05:11:29 | 只看该作者
何其 网友好!
, R6 ~) A- y4 w) q. A. s; q6 b.4 h) i  A5 c4 ]# p0 U4 h- S1 W) U; }
你用一下我给的延时看看还闪烁不?!5 ^/ K; F' W' j& T
.& l3 k0 O/ a2 i& \) W
syw  091205---05.11. e* t, V' R* g% }3 E, u
- A. B2 i6 @/ M* R

6 j6 F! `8 N4 Q/ g; M9 p! K* R1 H# q7 _, M7 o, Z# W3 V5 w8 s" W% Q3 x

% ~% k. x0 @( a5 l' N9 Y2 Q0 `5 v  O( P2 ]        P0=xsjs[xsjs1];
7 f- Q0 x# S/ ^' p         P1=xsws[8];
) R$ o! T+ j* y5 }) U( }0 z( B" E        delay(10);8 Z$ c& w# N6 C+ ]+ I+ W
//****************************+ f; N/ Z  V2 K( N) _
    void delay(int x)8 P6 i, c: V+ a8 s" @2 K; D, X
    {% y+ B3 j) ^- l) d8 H
      int  y, z;: ~. t& T6 ~4 E
        for(y=0;y<x;y++)0 `" n5 a1 q0 B4 J9 [
        for(z=0;z<2;z++);7 D7 J, u/ u' y0 ?4 m2 I* a
     }
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2009-12-5 22:29:30 | 只看该作者
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
& y3 ?6 d7 o  G0 u7 J/ w* ^#include <AT89X51.H>: ^$ P& r# u+ `4 V; P- T( f
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};4 ?" k0 D: z, |" H2 C0 T" U
int i=0,j=0,k=1,a=0,js;% _* S5 Z. e6 B$ S6 Q. W8 R
sbit beep=P2^1;
8 l" I; H; a. C% xsbit P35=P3^5;+ z* U6 z1 ~8 ^" ^) g
sbit P36=P3^6;
4 A5 w+ G) ^. X0 vsbit P37=P3^7;
/ ~9 |/ {2 |" B& `+ b" W8 Y' j9 tvoid delay(int aa)) ~3 v1 _; z' k1 F" ^
{int y,z;
5 V: k" ^4 C8 B5 r3 l- m" Ffor(y=0;y<aa;y++)5 d" @/ i- a- w$ e4 w$ ~
for(z=0;z<60;z++);* i& \0 D! l) `
}
( }: u6 r0 a& Y+ |& M4 W. V3 }7 }  _' f3 y7 I) w
void main(void)
& D2 I% t3 \" u3 [+ `{
. ~3 I3 G* Y% M, l- |EA=1;
. I- w" V! U) ]4 ^1 x" tET0=1;
. o4 y+ x9 [$ v. a* E9 e, b0 r9 DTMOD=0x01;
9 S* z% R; c( v$ D3 e3 c4 cTH0=0xff;
+ f- \% a2 X+ j5 F3 Z. TTL0=0xff;3 t$ G: ^1 [$ [. N( E
TR0=1;
* r4 Q& _+ \) }4 m. n: nwhile(1); A$ e3 l) n' _. U9 w/ b
{
# ~( |- y# ~: G; Z5 x8 Yfor(i=100;i>=0;i--)
* _% w) v" ^" G: x* @& Y( a/ \, [! v: x{9 K1 A9 _: R4 O; o
js=i;
8 d2 ]$ u* k/ M2 | delay(500); } 4 P0 G' v. Q5 }+ b, T1 w+ B
}         }* [) K8 s) m2 i( c2 X% i
1 j7 }' ?! b8 m1 m1 t0 @' R& c! q% k

3 `" p  g/ m6 v6 C4 b8 ~1 U* nvoid timer0() interrupt 1
9 W5 X% o8 ^$ ?. Y3 {- M$ P2 C{
" l0 u5 J! n( `2 S# _/ c7 h3 C- k  P0=led[js/100];
1 B* S5 W1 g% E/ \9 c7 ~P35=0;
( W1 g3 F9 c# r; \6 I1 B* ]4 X  delay(5);) Z6 _% q. ?/ Q% x
          P35=1;! `# F1 X1 c1 e. [" b$ P+ y
  P0=led[(js-(js/100)*100)/10];4 n1 B( y# ?$ w; }9 R5 k
P36=0;2 w& ?0 n, X6 }, M+ Q. Y
  delay(5);2 D" t: ?4 F; }# \" G+ r* t0 t
P36=1;3 f$ q$ G6 F- r7 f
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
- P8 O* E: T. W' w, L& zP37=0;' q/ ~; J  E# D$ z3 a; t! W" P
delay(5);; T4 W+ w+ m" u
  P37=1;
% a% H" W( k/ W+ D- M
0 m+ o9 \8 _$ }4 q. N1 f6 NTH0=0xB1;
8 ?. s* Q2 J# Y8 nTL0=0xE0;
) O- J8 b8 z$ w4 y
" s& V& I  I! ~! \* N}
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-1-11 17:35 , Processed in 0.048951 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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