首 页 用户登录 | ![]() |
|||
|
|||
按字母检索 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
按声母检索 | A | B | C | D | E | F | G | H | J | K | L | M | N | O | P | Q | R | S | T | W | X | Y | Z | 数字 | 符号 |
|
![]() |
您的位置: 5VAR论文频道 → 论文中心 → 理工论文 → 电子通信 |
|
|||||
MCS-51系统中断优先级的软扩展 | |||||
收集整理:佚名 来源:本站整理 时间:2009-01-10 22:36:47 点击数:[] ![]() |
|||||
C //HAddr进制 #pragma endasm switch(prio){ case 0:IP=X0_PRI_MASK;IE=X0_INT_MASK; break; //… case4:IP=S_PRI_MASK;IE=S_INT_MASK;break; } ENTER_CRITICAL();//这里中断被打开,故再关中断 ResetIntSys(); EXIT_CRITICAL();//开中断 } //从系统栈中恢复IE、IP,其过程如图1所示。该函数应在退出ISP时调用 void ResetPriority(void){ ENTER_CRITICAL(); #pragma asm POP ACC //弹出返回地址的高位字节HAddr POP B //弹出返回地址的低位字节LAddr POP IE //EA= =0 POP IP PUSH B //LAddr进栈 PUSH ACC //Haddr进栈 #pragma endasm EXIT_CRITICAL();//开中断 } //仅含一条指令:RETI,用以复位中断系统,以便系统在ISR执行过程中可响应其它中断 void ResetIntSys(void){ char code reti=0x32; //32H为RETI的机器码 (((void)(code*)(void))(&reti))();//将reti的地址强制转化为函数指针 } 使用时,只需将ExtIntPri.H头文件用#include加入相应源文件(当然,应将ExtIntPri.C的目标文件<*.Obj>、库文件<*.lib>或汇编源文件<*.src>加入当前工程)。不妨以定时器0(T0)为例,其中断号为1,故优先级亦应为1,如下所示: ////Test.C #include "ExtIntPri.H" //… void T0_ISR(void)interrupt 1 using 2{ SetPriority(1); //… ResetPriority(); } 如此,T0即有了次最高优先级——1。 结语 使用本文所述的“软扩展”方法,可以将MCS-51系统的中断优先级扩展到5级。如果所用51系统的中断源个数为N(N≤8),只须对上述方法稍作修改即可将其优先级扩展到N级。该方法不需增加任何硬件,且所需的额外资源消耗很小,使用也非常简单,不会给用户增加编程负担。实际应用表明,这种方法是可行的和有效的。 |
提供人:佚名 | |
【返回上一页】【打 印】【关闭窗口】 |
![]() |
5VAR论文频道 |
![]() |
5VAR论文频道 |
![]() |
关于本站 -
网站帮助 -
广告合作 -
下载声明 -
网站地图
Copyright © 2006-2033 5Var.Com. All Rights Reserved . |