机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3265|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
9 K1 `7 T5 ], |) ?6 p( T程序如下:0 Y! l: j) u, n
#include <AT89X51.H>
" B' F, g7 c+ t+ d$ m* Lunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
) A% x. ?- Z3 X. ]" I/ {int i=0,j=0,k=1,a=0;
  Q  q7 Q/ ]+ n4 Usbit beep=P2^1;; |: [( f  \/ Q5 t, ]& x$ N
sbit P35=P3^5;! q8 e4 X: Y' [5 u5 c
sbit P36=P3^6;9 X; V4 D6 D0 `& N- O' A
sbit P37=P3^7;
, {2 _( o7 f1 ^- Q1 Z) Tvoid delay(unsigned int aa)' r# ~1 `  O; @" x: ^
{unsigned int jj;* v, f% p* a8 j+ y: u  V: p4 c9 H: L
for(;aa>0;aa--)
0 q3 _& f3 ]& b) d( X5 q2 Sfor(jj=0;jj<60;jj++)
, I8 A2 N% k# k( B! i" I{;}}
1 F% @% X/ e9 K6 xvoid main(void)
# {5 e" a# U) p7 J- e" p- N{' K1 f. h2 D0 F. _" y
EA=1;+ \1 x* O/ u3 l
ET0=1;/ y  ]3 D% v( a# _
TMOD=0x01;$ _' c; ~5 d% A, A, E( o6 E
TH0=0xff;5 d3 Y% E( W: X: d
TL0=0xff;
( J+ G  A) P' @! u  BTR0=1;
* b/ W" _1 W. S! ]( [while(1)
- Q" M. e7 a( x; s{
" s+ U8 s3 B  h6 d }  }
+ b: V* F1 m8 O* D' @# P, t
& y7 f4 M% V# O* O! lvoid timer0() interrupt 1
" K: B/ W) U3 W{if(i<1&&j<1&&k<1)
& V6 B' G3 X" K{P37=0;
6 F( S$ k2 ~) ]/ g4 o1 P- C1 EP0=led[0];
: o* [& _$ f! a5 }# Hbeep=0;                                 
9 F8 B3 y  _( D% I2 f}* l  Z0 d4 e9 L
else  
) m, ]: T3 E( s$ ?; u  q6 n{8 ]+ Y8 Y" Q' B" G% m# U
P37=0;. m  r9 L4 l( W) n- _; B; O
P0=led;
( Y& Y# M. _% p. F9 T" g* odelay(5);
1 @. Z' o% S% m! Q$ _P37=1;
$ C0 D  K; K8 p# r1 m} : g+ M0 t( L- j( \6 h% s
if(j<1&&k<1)
+ z7 ~( x8 `1 H: CP36=1;$ L+ ^  f* N2 a. A+ V& y
else
) _7 e- I, B2 w5 W) ^* \1 w{
8 M) u- _+ b$ s0 T  eP36=0;: o; Q. v9 E6 Y0 a
P0=led[j];0 a- ?; W+ X0 C/ o4 Z/ k3 U
delay(5); # Y( j9 r  b$ G4 ]! T; Y0 X2 p
P36=1;
; i- Z/ _8 i! V1 G6 S3 L}
# G/ X" a0 V2 `# Oif(k<1)
! `+ \0 s+ L* {7 a' t* _P35=1;7 ^1 \* ^+ y% o* p4 c- n1 O8 n
else& Z0 J; J3 {6 m
{P35=0;6 L  M1 W5 h: c/ t
P0=led[k];  y5 C- V, |- S+ Q+ `+ e: `
delay(5);  4 H. p) {# M3 E. D. B' t0 v+ J0 f
P35=1;! [1 X" n% s% L2 [# ^3 N0 b% F
}a++;
/ m9 f) h6 o2 x/ jif(a%20==0)( {( G% A* V1 U2 P
{
% Q. e2 W8 i" j% U  t' H9 Ci--;  p8 N7 K+ u2 N
if(i<0). L; i$ G4 O, g4 s* M2 O4 y, w
{i=9;3 O2 m. C9 C4 {0 u2 |5 t( N* C
j--;}
' E8 |$ _6 B8 ]  Wif(j<0)                     ) d5 B6 P, Y7 \4 K3 f
{j=9;
& J: N. H/ ?/ y! \3 Sk--;}
5 I! z* ^/ ^, I- {$ \" K1 a3 cTH0=0xB1;
# m7 O: \' S0 Y5 `7 @0 V' PTL0=0xE0;
9 q2 Z! n0 Z8 ^) U  X- J}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!. w: y3 C( w4 X% `
" v" N5 B! T4 A& k
你的延时子程序中的延时太长了,所以闪烁。% E2 @4 p1 m' ]1 b4 J
.- I; n- H0 G8 F0 X
syw  091204---08.22
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
% B- y  J$ h/ y# T.! d7 o# E3 L) ~! {" x5 ^
你用一下我给的延时看看还闪烁不?!
) R7 _) P; Q3 U( C' S4 c.' n( }) l, e! ?+ W# m. H
syw  091205---05.11! {5 F% W3 r8 @% x
2 X4 I+ U+ G" _+ _+ D

1 t0 d% O% e  e+ @
9 r* K7 O' e; l, _! D5 \8 {. Q9 s  }' g$ _7 g! y
        P0=xsjs[xsjs1];3 P, V5 Z  e5 F& Z
         P1=xsws[8];
* u5 d. L  f0 I        delay(10);- e3 h$ s* G- ]$ @! \
//****************************
5 y5 s1 _# \; j2 o. @, n1 Z    void delay(int x)
+ l3 ^4 Y/ }, M; W+ u9 m    {2 Q  g% z+ z6 V. Y- W$ g5 e6 m% l
      int  y, z;5 E. X, j& A# i, A- h7 ^" ]
        for(y=0;y<x;y++)( b  ?$ _$ C. M, f5 d
        for(z=0;z<2;z++);5 L# t. D( [, D! @5 S" u6 ~
     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。2 t4 ^6 D* r8 B3 X% m$ V
#include <AT89X51.H>
. V; V8 l8 W6 G3 ~* }( funsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
$ N' i& o2 }% g* qint i=0,j=0,k=1,a=0,js;
/ }" |! }! I& V2 J9 ksbit beep=P2^1;4 b/ G" f5 |7 d
sbit P35=P3^5;
- d( }+ f0 q4 G5 `% Psbit P36=P3^6;
4 s/ w& Z7 N& {# csbit P37=P3^7;" C4 X' G( S2 H8 v/ f6 o
void delay(int aa)$ R' l, F  S- |1 I2 ]1 M
{int y,z;4 H  [- ~' c: J. J2 S. {" x/ _. ?
for(y=0;y<aa;y++)  A9 N8 p& d  ?' H" F7 c
for(z=0;z<60;z++);
$ x# [! |) q& f' z+ P}
' U0 o9 _4 V+ x' S
9 Q  p. t$ T# `- Ivoid main(void)% a. d% \5 X$ r9 f) Q/ q
{
0 O0 Z$ ~2 ]% d) f5 B- JEA=1;0 L1 }) ~; r0 [* S# b$ D& T) p
ET0=1;2 X3 n: G% ~) v8 I( t. R. ]0 V5 Q+ T
TMOD=0x01;- o; H- \; d9 u0 Q: V
TH0=0xff;- {; t9 p3 E8 X4 V
TL0=0xff;! X" N' \7 Z0 ?" C( R6 e
TR0=1;
% G1 @7 g! d8 P5 fwhile(1)
$ J8 f' V$ h- l8 O; G6 g7 Q( R4 C{- z9 Y8 _  C6 t" @* n7 L' i  F
for(i=100;i>=0;i--)1 z/ Y" v  U" a7 d& v- p' @
{% U. p- |; Q) w- {5 @: p: Y
js=i;2 T$ L7 |( R, P( b5 m3 g& Z: Y+ B
delay(500); } % F, Z4 e8 a; Y+ b1 O
}         }) W- @/ a# E2 r; |

; t4 c7 l, J' w: O7 [$ D! Q( C1 l. y! p1 S5 D4 O) b
void timer0() interrupt 1
: D" p+ M7 O0 ^3 F7 j0 \{
6 R- G( I3 t! w' I& n  P0=led[js/100];! A7 ~# v" Y, [, m
P35=0;
2 k+ T' l5 T) t  r7 c  delay(5);- L9 `+ R6 e$ i4 S
          P35=1;5 Z7 E; \2 |# ?$ t7 H
  P0=led[(js-(js/100)*100)/10];! ?: f5 [2 z4 B
P36=0;
; q, N9 |" n) P5 }! q8 w  delay(5);
/ H4 M! U4 D+ N% w# i P36=1;
2 h3 u: T% c$ ] P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
4 |! b/ R5 @: P' x  V9 @" f. d! Z! QP37=0;# |. A) z- `) B$ s% O
delay(5);  ^& j! `) y1 ?4 j8 H
  P37=1;: R2 B$ I6 M# c- X+ B, e
. Y" J  e2 Z% B
TH0=0xB1;
( X4 U, w; e" k: A  C1 eTL0=0xE0;
$ \  c8 Q4 t" m4 N/ L0 M
' o9 i/ _/ ?! O+ I9 I2 b+ u}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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