机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 3157|回复: 4
打印 上一主题 下一主题

单片机新手,请教问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-12-3 19:57:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前不久用c语言写了一个数码管动态显示倒计时程序。倒计时倒是没问题,可无论我怎么调延时时间,他都闪烁的厉害,请问高手怎么处理。是扫描频率太低,还是点亮后延时不够。如果是以上的原因,那么扫描频率和动态延时各要多少才能看起来不闪。4 b5 a7 g! X6 x+ }8 c. \7 Q% x
程序如下:9 s6 L  d6 n4 J
#include <AT89X51.H>
+ S/ p0 @. H) o; a. g$ J! \# k0 c) Hunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- ~& C( _' ^& G$ Cint i=0,j=0,k=1,a=0;' c/ X+ K( I; |4 y0 U8 M' z
sbit beep=P2^1;$ T: m" B+ i6 I+ g+ C4 x- D
sbit P35=P3^5;5 x" ~( N# l( Y: a- W: e
sbit P36=P3^6;" X6 C6 Y7 A& @  Y/ D5 t( c
sbit P37=P3^7;
; N6 A' w6 k; ?7 D8 V3 N! ?void delay(unsigned int aa)
5 _# E5 x- j6 ]2 K, r2 E{unsigned int jj;
- h& M7 O4 k* G: Afor(;aa>0;aa--)
# j+ x& b) c+ Q, T8 K0 x/ g4 zfor(jj=0;jj<60;jj++)* r3 F; B7 ~4 a( ^: i0 f+ t3 i
{;}}
% u* ]8 H8 c# g1 Z5 Evoid main(void)
* m. f# m3 O% C+ ?; G7 z{
. k, n- ?4 Q  S: WEA=1;
% c0 s! L& `* o0 B5 oET0=1;8 w: b3 m  p' G' w& w
TMOD=0x01;7 i( ~! F! ~1 S. E. M, X7 e
TH0=0xff;
3 v" U, `- _" n0 W7 OTL0=0xff;
$ O5 `# ~, _9 _* rTR0=1;
. O) k) j" }0 m1 k# z& Pwhile(1)6 L# n+ T" ]# e/ \
{
% Q! b! W4 l/ L& {0 j }  }$ s  a$ E+ r1 B' s
/ r- h+ M. E& Z2 |' \
void timer0() interrupt 1
: ?, W+ e" ~2 c" M2 U{if(i<1&&j<1&&k<1)0 n% O0 [2 F# a0 N) ?% N9 B
{P37=0;6 E6 O# i" Q1 Y6 u  Y* v2 P
P0=led[0];
! R, c2 S6 G% F5 v7 X; Gbeep=0;                                   ]& q2 ^) d* F8 O' ~/ Y  f+ z
}
* j' X4 z/ o4 c! t6 a: G3 j" eelse  
! j9 O4 O* d. v* o! E! U{1 |9 G; `2 F4 ^! A& `5 m, U4 c
P37=0;
7 ~+ p. }- Y; a2 c  q# oP0=led;
! O$ Q$ z) a2 o; k( V- Hdelay(5);
+ _6 [! N( h* w$ kP37=1;
$ E1 Y8 l, z1 [2 E}
  b# H% z0 Q4 L7 Eif(j<1&&k<1)
" {9 F# c* h* Q1 q) cP36=1;
. X6 i+ ^' u) a8 N9 @else$ P8 F- G( W/ L; Y. q4 J
{
# \+ A9 b  D7 ^3 iP36=0;
9 e: v, ^& b) Q7 _0 N4 y0 `& rP0=led[j];% ]- S- t; M, v
delay(5); 7 B( p6 o' f( E* u
P36=1;
5 R6 _' {! w$ q: S& ~5 q1 {}
0 |+ |8 c: y; @6 q6 M. Y7 I* Z2 Oif(k<1)
. a9 ~: n5 n4 ~P35=1;, |* m- C/ g, u0 n! _8 e  ~  i
else6 {& X- V3 u3 S. ?
{P35=0;1 k* C1 n2 M) [
P0=led[k];
* t7 c& x, ~+ q: ndelay(5);  
2 I+ ~- d9 z- l( x- H; WP35=1;
- q( x( _3 h; P}a++;+ Y6 v- X" D% w5 o
if(a%20==0)5 x9 b& R: r' A5 n" K
{ % s6 ~  T) o, z1 {7 ~4 u
i--;7 H1 @- n3 ]* {
if(i<0)) ^8 W( M  n' _# p
{i=9;
6 W; Z3 f: `! B3 t+ A! n: l" Bj--;}
2 W5 v* K  f* \, A2 k; a7 qif(j<0)                     
3 M$ M$ B8 E' T+ d9 k{j=9;# T7 r0 }4 O" X
k--;}0 [- G1 U" P6 A2 O, u
TH0=0xB1;
, S. s7 o$ m( hTL0=0xE0;  W0 A" ?3 \/ g) o  V3 }3 U
}}
回复

使用道具 举报

2#
发表于 2009-12-4 08:22:36 | 只看该作者
何其 网友好!
9 k9 i6 `. c+ h0 o1 S) H5 j( S
) G  z, ?" \7 p2 `/ X你的延时子程序中的延时太长了,所以闪烁。
* t+ B: d- s% z$ W3 J.: M: ]8 t+ V* e& v; i" S
syw  091204---08.22
回复 支持 反对

使用道具 举报

3#
 楼主| 发表于 2009-12-4 13:06:37 | 只看该作者
不是吧,开门大侠,循环60次,一毫秒都不到呀。
回复 支持 反对

使用道具 举报

4#
发表于 2009-12-5 05:11:29 | 只看该作者
何其 网友好!" [5 @% o# c) v) e( z
.
) p$ F8 s9 K& v; E你用一下我给的延时看看还闪烁不?!
0 ~# A* n* q( F9 n9 n; B.) J) i5 W& g( i& N
syw  091205---05.11
4 K, |+ [2 F6 q9 L/ _( W, u0 c: j2 F  a

4 |0 k6 h* H3 _  k2 D% t* ]) G) Z7 h' M4 c; o: j4 `; s

& c" `: ~- k! M7 [        P0=xsjs[xsjs1];
& ^. T3 P( K% }) Y         P1=xsws[8];
; j7 Q4 z5 B5 a/ R  |5 q        delay(10);
0 [/ |/ @& I; R- g% L! p' X9 g//****************************
: J1 L  o* I% O* ~0 e8 _; L    void delay(int x)
3 k  x! T0 y  j    {/ r! b( w; a- b1 H* L
      int  y, z;
# G4 v" v$ y+ e8 L# z/ I        for(y=0;y<x;y++)6 z* h- r1 @. V4 Y; l' N6 I. E
        for(z=0;z<2;z++);
* z* k, R) G7 R/ a" Q     }
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2009-12-5 22:29:30 | 只看该作者
还是闪,是不是这种程序里不适合if语句呀,我用除余数的方法如下程序就好了。$ B. R5 D, x0 |0 h0 X& ]
#include <AT89X51.H>
5 Y! ~  Z% h% n6 m# Kunsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
; d& R1 o; ^5 u8 @, ~5 H% F7 j' dint i=0,j=0,k=1,a=0,js;( j: ^( Y7 D% ^5 P
sbit beep=P2^1;
2 V( [6 ^; S0 P0 isbit P35=P3^5;
5 u* T2 B- j. H6 a# `5 d1 @sbit P36=P3^6;
0 d3 x/ s8 z+ H" tsbit P37=P3^7;3 P+ L5 e3 B5 ]; W
void delay(int aa)
3 O5 ^9 y" b; ]9 O( A& k8 [{int y,z;& Y5 d( M" c2 e7 y& h2 @8 q
for(y=0;y<aa;y++)9 v8 \6 e3 f. A+ ]6 D6 j7 l
for(z=0;z<60;z++);
9 B- n3 h4 d* q' L9 E2 [}% {# m, N% K1 B& o* n

) o  B2 C3 y& g) s) c) f3 dvoid main(void)
! }! z* o, @4 q{2 `  u6 w; ^  j% e4 I5 a0 G% [5 y* A9 p
EA=1;+ _/ ~+ P0 U: {: e6 E
ET0=1;
4 x+ D1 D# a( h# `1 j4 j% aTMOD=0x01;1 M( v% N3 G& s3 p/ e9 P
TH0=0xff;
; _3 i1 ^8 a, P  A8 Y* \8 LTL0=0xff;
5 N3 w$ B& K4 [& G& }, bTR0=1;1 E" C: U9 z9 k. O, o. Q
while(1)' t, @4 ]! r2 N% u8 o
{
, Q- M$ Z' t8 ~for(i=100;i>=0;i--)8 z, y% Z$ d6 C* M
{
4 n3 f& l) x" J1 Xjs=i;
# d$ A8 J3 P9 @! y: G5 L1 N delay(500); }
0 \, Z6 j8 _9 w; [8 I' ?- M }         }
( V5 @+ @$ x- g8 v- z# t  [8 }0 Y# G, R* _, V8 ?2 k7 E  I

! L2 }; [# o% a# V2 h7 ~7 zvoid timer0() interrupt 1
% d  u/ }8 |9 F5 j- D0 @{4 b& n/ f6 a/ [( v- z1 L% \4 U
  P0=led[js/100];
) T* v+ M  e, C2 I' _P35=0;
5 n% k5 i; P2 \  delay(5);
! C" P9 Q9 }% u9 C3 z6 ?. e2 T          P35=1;
* x- \+ |9 T- O6 t; k) ~  P0=led[(js-(js/100)*100)/10];
) G/ _7 t$ ~* x7 |4 [! O. SP36=0;
( |7 N3 F/ C8 Y& P' q  delay(5);
7 P: s/ i* L, S9 c$ o2 k P36=1;
7 C# v% `* |' z7 c+ i P0=led[(js-(js/100)*100)-((js-(js/100)*100)/10)*10];) W. E! Z7 k. G2 K2 n2 E  F& @* x! x
P37=0;9 D5 \0 S( e+ _* H
delay(5);
5 ^+ P# B) c  U* u+ D6 `( S0 z  n  P37=1;
' t% w* C0 E1 w8 L1 i- h6 I: U/ _1 z; W& w
TH0=0xB1;
2 S$ y5 ~& Y* \. j/ c: nTL0=0xE0;
8 {4 h$ s" h" p  @/ \
' w: N2 v$ {% o- ]- N% H, G}
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2024-11-11 12:12 , Processed in 0.053806 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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