每个8051中断在中断enable(IE)特殊功能寄存器(SFR)中都有自己的位,并通过设置相应的位使能.下面的代码示例在8051汇编和C中,以提供正在发生的事情的一般概念.
要启用外部中断0(EX0),需要将0位设置为IE.
SETB EX0 或 ORL IE,#01 或 MOV IE,#01
要启用外部中断1(EX1),您需要设置第3位IE.
SETB EX1 或 ORL IE,#08 或 MOV IE,#08
然后,需要通过设置第7 IE位(全局中断启用/禁用位(EA))来全局启用中断.如有必要,可以通过中断优先级(IP)SFR 将外部中断的优先级设置为高.
SETB EA 要么 ORL IE,#80
C中的示例:
#define IE (*(volatile unsigned char *)0xA8)
#define BIT(x) (1 << (x))
...
IE &= ~BIT(7); /* clear bit 7 of IE (EA) to disable interrupts */
...
IE |= BIT(0); /* set bit 0 of IE (EX0) to enable external interrupt 0 */
...
IE |= BIT(1); /* set bit 3 of IE (EX1) to enable external interrupt 1 */
...
IE ^= BIT(7) /* toggle bit 7 of IE (EA) to re-enable interrupts */
Run Code Online (Sandbox Code Playgroud)
要么
IE = 0x89; /* enable both external interrupts and globally enable interrupts */Run Code Online (Sandbox Code Playgroud)
各种8051 C编译器供应商经常定义自己的设置中断函数的方法.您可能需要查阅特定编译器的文档.
要使用Keil C51编译器定义中断功能(pdf链接到应用笔记),需要指定中断编号和寄存器组,其中中断编号对应于特定的中断向量地址.
void my_external_interrupt_0_routine(void) interrupt 0 using 2
{
/* do something */
}Run Code Online (Sandbox Code Playgroud)
要使用8051 IAR C/C++编译器(icc8051)(参考指南的pdf链接)定义中断函数,可以使用__interrupt关键字和#pragma vector指令.
#pragma vector=0x03
__interrupt void my_external_interrupt_0_routine(void)
{
/* do something */
}Run Code Online (Sandbox Code Playgroud)
如果您是8051的新手,请访问www.8052.com获取丰富的信息.我还推荐8051/8052微控制器:架构,汇编语言和硬件接口,由网站管理员和8052.com的作者Craig Steiner编写.