机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3176|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。% H) j& C5 A2 O3 ^. a. _# w8 `
程序如下:
! V2 b3 |. P& ]' S#include <AT89X51.H>( J. Z, {; O6 U
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};/ w& Z  J; v$ t) m' o4 o+ W" b
int i=0,j=0,k=1,a=0;
- g) B. d9 C  o& Qsbit beep=P2^1;
, T, X+ I/ e* Csbit P35=P3^5;; z: x( E! x5 m+ I2 E% y
sbit P36=P3^6;
1 L8 O6 d4 g+ Nsbit P37=P3^7;+ }6 j) b& Y! m+ V; H/ u3 @, N
void delay(unsigned int aa)' m' Y, E, d8 T7 D
{unsigned int jj;4 \' A7 B& x. _2 C% c% N
for(;aa>0;aa--)
! A% \3 U% u; Q* i# G! h( xfor(jj=0;jj<60;jj++). h! y* {: e8 n9 g
{;}}, T6 M4 q- B# g' B4 X  Y# d
void main(void)
7 n6 R, Y6 R) }2 N' u' T- L{
' ^" G# L) E3 vEA=1;9 }7 M) T4 o7 X( y2 A( J
ET0=1;# p  P& l  h0 Q2 t4 S' W
TMOD=0x01;
7 ~1 y" Y( w' K5 S& r+ g5 ]TH0=0xff;
! x: y( r/ n; Y# ~* gTL0=0xff;* C4 m' c7 O: ^( Q
TR0=1;6 h# v# U; w8 Z! v0 ?/ u) Y! F7 b
while(1)
. ~; S' f% @& R6 {0 m( E1 z{" z4 S5 q( Y* M5 e! k2 A
}  }
# Z3 q$ H- C( w$ U- z5 N# ^* H0 H: {+ Z) U  S
void timer0() interrupt 1
" i( C3 U) g" E/ U* ?{if(i<1&&j<1&&k<1)
8 Y. r$ @7 G* V6 i" {: h3 B{P37=0;
4 D  s$ x! i* B8 x. d1 x3 TP0=led[0];
2 k6 c. q: C# k4 U2 S8 zbeep=0;                                 : X) V* N8 Q. h. [! B4 V
}
$ T) R# ~% p% X5 [( h/ Velse  + S8 f  e) {, w5 A
{6 l% u: q3 e3 P, ?# B8 S4 ~
P37=0;
3 t3 M. j. L+ g2 `. RP0=led;8 s& ^1 h" [3 h0 ]5 m( g* n
delay(5); ! w1 T) Q& ~: M6 @
P37=1;6 M& r+ a9 L; i; S% D% @
}
# s3 E4 ~; o2 t4 ~if(j<1&&k<1)
4 W; E% ^  s2 V+ dP36=1;
* e- l  x' R! _5 s" n/ K) jelse' F8 l2 X: B0 X/ J1 s7 v# ^
{, M2 c1 b) d( H) N% ~) S& D4 w
P36=0;6 a, D- ?5 o& m3 v2 p1 u% g
P0=led[j];
+ M& ~' e6 w7 ^. Bdelay(5); 8 }0 z- z0 ^- ]" ]9 z" m3 _: x
P36=1;
4 U! S& f* ^( ^, e+ g! ?}' G4 c' w$ u$ g5 Z8 W- G
if(k<1)
. J7 f. a- d0 L$ F* n6 rP35=1;
8 f( C* c* y, `5 c6 K6 Yelse
- Y3 e6 z( v% l- k& F{P35=0;5 l6 H+ g& n  C2 R
P0=led[k];
9 @. g$ Q- b- _9 F5 E: i: w7 Y! ydelay(5);  
  O- ~0 d9 J. n0 Q& F5 OP35=1;
& m, Y  v3 g3 o}a++;  P4 r+ s+ l" u8 Z
if(a%20==0)
9 H1 c6 a0 H: a( w: h{ 4 ]8 {& V9 w  x7 K! G; ~
i--;. q- f6 X# Z5 Q- Q  l5 E4 b
if(i<0)
' @% h; `# S* E9 o* k/ p! Q3 i2 i{i=9;
9 J: j, h7 E, H* S2 G* U5 ?( lj--;}
" q2 L, u3 i) J- aif(j<0)                     
$ b7 Y$ b# Q" O; d{j=9;, X( s  w/ p! J  t
k--;}' J+ J0 G+ q( H
TH0=0xB1;
; T! [( v; i# ETL0=0xE0;* h+ ~2 P2 s1 J! F. N0 u
}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!
# x( J. A  o) ~; G5 T
8 S4 Y" ^3 P! P0 G: Q+ e& _你的延时子程序中的延时太长了,所以闪烁。1 ^# k2 @" J; L
./ k+ U  @9 W  p# o4 H" C
syw  091204---08.22
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!
, o* v& n* a  U0 k.6 R$ E+ u8 @* @! H& c
你用一下我给的延时看看还闪烁不?!
( M2 g: g. ^) h' g* P.' u5 P" h/ ?7 W4 {0 v
syw  091205---05.11
9 y7 L7 K) Y3 V0 f$ x" ~6 Q/ c: a; b+ E. }3 _0 T7 }- M9 _: l3 s
; L1 d# B1 }# e) Y' `

+ I7 k, `5 u) j0 G" g7 d$ _* O9 _
+ ~, e5 I3 A7 C: h2 N0 L% J6 P        P0=xsjs[xsjs1];% S$ u$ P* O8 Y% F' S  K# t
         P1=xsws[8];/ S; O! v' h& ]- {6 \( q
        delay(10);
6 ~( S4 `& i8 W- R+ J3 c' Q  n//****************************
3 S! g) n7 O1 r/ n    void delay(int x)
' p  f' u. b# W- A7 U, Y) L, _    {) h6 R9 d( ]* p( s1 d8 o
      int  y, z;
; ^. ~4 X3 ~1 n/ P: t2 F9 r. t' A        for(y=0;y<x;y++)7 O! d5 P6 d3 w/ w5 n9 L$ ?% ~% |0 F
        for(z=0;z<2;z++);
. a8 \% s3 ~2 d0 D+ r5 T: @8 A     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
0 ~) A* j4 P1 q& t7 J. z& y#include <AT89X51.H>) b. C+ Q" v; B. R) J
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
3 `. p1 Q/ F$ Q5 P/ eint i=0,j=0,k=1,a=0,js;' l6 ~/ @. D/ _  Y
sbit beep=P2^1;
: l# f7 ^# C+ E, bsbit P35=P3^5;. Y1 S# E& k' o$ N; ]3 y
sbit P36=P3^6;
6 C& x  C6 l) `* ?1 I/ z% F# Bsbit P37=P3^7;
' f1 m3 \7 p$ `; e3 g6 s$ D% Uvoid delay(int aa)- p+ A. L  s2 `0 c
{int y,z;
7 w- G& o3 O. z' N& J( f; vfor(y=0;y<aa;y++)
6 w8 j: u  x; Z7 Rfor(z=0;z<60;z++);
% r( X' l+ x+ ~) I4 l& D}
8 g0 N# g/ o, j( V4 ], @! L3 N
4 ?6 k, l+ R1 ?8 p: g+ S2 M+ lvoid main(void)* w) ~3 [5 G9 y& O& [3 y5 g
{
# Z7 n/ [: i9 S7 j% G1 z  sEA=1;0 S+ M' J4 M: ^. z2 {: K
ET0=1;( o, J2 v2 v0 I$ g  d' v- ]  I
TMOD=0x01;) g/ N" o- q1 V2 c
TH0=0xff;1 Z! i3 n4 q3 U, s; z% K. N$ S! P
TL0=0xff;0 T9 a( {# q7 x
TR0=1;
* `+ y, @/ F4 e* N% e$ Wwhile(1)) S7 B' w! y0 f/ T1 V% G
{/ f2 [7 M1 R+ X2 v$ U
for(i=100;i>=0;i--)" y' |- d( W- c
{6 e% t$ ]. \8 ?# [. ]" Z0 C8 m
js=i;" p; z4 p% B7 L$ `- y6 ]# {! o
delay(500); }
% ?8 ^# r4 K. Q7 a' s2 b }         }
  T8 @5 Q$ }& B8 }6 d* n) @: f' {- c) |" S' o/ C( ^
) R, ^- ~4 T3 Z1 k* s8 C) j
void timer0() interrupt 1' E: Y% y& S2 V, p" ~
{+ {8 A7 P: A* \2 s: s6 @. S8 h5 [
  P0=led[js/100];3 D, Q- l1 k2 S% ]5 T' ~( t0 D0 p! \
P35=0;9 v+ j/ s4 D2 \
  delay(5);
% m' U+ ]% x) v/ L5 k          P35=1;. _* u6 Z# ]9 S' P. j7 Q
  P0=led[(js-(js/100)*100)/10];& u' s$ L7 J5 Q5 Q! k2 r
P36=0;
) V) I( R9 h" {0 j  `  delay(5);
2 @( Q7 f( z/ C# j& _ P36=1;7 A* n* e; E7 u
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
* ?1 p" }- M. q9 sP37=0;% ?: P3 j- ?$ W: t1 A
delay(5);
: A0 g4 _' \$ L8 K# ?* m5 V9 Y  P37=1;
: N" F! o/ x) x2 a, y9 ?$ g. I
$ h6 G, Q/ b# U* r" c. D, Z/ WTH0=0xB1;0 ^7 U, G( J" A
TL0=0xE0;
; Z' Q0 X; f" v0 |/ c+ K  \! h$ t! N/ |4 T
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-29 19:52 , Processed in 0.054880 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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