嵌入式 · 2010-05-25

AT89S52 中断优先级设置

void Openint(void)   //打开中断 { EA=1;//开中断 IT0=1; //外部中断0下降沿触发 IT1=1; //外部中断1下降沿触发 EX0=1;//外部中断0 EX1=1;//外部中断1 ET0=1;//开timer0中断 ES=0;//开串口中断

}

void IntGradeSet(void)  //设置优先级 { PS=0;      //串口优先级 PT0=0;  //timer0中断优先级 PT1=0;  //timer1中断优先级 PX0=0;  //int0中断优先级 PX1=0;  //int1中断优先级 }

void UARTint(void) interrupt 4   using 3        //串口中断处理 { uchar     receivr_buffer; TI=0; //很重要,否则会一直进中断处理程序的! EA=0; if(RI==1) { RI=0; receivr_buffer = SBUF;

if (point == 0) { if (receivr_buffer == 0xa5) IDChageRx[point++] = receivr_buffer; //point++; else point = 0; }

else if (point>0 && point<4) IDChageRx[point++] = receivr_buffer;

else { point = 0; IDChageRx[0]=0; IDChageRx[1]=0; IDChageRx[2]=0; IDChageRx[3]=0; } } EA=1; }

我现在在开发一个系统,用了三个中断,有外部中断1,定时器中断0,串口中断,我设定 中断的优先级是:定时器中断,串口中断,外部中断,而且我的三个中断经常发生,有可能出现中断三级嵌套,也就是说,正在进行外部中断1,串口中断来了,在 进行串口中断的同时,这时定时器中断来了。这样系统运行可靠吗?

我也曾做过一个三级嵌套程序。只不过我是用到两个定时中断和串口中断,正常的中断优先级 为:INT0>T0>INT1>T0>串口中断。 51系列只两个中断优先级。设置时应该保证:高优先级中断和低优先级中断中的若干中断仍要满足上头提到的正常情况下的优先级。如: 要实现:INT1>T0>串口中断,则应该设置如下 SETB PX1 CLR PX0 CLR PT0 CLR PT1 CLR PS(串口中断优先级设置) 你的意思应该是要实现:T0>串口中断>INT0 则设置如下: SETB PT0 SETB PS CLR PX0 CLR PX1 CLR PT1 运行可靠。