16576|7

64

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

基础的LED灯和数码管同时点亮的问题 [复制链接]

如题,我在练习的时候遇到了一个可能比较基本的问题:不通过定时器,只写一个delay函数来实现LED灯的闪烁和数码管的点亮。

我自己用这种方式写的(8个LED闪烁,点亮2个数码管),无法实现上述功能。LED能闪烁,但是两位数码管中的第一位不能稳定显示,第一位数码管是在闪烁,和LED灯的闪烁频率差不多一致。如果只点亮一个数码管,在下面的程序中删掉一个点亮数码管的程序后,剩下的1个数码管能够正常点亮(不闪烁),如果增加点亮数码管的数量至6个,前5个数码管是闪烁着显示的,频率与LED灯差不多,最后一个数码管正常显示。

我想问问产生这种现象的原因是什么,还有如何只用一个delay函数,不用定时器,来完成这样的功能。

 

 #include<reg52.h>

sbit dula=P2^6;

sbit wela=P2^7;

 

void delay(unsigned int z) //延时程序

{ unsigned int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--); }

 

 void main()

{

P1=0x00;

while(1)

 {

dula=1;

P0=0x3f;

dula=0;

P0=0xff;       //点亮第一个数码管,显示0

wela=1;

P0=0xfe;

 wela=0;

delay(1);

 

dula=1;

P0=0x3f;

 dula=0;

P0=0xff;

wela=1;             //点亮第二个数码管,显示0

P0=0xfd;

wela=0;

delay(1);

 

delay(100);       //LED灯闪烁

P1=~P1;

 }

 }

用的是共阴极数码管,郭天祥教程的板子。我自己分析了这个程序,按理说应该两个数码管都是闪烁的状态,但是板子上的结果是第一个闪烁,第二个稳定显示.....

[ 本帖最后由 qrswll 于 2012-4-8 16:40 编辑 ]
此帖出自51单片机论坛

最新回复

去掉delay(100),改为循环50次P1取反,应该就能实现你想要的结果  详情 回复 发表于 2012-4-9 21:36
点赞 关注
 

回复
举报

3404

帖子

6

TA的资源

裸片初长成(初级)

沙发
 
用delay肯定不合适,因为你把时间都浪费到了delay里面,数码管显示当然就不能稳定了,闪烁和稳定是个矛盾,要CPU同时完成用delay不好吧。当然这样的要求是可以满足的,那就是你一直跑着显示的函数,然后用一个计数标志计数,每显示多少遍之后把LED取反就可以了!
此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
楼上说的极是,资源全部浪费了。另外你一旦使用中断delay的时间就不好控制了。
此帖出自51单片机论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(高级)

4
 

原帖由 jishuaihu 于 2012-4-8 19:41 发表 用delay肯定不合适,因为你把时间都浪费到了delay里面,数码管显示当然就不能稳定了,闪烁和稳定是个矛盾,要CPU同时完成用delay不好吧。当然这样的要求是可以满足的,那就是你一直跑着显示的函数,然后用一个计数标 ...
斑竹前辈大好人=。=给我提示了一个很好的思路,明天我就去试验一下。

还有,我的一个疑问是,在我的问题中,为什么数码管总有一位是稳定的呢?我理解自己的程序,好像delay(100)干扰到每个数码管的显示了,但是总会有一位显示是稳定的(比如像点亮4个数码管,这样的程序前3个数码管是闪烁的,但是最后一个数码管是稳定显示的)。

此帖出自51单片机论坛
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

5
 
数码管是扫描显示,第一个数码管的显示时间占1/(1+1+100);接近0

而第二个数码管的显示时间占(1+100)/(1+1+100),接近1

如果你把100改为10的话,可能不会闪烁,不过第二个数码管的亮度肯定大于第一个数码管的亮度

改的话,既然你可以看清楚闪烁,改delay(1)为delay(50),而delay(100)去掉就可以了,

但总体来说,程序不怎么好
此帖出自51单片机论坛
 
 
 

回复

202

帖子

0

TA的资源

一粒金砂(中级)

6
 
延时的问题吧!
此帖出自51单片机论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(高级)

7
 

回复 楼主 qrswll 的帖子

去掉delay(100),改为循环50次P1取反,应该就能实现你想要的结果
此帖出自51单片机论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(高级)

8
 
非常感谢楼上几位前辈的指点。经过一个上午的努力,我把这个问题和相关的许多问题都解决啦 谢谢各位
去吃午饭了~
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表