找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3403|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
& w; S# S, u* t; V) u程序如下:
  c1 I. m# B4 p. M9 {#include <AT89X51.H>; [$ s; ~# }" s( c; I( I! g) N6 N
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};$ ]3 X$ h0 a( s
int i=0,j=0,k=1,a=0;
& {2 n9 u; p; F2 F  j( qsbit beep=P2^1;/ Q9 Q% v6 ^& ]/ ~0 i' u
sbit P35=P3^5;7 h  Z% D8 V+ V% x$ _4 H$ B) `/ X
sbit P36=P3^6;
1 X3 b; I1 \( e- A, W6 |sbit P37=P3^7;
! X+ A5 P1 y9 i% p9 F* w+ X$ [4 r6 Ovoid delay(unsigned int aa)
1 j6 n8 Y# Z. U  P0 N1 d% X{unsigned int jj;" G+ q) {# X0 j
for(;aa>0;aa--)" y# r. P1 X/ x3 M, I  c' z8 Z
for(jj=0;jj<60;jj++)
3 [; y9 I9 B7 X, t2 c{;}}8 s/ l- i/ K" y' m8 N& i3 ^9 o
void main(void)$ l9 r2 S- ~% s# k  Y) Z
{7 y6 Z3 \1 Q: W2 S
EA=1;- m% Z8 q5 n5 \+ o, o
ET0=1;- V/ ?+ h4 p# t4 |
TMOD=0x01;- W& y8 |. f5 C
TH0=0xff;
. |$ D2 r) s3 h7 L0 yTL0=0xff;  U3 Y  ?4 p' |
TR0=1;
! ?( d2 }+ Q8 A# t' \  wwhile(1)- S9 o" h+ U7 x
{
* r# \3 L+ Z4 l- e% e; P }  }. {# z5 h) @/ B, I; a3 S

8 n. {' e+ L6 B* Fvoid timer0() interrupt 1
1 V! N" }+ Y, d{if(i<1&&j<1&&k<1)
0 n: N* f, g4 w) d7 C3 G. F9 B{P37=0;
- Q2 N8 Z& b+ {, P1 H" vP0=led[0];
( V) H, t8 b$ M- ^beep=0;                                 ! t# L+ g. @! F/ m5 Z  n
}3 [2 }4 P& u, N9 ?2 l
else  
% ^2 Z( r; K% T4 O6 E{8 M8 w$ Y# A- x3 u* l' [5 m6 l
P37=0;
4 c$ A5 G* I9 o. ^: tP0=led;. D" W7 t9 D/ a9 E0 w  n) M! N) T
delay(5);
' y# i6 g) Y( g* @# Y' qP37=1;" W, ^5 {) N1 O/ e; z
} 7 I5 |, b- X' t
if(j<1&&k<1)2 x7 |7 y, b3 d+ g# w# Y
P36=1;
3 _- |3 p5 @- Q! Velse
. b" v3 `% _6 F) C2 _6 h{
  b/ V6 Q7 H: f$ U+ gP36=0;
% V; S& l. V6 G3 `# xP0=led[j];% J- i1 G" [5 I( l% ~5 v6 S# u
delay(5);
0 q  M: }6 v, i* n; E2 dP36=1; 9 H7 @" c' g! n6 j7 e5 s0 A
}# t5 p# j' M' s2 R; M$ X( ^
if(k<1)
# n: H2 g4 r0 s# h- JP35=1;
7 t# ]4 z7 y$ Y$ s; z. uelse
* J: |5 k, p- `) f- E; |; t+ O! n{P35=0;( e! A# ^/ C/ Y
P0=led[k];
% k" j" i/ @  r1 r1 Edelay(5);  
" e+ s- u  Y) ~! x% kP35=1;
( |) q; {( D6 d' e- i}a++;
% E5 q' S( x( Q' s- y) E; J' F' uif(a%20==0)& _/ u% k* v- L* Q$ n+ P+ D
{
$ B) d9 I, U) q6 `3 i) zi--;. w, i% |0 q$ j" n( l
if(i<0). p# I# n* \5 [2 I! Y* x
{i=9;
/ E+ X/ n% i$ f# yj--;}# y; M& s1 U) U" m- I
if(j<0)                     
7 i* u  {* g+ g{j=9;4 s% e; e; a. V- {+ J; e
k--;}6 H! _7 k& N7 W+ I( n, h& L4 y
TH0=0xB1;; u. k% }5 T* h; f
TL0=0xE0;1 d4 N, H$ I, }6 e
}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!
& w9 c4 f4 ^0 {/ q7 e2 _4 e3 C. a$ w( a1 ]! z" t) k
你的延时子程序中的延时太长了,所以闪烁。( u( P* s; M8 `0 Y9 X: H
.( G/ K5 l" v. g* T5 X5 B# ]8 G' j
syw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!  ~* u5 P$ E4 `2 Y! t+ G- L7 l
.0 j0 y' Y. c1 ^( n2 Q
你用一下我给的延时看看还闪烁不?!9 a, U  {) E! ~% b  X& Y
.9 P/ Y1 C! O! K- \; v: O9 [& }
syw  091205---05.111 l4 d- s" A, |) ?, ~

: p! I# r4 G" ]1 t, G2 |% H: M7 T0 E3 K$ O% k# d" B, F
+ A- N/ g: e2 \9 A  F
: s9 E- |& r5 {+ G% M9 T% V
        P0=xsjs[xsjs1];
7 N# A+ E' T& W; }         P1=xsws[8];
8 d, |# J* i) |! t! ^1 ?2 {        delay(10);# K" v4 F  A' l/ }2 {) I7 R
//****************************
# k" f4 w* L  Q: `; k% y5 E0 o" ]    void delay(int x)
6 p2 ?( w8 r( i, Q    {2 F" w' j7 |) b$ U
      int  y, z;
2 Z0 X/ X, x" l, f" v8 D) M        for(y=0;y<x;y++)
! l* V  X6 e/ l0 x        for(z=0;z<2;z++);% B! k+ Q# c$ l* q8 E; T4 _
     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
/ b+ @0 ?  ^+ q. `* k! K& ?#include <AT89X51.H>
! g' k4 B9 j- w- {% d6 Y+ tunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
, Y& \; i* d* C+ `5 s5 \& Wint i=0,j=0,k=1,a=0,js;9 m5 `) v" d3 ?( |
sbit beep=P2^1;
* y7 R. x" l, \, I# f$ w5 `sbit P35=P3^5;+ X$ `9 f3 h+ E6 `# s
sbit P36=P3^6;  \3 W9 Q$ K2 Y7 v" J" r, x5 M
sbit P37=P3^7;
" G  Y% @3 z" K% Fvoid delay(int aa)
3 b, V" H4 T' A. J1 }2 Y{int y,z;/ o9 o6 q# C' C: F# ^0 E0 z
for(y=0;y<aa;y++): O/ ~* {7 P; l3 I
for(z=0;z<60;z++);
* {( y2 a3 @4 u- ^3 p* A/ g' O}' A/ K( B3 ^, V7 n- i

; j4 ~$ }* S1 Hvoid main(void)
4 X1 p* G# g, z  U- k8 U# u{$ m) N: F3 u( n$ m! Y6 S8 [
EA=1;6 e2 l  {. v, I1 I) z$ W+ f
ET0=1;+ g. M& d6 i$ w4 m4 T
TMOD=0x01;
# W" d6 X* R1 Q' {% ETH0=0xff;
) G" X& A2 G: W% ^. _5 cTL0=0xff;
9 u( {- Y, i& A9 eTR0=1;
# N" ]( O7 {* X# [while(1)1 v6 ]  e7 X4 B' @( X) t7 K
{
; M& O$ V5 R* a# g& c% d% X* x/ |" r" G& P& Jfor(i=100;i>=0;i--)
( w) @% Z: C6 G3 h{6 s3 r9 v; D% {5 R
js=i;
- ?, X7 m1 B5 E$ ? delay(500); }
1 G; ?9 ~% {$ Z+ [' U# H# @# e }         }
  i6 V( ~% c! }7 `! T  q' L) [$ p$ c2 u) c; I

& s( c7 c0 o6 \! g1 n2 |void timer0() interrupt 1
& U- }: C. Q; o  x- z5 X. x5 ~{* Q$ M6 [% h7 r; O# \5 ^" i
  P0=led[js/100];' S# D, H* F- G
P35=0;# t4 ~" U' n5 _( H" X& W
  delay(5);- Z: S$ c3 [" \5 m: r
          P35=1;/ M4 D( T- a, ]+ R' i1 |
  P0=led[(js-(js/100)*100)/10];! y; X3 X% s/ n4 K- c
P36=0;5 S  B8 W% r% h/ R7 I
  delay(5);
3 ^3 Q7 Y: w9 a. N$ Z" Q5 z P36=1;
3 R& l  y% _  `0 U P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
* I& ?/ J9 X; E) rP37=0;
* H9 b' Y# A% @ delay(5);6 v( L% K. e4 Q# P
  P37=1;5 O. n' t& X5 K) e
! A# V- T! n9 S: G+ {/ G, v; J8 [
TH0=0xB1;
4 W% I  S2 d! Q+ RTL0=0xE0;
5 z+ M' ~5 M* D: ^9 N$ n- r7 f/ p$ g. ]9 I. x  D' |: h( I6 e; a
}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-7-13 16:01 , Processed in 0.071072 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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