找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3435|回复: 4

单片机新手,请教问题

[复制链接]
发表于 2009-12-3 19:57:38 | 显示全部楼层 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。
$ y, R; D4 G5 r( o) H2 }程序如下:
6 M1 e* A- f* |0 e#include <AT89X51.H>
" P  c6 I% f; M8 y& }unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};, p: Y: {% m9 o: Q) @
int i=0,j=0,k=1,a=0;( v! H; Z) R0 `1 F/ b% i7 ~# y
sbit beep=P2^1;
4 z& {. B) c0 Wsbit P35=P3^5;
, g& k; u; N5 ?3 tsbit P36=P3^6;
( _. D  c! a& K6 h8 s* Msbit P37=P3^7;6 ?& H" ^& i) p1 H# H
void delay(unsigned int aa)
7 }0 \" k. _) E1 r/ y{unsigned int jj;+ P8 j' u$ S0 X# S
for(;aa>0;aa--)
0 y- s  r: H+ x7 |/ y9 tfor(jj=0;jj<60;jj++)
+ Z6 v& e2 x! z, R  Z% ~( o3 Y{;}}/ q) F% N; @- t9 A$ D
void main(void)/ Y4 j" x8 l  l3 I
{$ ~9 V/ Y' X8 f7 T4 M
EA=1;
( o7 E' u3 V( ?' i4 c' bET0=1;- u( ^# D4 O7 D) W8 C: X5 h2 G* [4 F
TMOD=0x01;
+ ?- z( D& ~2 |1 X) NTH0=0xff;) ?8 Q( x3 p. A, Q/ r4 O
TL0=0xff;) c; w6 J! o% c
TR0=1;
# v. p" v  i& A, P" j# G% l7 |while(1)5 W/ {: J0 l* w1 b2 L/ U  Z0 y- a5 ?
{8 ~! y3 G0 [  z* ^
}  }" m, |. c5 C; h  D  n5 a

- I- w  {5 @+ evoid timer0() interrupt 1
! {7 W4 h% f% n* @{if(i<1&&j<1&&k<1)
# F" H7 B: ?. b9 ^7 x5 V9 x{P37=0;
2 Y) ]; u( a9 o7 F$ c" \P0=led[0];
4 c6 s& B" c8 z9 J4 o' ~! Tbeep=0;                                 
& e4 f7 K- n: d$ z* R2 m3 z}& Y0 J" ], W; P: }' b
else  
! S' ]9 O, b3 r: X. {1 g{8 e6 u* W% f* j3 _9 n& R5 H' s! u
P37=0;
! K3 i6 U1 B- ?8 m% S. p+ Y. sP0=led;' `4 o+ U# b; }" A7 D3 @( z; n! O
delay(5);
/ P: Q, o0 O: V; V5 E- v- hP37=1;: C; E% ^$ ~2 D" P
}
+ x4 w# v- `. Y7 h$ l+ Oif(j<1&&k<1)1 C  ]7 N4 V8 r* k+ g7 T
P36=1;
: g2 d) ^1 q& J' J! aelse
( @7 n% Q# Z( {9 `, J{
0 F7 j7 b" D! iP36=0;
" ^; J/ G$ ]4 S6 S9 {, `8 pP0=led[j];
7 x* m1 b# f4 s7 pdelay(5);
5 k5 O. p' c6 I& T7 X8 R' ]P36=1;
  \; A1 U& _# z8 h}3 |2 O& r1 x9 a" p' s2 Q# a% p7 D
