|
关于单片机主程序中while(1)循环的作用的验证
[复制链接]
起因:最近在学习proteus,在最开始编写仿真实例的源程序文件时,为了省事,就没有在主程序中加入while(1)这个无限循环(或者成为死循环)。但是在进行仿真延时的时候,无意间发现程序走到最后并不会停下来,而是会去干一些别的没有让它做的事情。于是决定对此稍作研究。
行动:于是开始验证之旅,编写了一个简单的程序,程序功能是:在主程序开始后,通过对P0口赋予不同的值,实现P0口上的8个LED从低位到高位顺序点亮,点亮第8位LED以后,结束程序。但是后面没有加while(1)这个空循环。
然后在proteus中创建一个基于本程序的电路仿真文件,启动仿真。观察运行结果。
结果是:8个LED从低位依次被点亮,点亮到第8个LED时,此时程序已经结束。按理说程序最后的结果应该是一直保持第8个LED被点亮的状态。但是恰恰相反,在第8位LED被点亮后,接下来,第一位LED被点亮了,然后其余的LED也被顺序点亮了。接下来这8位LED就一直处于循环点亮的状态,呵呵,相当于流水灯的效果了。
接着在程序最后加上while(1)这个无限循环,LED从第一位开始被依次点亮,到第8个LED被点亮后,就不再发生变化了。
结论:如果主程序中没有while(1)这个无限循环,程序走到最后会再次从头开始执行。
如果主程序有while(1)这个无限循环,程序走到最后会一直在这个死循环中运行,不会出现再从头执行的情况。
记得在有些资料中看过这样一句话:据未经验证的说法,在51单片机的C语言程序中,如果主程序中没有while(1)这个无限循环,程序将会从头再次执行。
分析:1、有可能是软件仿真存在的缺陷,实际的单片机系统中不会出现这样的情况;
2、这种情况是真实存在的,跟采用软仿无关。
佐证:由于手头没有51学习板,所以拿来一块AVR学习板验证,验证结果是:程序走到最后以后,没有出现从头执行的情况
讨论:大家来说说,我在软仿中出现的这种情况是软仿这个软件的问题,还是本身就会有这样的问题。
附:我的程序和软仿的电路图
//51单片机主程序中while(1)无限循环(死循环)效果演示
#include
void delay(void)
{
unsigned char i,j;
for(i = 0;i < 252;i++)
for(j = 0;j < 252;j++);
}
void main(void)
{
P0 = 0xfe; //实现依次点亮P0口的8个LED
delay();
delay();
P0 = 0xfd;
delay();
delay();
P0 = 0xfb;
delay();
delay();
P0 = 0xf7;
delay();
delay();
P0 = 0xef;
delay();
delay();
P0 = 0xdf;
delay();
delay();
P0 = 0xbf;
delay();
delay();
P0 = 0x7f;
delay();
delay();
/*
while(1)
{
}
*/
}
|
|