机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3308|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。5 Q( N8 g) }% s% b' g) v
程序如下:
# W9 ^( v( V1 U. W" u' p#include <AT89X51.H>* o. N, R9 {/ M2 e
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};: w1 Y4 k* ]6 g  f- |6 f; W6 g
int i=0,j=0,k=1,a=0;& l( h3 r: _$ b( Z% u
sbit beep=P2^1;
7 e8 D% k1 O$ J* n: b0 Csbit P35=P3^5;2 w1 Q6 p: s2 B& q* f8 e* a: t
sbit P36=P3^6;
5 M% b/ ~5 @& ?( y' osbit P37=P3^7;* X5 \, I* ~  m5 V
void delay(unsigned int aa)' O0 e' w: h+ U( Y. w8 E
{unsigned int jj;
/ ]  {# G$ P+ U% `4 j! C2 ~for(;aa>0;aa--)
" D5 x; L# X: H! g( t" g5 j1 ?for(jj=0;jj<60;jj++)
% H* k4 S0 U2 }. ?! P  g0 |0 |& y{;}}
) m5 W5 ^$ Q; e( Evoid main(void)& K1 V+ u. G7 _7 u8 U- [8 t) i
{1 n4 x+ L; w; y9 ~, j
EA=1;
" ~+ Y* G2 Q8 u) B4 B% B; h7 jET0=1;0 S8 }) y! H# @" I3 N7 \
TMOD=0x01;
9 H) E, W- R: M5 KTH0=0xff;, _/ f5 w! G6 h+ a* i4 C4 R
TL0=0xff;" n$ D' @9 W0 f5 r, ?# N' D
TR0=1;
) V& x8 v6 c$ M8 e7 }  iwhile(1)
. i5 r( S: O4 N{
$ o7 ]6 C1 I' H3 Q4 t6 T }  }
5 J4 A" f5 x6 b6 o2 T
1 ]8 V( B3 X! U. Cvoid timer0() interrupt 1
  `- I, T. m1 n( L+ e{if(i<1&&j<1&&k<1)8 }* I# G/ w7 i" ]/ m) l
{P37=0;$ |4 L4 ~" b* i/ b3 L  W
P0=led[0];. `# o; y* D3 a! |
beep=0;                                 8 k. L% {/ E( s. x9 W' g4 T
}
- m: y2 I3 R3 i) H$ a& Q7 g& [else  
, i7 Q4 ~# O( n9 U# {/ @{
1 |5 F! b7 s1 e6 l3 Y, z: fP37=0;6 y$ `# W* h6 Y% n) X! S9 i  ]
P0=led;
* H7 S5 T) @) i+ y' U/ \delay(5); 7 p% L5 s1 F- P% l( |# @
P37=1;$ D6 j& t: z+ W; z! Y( C: r
}
6 ]7 [2 B+ l9 r- yif(j<1&&k<1)4 ]7 P% v$ P8 y+ A
P36=1;
, o& G0 _9 ]& delse
/ M0 O1 v! s0 H) o1 n{
3 n: V; ?, ?9 `2 A) HP36=0;
! E6 Q1 R$ t2 P6 k. TP0=led[j];7 ^6 `0 D8 U) _1 h4 l' n
delay(5);
# n# ]+ b* A1 D0 i0 _3 J1 {P36=1;
% ]4 n8 Y% i) M. n; [# O}1 q- ]& m* O! v/ G# G) q
if(k<1)1 j3 w/ o8 W: V6 Z. V
P35=1;) l3 `$ L4 s0 @  S
else( J  G( J- `, w' P* Z8 b0 Y
{P35=0;
& w8 f/ z9 V- |9 pP0=led[k];- j, ~& t/ Y& t, T% K+ K
delay(5);  
2 h$ S; n/ R# n# D: q1 HP35=1;/ W: q2 c- m5 x' ?: B, g9 z" Q
}a++;
6 i! H6 p& h6 ]: O0 t+ O) zif(a%20==0)
- u' i/ n: T' ^# }( ?{ 2 s! E) ^: s: d, e* o4 ?
i--;9 H% i* m; {" q# N8 }
if(i<0)
1 u  f, \5 O5 p/ ~9 _9 ]6 G- E; c0 A. o( a{i=9;( {8 e  ?/ E; S2 l
j--;}3 N5 Y8 ]7 L4 L  t0 l, L$ r
if(j<0)                     6 t0 {+ E: u; d* w
{j=9;
6 @% V" H3 }- Z# K0 o7 rk--;}
' e' d* o( M+ v; Z  I5 x8 n* ?  P( GTH0=0xB1;0 g" o; |% D! p
TL0=0xE0;* J, k/ Y5 i4 A  V  t
}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!
0 f6 e0 ?# J$ w/ \2 ~- `) n* a2 O" k
你的延时子程序中的延时太长了,所以闪烁。& [) O4 |1 r9 }, O  l  z
.2 e# j7 \" d: v+ t
syw  091204---08.22
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!: \: L! h3 I, N3 P0 N
.: w- K! Z* F- N) [* k! U
你用一下我给的延时看看还闪烁不?!  [, ~* F) @# T( d6 m' h3 r
.
( \/ B) l2 V$ B; w. Ssyw  091205---05.110 {- y( X& K4 p6 S  f

3 d( S& L/ N, T& e1 Z
7 C+ T: \* W% m! a7 O; T
7 y8 G/ |6 i2 n7 b8 i( \! p/ H
! K  ^+ ]' _9 U9 E) L8 D3 E        P0=xsjs[xsjs1];! J4 }( T, B6 o- d$ U8 F6 T& l$ W
         P1=xsws[8];% n; }/ P) n: W* x6 r3 o4 ]9 d2 o
        delay(10);' [# i- A$ b* S4 Q  F7 _
//****************************
/ I! X+ n; i/ Q' _4 `    void delay(int x)9 e/ j. t+ E# y6 d( l9 p2 e* W
    {7 c) J$ W" m' K" z5 E9 t, u5 S7 m
      int  y, z;% d' {6 V  X+ o. l1 p, `
        for(y=0;y<x;y++)
  W# P0 ~9 O4 ~/ {* Q        for(z=0;z<2;z++);2 @$ P5 ]2 y/ M% v% K
     }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。' u4 P8 ?) r2 a" o) s  b3 b
#include <AT89X51.H>" T* r2 s; f' w9 u
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
9 k7 d! r' E% A6 ?' h9 |3 hint i=0,j=0,k=1,a=0,js;
4 h, {- C3 f! r* J# Ssbit beep=P2^1;
) m  `7 d' F  ~- U( H3 x1 }4 esbit P35=P3^5;% s0 l4 Y# Q" p8 }* @
sbit P36=P3^6;
, s. g. [# N& y$ |sbit P37=P3^7;5 `" z6 v, T  Q# W5 d9 i
void delay(int aa)2 x' S: Q8 c/ V3 M. ?
{int y,z;! x6 K* p# |! `& ^9 j! J! R8 k
for(y=0;y<aa;y++)2 H2 v- q/ j6 h, b- q
for(z=0;z<60;z++);
) q$ E/ y1 y# C* ], F, [  |}
) t1 m7 }; @) n# x2 L$ G2 o! z4 v3 F  t5 t
void main(void)  ^& Z% q+ U& u- y2 d1 R
{6 q  D$ q' p4 ^# y& j0 z
EA=1;
' ?% H3 _# U( Q) l! WET0=1;
7 A3 l. _! a1 STMOD=0x01;4 a5 G' P" {; [) I" ?
TH0=0xff;8 ?; U6 g* {/ J% E6 r; _5 i0 \" ]
TL0=0xff;
3 f/ k) Y, J2 y+ L7 z, v3 j, {TR0=1;
! K6 `1 M. U1 q, T) D" H3 Z- a; e1 Iwhile(1)
$ B" h! c! n& a7 D) R1 r4 k{
& P2 @( c" D5 v$ u/ X" J! P, `: tfor(i=100;i>=0;i--)$ Y( h4 ]) k& q, {3 U* J
{5 }1 T2 a2 k( k# K; A: `; |; J2 l6 v  h
js=i;
1 g0 C7 U- `: n2 n$ F delay(500); } & U8 T9 W  Y; h# K8 T
}         }
, e. Y; J# X+ r. j
2 W8 i  k& o0 f
! {# P9 `( D1 y7 i; o" m# O2 qvoid timer0() interrupt 1
0 u9 K' w0 k, q3 _{  D. x4 p0 b+ g) {& F) B( O# f
  P0=led[js/100];
; @6 `; u" D; Y3 UP35=0;
1 F/ E# J8 S- d  delay(5);% G, H+ N' S+ u, b
          P35=1;
- t9 Y2 l# S* M& ?! _  P0=led[(js-(js/100)*100)/10];0 B: z) ]+ i0 P( }3 P
P36=0;; ~& I8 p& G1 n1 _6 [: W5 o2 u' l
  delay(5);+ I# A9 a3 m: |
P36=1;9 y) x9 e* o. N# |/ [) t
P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];: R4 j8 T7 e/ |0 l' r7 z) q5 |4 H6 ~; a
P37=0;
$ d, X" s! X; \( [- k delay(5);
* L( X, T8 C: a( b4 p$ Z7 q; k  P37=1;0 {$ ]+ Y& ]7 t1 ^# `
4 |* o2 d' y( ]5 b+ J! ~* H
TH0=0xB1;
- |! d- |/ c6 \1 g! NTL0=0xE0;, s, B4 [% c+ s, J: l
' V" I0 \$ \. ~0 |6 ?9 J4 O
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-4 18:43 , Processed in 0.065121 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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