在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--);
}
仿真的电路如下:
因为跑完你写的那些代码后,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);
}