if(k<1)
  ?: S. d5 ^. ^6 u* p7 b% cP35=1;
) M0 ?/ T: @0 L& a$ g: telse- z) [2 m( Z4 Y0 b; R
{P35=0;2 p3 T- n1 o, k/ P4 ~0 C7 `: W
P0=led[k];
$ Z1 ?7 c& o0 Gdelay(5);  " r" P) e5 ~. C. l2 s- Q
P35=1;! ~1 g9 k% A) w+ `+ z
}a++;
5 a/ Z1 v: d: }4 S; A5 @if(a%20==0)
8 h( s* b: d# d{
& ?2 C, W) J+ ~1 \3 g7 li--;" ]; d. d+ q; q. v
if(i<0)1 V8 t/ d) b( F/ J
{i=9;! Z9 J& i( X* l% f) H& U( U
j--;}/ j$ K! f# \- X8 u8 P
if(j<0)                     " U' j4 M6 b" s
{j=9;! M, p2 r5 s* h6 O0 o
k--;}
/ f% w+ _1 @" b8 n; dTH0=0xB1;- ^9 A0 M# n: H8 H! f4 U+ E
TL0=0xE0;
! Q6 T! ?: V' w/ o8 f}}
回复

使用道具 举报

发表于 2009-12-4 08:22:36 | 显示全部楼层
何其 网友好!2 j- F8 P+ _! h, W. K
# m5 ^# u5 |( L! |
你的延时子程序中的延时太长了,所以闪烁。
1 v. q) p' i' C( G./ y  a2 V2 X: h( S6 X1 @9 u1 A
syw  091204---08.22
 楼主| 发表于 2009-12-4 13:06:37 | 显示全部楼层
不是吧,开门大侠,循环60次,一毫秒都不到呀。
发表于 2009-12-5 05:11:29 | 显示全部楼层
何其 网友好!$ E% D  |  {( ^( `) z- b
.; E' r( M- X9 G) [
你用一下我给的延时看看还闪烁不?!9 \7 k- {. Y: Y1 U' s
.
1 c2 |4 ]; @+ v" d0 Dsyw  091205---05.11
6 c% w  ^9 z/ H' r* R0 y
0 Z! }6 \8 v3 k2 N$ p* k1 g1 j+ _) s# G' M3 A
3 c, H6 i6 D" E7 w8 X  H6 p

* k. H, ^/ y, X  q        P0=xsjs[xsjs1];
+ J2 @  y$ F5 i$ ^1 W- E7 f         P1=xsws[8];1 n, l$ e! A7 Q* k" w
        delay(10);
9 u' h5 J2 l3 M& G//****************************
+ h. t! t+ E' O2 m$ W8 w    void delay(int x)( @2 P! x2 \2 g4 {
    {
4 |1 u) K! A2 v5 U      int  y, z;6 h$ F9 o9 p5 h( P
        for(y=0;y<x;y++)
" ~6 f: t9 K- `        for(z=0;z<2;z++);9 G* y' b" D3 B1 L
     }
 楼主| 发表于 2009-12-5 22:29:30 | 显示全部楼层
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。
. S- L9 p1 ~' t: M2 V7 Z8 h#include <AT89X51.H>/ H7 t& b! r8 F/ P* i( T
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  J, U% C+ U+ K2 N2 A! Gint i=0,j=0,k=1,a=0,js;+ s& e: [8 o& e: Z, J
sbit beep=P2^1;4 w# M, ^: \; i/ _5 E6 z0 W" q
sbit P35=P3^5;" k7 K6 x2 R( q
sbit P36=P3^6;" v( N! H5 {+ D2 g2 L% G( `/ }
sbit P37=P3^7;8 n0 i. X* d$ n
void delay(int aa)
% M( M- C. S. o; W* J: r+ n{int y,z;  H; \- t" ]8 n; P% p
for(y=0;y<aa;y++)
( G3 H" K+ Z4 i  Jfor(z=0;z<60;z++);2 d5 I- b! c7 Z8 P: |/ d) I/ O
}- i' |5 l' I) f1 v% u
9 E! w7 F6 F+ }
void main(void)* W0 l9 D; q; G' G
{
6 e! d7 ~9 M' IEA=1;
( a( ]) B9 C3 t1 v5 o" o, V# @- `ET0=1;
) t# ?5 ~% r& L# sTMOD=0x01;
4 P! `$ K% o+ h! oTH0=0xff;
9 f) m/ {: T) C5 vTL0=0xff;( _4 h; S) r1 q  f% Q5 i0 D3 {0 M
TR0=1;
. I( S  D5 I* Z% X( h* p, ?while(1)
% q* L8 j5 h; R4 ~0 C& ?# V; k{$ b) c" _/ S  M8 l% W
for(i=100;i>=0;i--)
: k* N1 K3 r4 X{
# g0 k' x) A% B- X) Ijs=i;
, {7 e3 e1 t8 G2 P delay(500); }
: q" K6 `) {/ d$ o5 i }         }
& Y, x' W- s1 {( F
) ^5 Y( `9 t+ d5 i( I- U4 U. s) D2 h5 t) O2 v
void timer0() interrupt 11 X+ d$ M# x  T  e* X0 {# `
{. D* }0 T, z$ D5 [; q/ O& v) {# N; [: X& }
  P0=led[js/100];3 u, J5 a! y* G6 X- I
P35=0;
$ Q; F3 D5 D- K6 @) y  delay(5);
/ E" X. C# b( o2 @2 h          P35=1;
5 V3 i/ E5 @) I, z+ o2 H  P0=led[(js-(js/100)*100)/10];
6 i' N" ]7 g9 R- @$ c) cP36=0;
* Z* f! P; {, R) q/ z, h3 h  delay(5);
% I( a: G- {+ L P36=1;
' `2 L# n, B0 `: z; V! P P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];
' ~+ O; l  v( T2 J, D3 c4 l; F) cP37=0;
& s" Z6 b& L* g" D$ o% N6 R8 Y delay(5);, f2 e; X( S+ k6 e1 ?; w0 Z4 T
  P37=1;
4 x/ ]; F+ R% [4 X) ]; `0 S
; I. f9 P0 h+ ETH0=0xB1;
0 j! t. M, o# ^5 V7 sTL0=0xE0;' k1 s; J. }) M+ x

; b% K0 r6 p6 I  t0 H}
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-8-15 04:58 , Processed in 0.064625 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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