本帖最后由 刘前辈 于 2011-8-20 16:00 编辑
仔细看Intel公司8051数据手册,有3个条件会推迟当前中断申请信号:IE,IP寄存器读写操作是第3个条件。看下面实验,很清楚:
#include <reg51.h>
#include <intrins.h>
char timecount;
sbit LED0=P1^0;
/********************************************************
主函数
*********************************************************/
main()
{
TMOD=01; // T0定时器初始化。
TR0=1; // T0定时器启动。
EA=1;
ET0=1; // T0定时器中断打开。
while(1) //如果这里写为while(1); LED0当然正常闪烁。
{
EA=1; // T0中断被阻塞,LED0停止闪烁。
ET0=1;
PT0=1;
ET1=0;
EX0=0; // 一直阻塞。
//_nop_( ); // 除非加入一条任意正常指令,挂起的中断申请信号才能在这条之后被激活。
// LED0才能正常闪烁。
ES=0;
EA=0;
}
}
/*********************************************************
Time0中断函数
**********************************************************/
void Time0(void) interrupt 1 using 0
{
TH0=0x4c; //50ms定时
TL0=0x00;
timecount++;
if(timecount==20)
{
timecount=0;
LED0=!LED0; //一秒钟闪烁一次。
}
}
/*********************************************************/
、、 |