代码中没有写循环,为什么用protues仿真却得到LED灯循环(语言-c语言)

在B站学C51单片机,看到个代码,看上去LED只会闪烁一次,但是他用proteus跑代码的时候LED灯无限循环闪烁,麻烦帮忙解释下。

B站上的代码如下



#include <reg51.h>
sbit led=P1^0;
main
{
    int i,j;
    
    led=0;
    i=50;
    while(i--);

    led=1;
    i=50;
    while(i--);
}

仿真的电路如下:

img

因为跑完你写的那些代码后,CPU会继续往后面跑,后面的代码空间一般都是0xff,这也算是个指令,不过基本不会产生什么效果。跑到最后面(64K或单片机的硬件上限)后,单片机的硬件逻辑会让它从头再次开始跑,这个中间虽然看起来有很多代码,但其实相对于单片机的执行速度来说,不过是执行了几千条空指令,花不了多少时间,也就毫秒级的时间。所以,单片机的硬件逻辑本身就是一个大循环。
但是写代码的时候不能依赖这个逻辑,因为代码虽然从头开始跑了,但之前运行的代码的效果还在,比如定时器,中断等,这都会带来很多不确定性因素。

protues仿真软件里,AT89C51右键,看下加载的.hex文件,是否是上面代码生成的 .hex 文件,或是加载了另外一个.hex 文件了。

二楼 qllaoda 说的很对,再给你补充一下。
单片机最后的需要有个 while(1); 才能让单片机停下来。LED 就只闪烁一次,否则就会和二楼 qllaoda 说的一样循环下去。如果有中断,程序也可能跑飞死机等。

#include <reg51.h>
sbit led=P1^0;
main
{
    int i,j;
    
    led=0;
    i=50;
    while(i--);
 
    led=1;
    i=50;
    while(1);
}