找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2142|回复: 22
收起左侧

关于51单片机 我觉得这个程序的意思应该是亮一阵然后暗,为什么这个循环会有闪烁

  [复制链接]
ID:278709 发表于 2018-1-22 19:49 | 显示全部楼层 |阅读模式
问题:我觉得这个程序的意思应该是亮一阵然后暗,为什么这个循环会有闪烁,这个程序的执行顺序是什么?谢谢。
#include"reg52.h"
sbit led1=P2^0;
unsigned int a;
void main()
{
  a=50000;
led1=0;
while(a--);//问题:这里的循环不是起延长时间的作用吗?使led1一直亮,之后就暗吗?为什么会闪烁
led1=1;
  a=50000;
while(a--);
}

回复

使用道具 举报

ID:261288 发表于 2018-1-22 21:23 | 显示全部楼层
因延时比较短,视觉效果是闪烁的。
回复

使用道具 举报

ID:7485 发表于 2018-1-22 21:31 | 显示全部楼层
led1=0(亮),延时(大约是0.5S),然后led1=1(灭)延时(大约是0.5S),不就是闪烁吗?

你的程序少了一句(红色的行)

void main()

{
while(1)
{
  a=50000;
led1=0;
while(a--);
  a=50000;
while(a--);
}
}
回复

使用道具 举报

ID:278299 发表于 2018-1-22 21:38 | 显示全部楼层
这是用来延时的,也可以用嵌套的for循环,都有延时的作用
回复

使用道具 举报

ID:247467 发表于 2018-1-23 08:43 | 显示全部楼层
修改合适的延迟时间,看看咋样
回复

使用道具 举报

ID:62355 发表于 2018-1-23 09:04 | 显示全部楼层
你这里延时做的不太对,就是上面说,时间太短了,建议用定时器做,闪烁问题不太能理解 应该有while(1)的,我没有看到 但是时间上必须要改动。也可以做一个延时循环 之后调用他。比如delayms(int a)这个函数定义个毫秒级延时,调用它,这样你能知道你延时的时间。再不懂你就模拟调试 将LED 这个IO接口的逻辑和代码一起贴出来。
回复

使用道具 举报

ID:278811 发表于 2018-1-23 09:39 | 显示全部楼层
延时比较短,所以就变成闪烁啦。楼主可以试试把a的值再调整大一些,就可以看到一阵亮一阵灭的效果啦
回复

使用道具 举报

ID:278860 发表于 2018-1-23 11:27 | 显示全部楼层
你的发光二极管的接法是共阴还是共阳的呢?
回复

使用道具 举报

ID:278709 发表于 2018-1-23 11:45 | 显示全部楼层
ahshmj 发表于 2018-1-22 21:31
led1=0(亮),延时(大约是0.5S),然后led1=1(灭)延时(大约是0.5S),不就是闪烁吗?

你的程序少了 ...

很感谢回答,想再问一下为什么不加大循环while(1)也可以闪烁,如果没有while(1)大循环,这个程序为什么会循环啊,这里的while(a--)不是只起延时的作用吗,不会让整个程序再循环啊,怎么会一直闪烁呢
回复

使用道具 举报

ID:278709 发表于 2018-1-23 11:48 | 显示全部楼层
流逝记忆 发表于 2018-1-23 09:04
你这里延时做的不太对,就是上面说,时间太短了,建议用定时器做,闪烁问题不太能理解 应该有while(1)的 ...

非常感谢。由于是刚学,今天刚学到延时函数,感谢耐心回答
不过,while(a--)明显比for循环的嵌套简单的多啊,为什么调用的延时函数里面写的都是for循环的嵌套?
回复

使用道具 举报

ID:278709 发表于 2018-1-23 11:49 | 显示全部楼层
天下1213 发表于 2018-1-23 08:43
修改合适的延迟时间,看看咋样

好,我没注意时间,下次一定注意。感谢耐心回答
回复

使用道具 举报

ID:278709 发表于 2018-1-23 11:50 | 显示全部楼层
哦哦哦哦哦 发表于 2018-1-23 09:39
延时比较短,所以就变成闪烁啦。楼主可以试试把a的值再调整大一些,就可以看到一阵亮一阵灭的效果啦

可是我都没有加while(1)的大循环,他为什么会循环闪烁呢
回复

使用道具 举报

ID:278709 发表于 2018-1-23 11:52 | 显示全部楼层
leesin 发表于 2018-1-23 11:27
你的发光二极管的接法是共阴还是共阳的呢?

低电平亮,应该是共阳
回复

使用道具 举报

ID:276587 发表于 2018-1-23 13:36 来自手机 | 显示全部楼层
一直再循环里面如果你把后面去掉了,那就是延时了就灭了
回复

使用道具 举报

ID:278919 发表于 2018-1-23 14:20 | 显示全部楼层
不是循环执行,while的等待时间太短,需要插入一些语句或延长计数值。
回复

使用道具 举报

ID:278932 发表于 2018-1-23 14:58 | 显示全部楼层
while是循环当然是闪烁了。。
回复

使用道具 举报

ID:278932 发表于 2018-1-23 15:26 | 显示全部楼层
a--,亮了接着减1,然后暗减1,亮循环进行成闪烁了,要不改成定时才行
回复

使用道具 举报

ID:278954 发表于 2018-1-23 15:31 | 显示全部楼层
因延时比较短,视觉效果是闪烁的。
回复

使用道具 举报

ID:278954 发表于 2018-1-23 15:32 | 显示全部楼层

因延时比较短,视觉效果是闪烁的。
回复

使用道具 举报

ID:62355 发表于 2018-1-23 16:14 | 显示全部楼层
pinenut 发表于 2018-1-23 11:48
非常感谢。由于是刚学,今天刚学到延时函数,感谢耐心回答
不过,while(a--)明显比for循环的嵌套简单 ...

现在你用us级延时 ms 级延时 s级延时 你会发现嵌套比while(a--)好用。
回复

使用道具 举报

ID:278982 发表于 2018-1-23 16:17 | 显示全部楼层
不能依靠这么高速运行单片机,来做减数运算,得出来的时间,你的肉眼是无法分辨的
回复

使用道具 举报

ID:278982 发表于 2018-1-23 16:21 | 显示全部楼层
应该写延时子程序
回复

使用道具 举报

ID:278709 发表于 2018-1-24 19:29 | 显示全部楼层
pinenut 发表于 2018-1-23 11:45
很感谢回答,想再问一下为什么不加大循环while(1)也可以闪烁,如果没有while(1)大循环,这个程序为什 ...

为什么不加while(1)大循环还是闪烁
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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