单片机1秒延时闪烁的LED灯程序,如果不加延时或者去掉其中一个延时delay,效果会怎样?求大神谢谢!

#include <reg52.h>
#define u16 unsigned int
sbit led = P1^0;
void delay (u16 num)
{
u16 x,y;
for(x=num;x>0;x--)
{
for(y=110;y>0;y--)
{
; //延时1ms
}
}
}

void main (void)
{
led=1;
while(1)
{
led=0;
delay(500);
led=1;
delay(500);
}
}
如题,如果上面的while程序中去掉两个delay会怎样?这时是灯闪烁速度最快的吗?或者我把其中一个delay,运行效果会是怎样?还有怎样 才可以达到最快闪烁速度和最慢闪烁速度,求写详细点,谢谢!

1、同时去掉两个delay,会导致led引脚的电平持续在0、1之间变化,变化频率非常快,在MHz量级,导致的结果就是直接看不到灯闪烁,如果灯的初始状态是灭的,则灯会基本看不到亮度。
2、见上一条,见不到闪烁。
3、去掉第一个delay,实际灯会持续表现出led=1指令的状态,该状态与硬件中led灯的控制端是接在阴极还是阳极有关;类似地,去掉第二个delay,实际灯会持续表现出led=1指令的状态。
4、人眼能分辨的灯闪烁最快的情况应该在几十Hz左右,可以实际更改delay函数的值,进行测试;最慢闪烁速度,则取决于delay的最长延时时间,这里delay的参数num为16位,则当num取65535时,灯闪烁最慢,另外,还可以增大delay函数内部参数“y=110”的值,增加延时时间,降低闪烁速度。追问

你好,谢谢!我的这个led是共阳极的,还想问下我同时去掉两个delay函数的时候,在keil里面编译为什么会显示1个waring(s)的?是哪里出问题了吗?

追答

看下waring的内容 ,应该是提示你指令达不到预期效果的——就是前一条不起作用了

追问

这个上次追问是警告的截图,还想问个我同时去掉两个delay为什么在protues仿真里面看到是闪烁的?而且也不是非常快,快到看不到那种;但当改为两个delay(5)时,反而比没有加delay 的跳的快,这是为什么啊?谢谢!

追答

这个警告是说,有部分代码没有被调用,是指delay函数没有被调用。而连续两条的led赋值操作,没有被编译器认为是有问题的。
至于protues仿真,没有用过,估计是仿真本来能够支持的闪灯频率也是有限的,当delay都去掉时,反应出来的应该是不正常的。
另外,现在单片机仿真硬件已经非常便宜了,尽可能用用开发板进行实际硬件测试吧。另外还有个建议,现在的cortex为核心的32位单片机,已经在逐步取代8位处理器了,只要有一定的C语言基础,更推荐从cortex开始学习单片机——一套可以在线调试的开发套件,低至一两百元。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-02-01
如果输出低电平灯亮,去掉第一个或都去掉,灯看起来不亮,去掉第二个,灯看起来常亮。
第2个回答  2015-02-01
很简单的,你就去掉啊,然后看一下实际效果就知道了吗。
什么是最慢和最快,你同样需要一边改延时的长短,一边试试看效果,直以满意为止呀。
但不知是实物,还是仿真呀,还是就为了写程序,什么也不做,就想问结果呢?

如何用单片机实现led灯一亮一灭的效果?
当单片机LED灯一亮一灭间隔1秒时,可以使用以下代码实现:\/\/ 初始化IO口 P1 = 0xFF; \/\/ 设置延时时间 while (1) { P1 = 0x00; \/\/ 延时1秒 for (int i = 0; i < 10000; i++) { \/\/ 空循环 } P1 = 0xFF; \/\/ 延时1秒 for (int i = 0; i < 10000; i++) { \/\/ 空循...

为什么在单片机中要用到延时程序
这个原因还是蛮多的,分同的情况,单片机的处理速度是很快的,有的时候为了让我们便于观察需要加入延时,例如一个指示灯的亮灭,如果不加入延时是看不出来的,再有就是键盘去抖动,一般按键都有20ms左右的抖动,为了更好的检测防止干扰,也需要延时一段时间在进行判断,总之延时的作用在不同的情况下也不...

51单片机用定时器,怎么编程流水灯一秒闪烁一次,
先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序

单片机间隔点亮一led灯的汇编语言程序
acall delay sjmp main delay:mov r7,#0ffh de:mov r6,#0ffh djnz r6,djnz r7,de ret end 这就是你想要的效果,不妨试试哦!

用单片机c语言一个按键控制led的闪烁和熄灭,就是按一下闪烁,再按就熄灭...
首先你的贴出来的程序不完整,最好贴出完整代码!其次,如果你的程序没问题的话,你的LED闪烁是必须在你按住按键且不能弹起情况下才会发生的,你是一直按着吗?而且注意你n的类型,因为你这样一直加,会溢出的

51单片机LED延时闪烁delay(50000); 用定时器延时代替delay(50000)延时怎...
void init() { TMOD = 0x01; \/\/设置定时器0,GATE = 0, C\/T = 0 , M1M0 = 01(方式1,16位定时器\/计数器)\/\/赋初值 TH0 = THx;TL0 = TLx;EA = 1; \/\/中断总闸·开!ET0 = 1; \/\/定时器0中断·开!TR0 = 1; \/\/定时器0·运行!} \/\/定时器0的中断函数:由定时器中断...

怎样使用单片机的串口控制LED灯亮灭
delay(1000); \/\/ 延时1秒} 在上述示例程序中,我们将LED连接到Arduino的13号引脚,并使用digitalWrite()函数控制该引脚的电平。HIGH表示将引脚设置为高电平(点亮LED),LOW表示将引脚设置为低电平(熄灭LED)。通过delay()函数设置LED灯亮灭的时间间隔。4.上传程序:将编写好的程序上传到单片机中。将...

单片机用c语言,按钮控制一个LED灯,要求按下松开,LED亮,按下松开,LED...
1、首先打开桌面上的keil软件,在进行对51单片机进行编程时最常用的就是keil软件。2、编写相应的代码:#include<reg52.h> \/\/定义单片机的头文件sbit led=P2^0; \/\/定义单片机的管脚,void main(void) \/\/主函数{ while(1) \/\/无限循环 {led=0x1f; \/\/点亮前面三个灯。这里...

51单片机C程序实验LED灯:[1]单个灯闪烁
程序清单 说明: 先写的延时子程序,放在了前面 然后是闪烁的主程序 includereg51.h sbit led=P1^0; \/\/延时子程序 void delay() { int i; for(i=0;i=30000;i++); } \/\/主程序 void main() { led=0; while(1) { led=~led; delay(); } } 完成结果仿真图 (tip:双击单片机,...

用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮
定义一个引脚,用一个while,分别赋值0.1,中间用delay()

相似回答