keil c51调试流水灯的问题

我用中断计时的方式写了一个流水灯,在C51里调试的时候P0口没几下就全部变成0X00,在Proteus里仿真也是,全部变成0X00,但是写进单片机却是正常的。

#include<reg52.h>
#include<intrins.h>
unsigned char i=0;

void main()

{
EA=1;
P0 = 0xFE;
TMOD=0X01;
TH0=0X3C;
TL0=0XB0 ;
ET0=1;
TR0=1;
while(1)
{
if( i==20)
{
i=0;

P0 = _crol_(P0, 1);
if(P0==0xFF)
{
P0 = 0xFE;
}
}
}
}

void InterruptTimer() interrupt 1
{
TH0=0X3C;
TL0=0XB0 ;
i++;
}
新手不懂求教,谁知道是怎么回事吗

如下面图(我使用的是keil MDK,但道理都是一样的),在debug界面中,如果你将Run to main()复选框前的对号去掉,每次进入debug都会从Startup.a51,因为这个文件存在一些启动代码,复位后要先进入这个文件的,你虽然是用C写的代码,但是实际下载到单片机的还有编译器为你自动加入的Startup.a51文件中的代码,这个主要将RAM区数据清零,然后跳转到你写的C语言main函数.由于你进入debug后再复位,实际上是从程序的最开始执行,至于为什么进入调试模式是执行的你写的C代码,就是因为你选择了下图中的Run to main()---编译器按照你选定的设置进执行了一些步骤而已
温馨提示:答案为网友推荐,仅供参考