ps:P0口接八位LED管,低电平点灯;
程序1:
#include<reg52.h>
sbit D1=P0^0;
void delay_while_s(unsigned int ns)
{while(ns)
{unsigned int i=51177;
while(i--);
ns--;}
}
void main()
{
delay_while_s(1);
D1=0;
delay_while_s(1);
}
程序2:
#include<reg52.h>
sbit D1=P0^0;
void delay_for_ms(unsigned int xms)
{unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
delay_for_ms(500);
D1=0;
delay_for_ms(500);
}
现象如下:程序一烧录51单片机中,led1管每1s钟亮灭循环(即一直循环闪烁);
而程序二中,则先灭后亮,不闪烁,点亮后一直保持点亮状态;
从上述程序中可以看出for,和while语句都是作为延时功能作用,为什么会发生两种不同的现象?
望高手解答下~本人不胜感激。。
换成这样当然肯定跟第二个效果一样了~
主要问这个不是为结果,只是想知道为什么会产生这样的区别;
似乎是跟编译器转化成汇编的方式有关。。
我经过单步观察是第一个经过一次程序的运行,单片机内部中断返回时无程序继续操作产生错误,因为单片机不会停止工作,所以遇到这种错误无法执行就选择复位,故而没有D1=1;也能闪烁(复位上电各引脚都是高电平的)
而用for的那句延时在执行完一遍之后还能返回至程序的开头即void后重新开始,因而单片机不产生复位操作,D1=0也就一直保持下去。。
但总觉得疑惑,为什么单片机用while会使程序发生错误而导致上电复位操作。。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |