6

如何开启8051的外部中断?

4

2 回答 2

7

每个 8051 中断在中断启用 ( ) 特殊功能寄存器 (SFR) 中都有自己的位,IE并通过设置相应位来启用。下面的代码示例采用 8051 汇编和 C 语言,以提供正在发生的事情的一般概念。

要启用外部中断 0( EX0),您需要设置 的位 0 IE

SETB EX0ORL IE,#01MOV IE,#01

要启用外部中断 1 ( EX1),您需要设置 的位 3 IE

SETB EX1ORL IE,#08MOV 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 */

或者

IE = 0x89;  /* enable both external interrupts and globally enable interrupts */

各种 8051 C 编译器供应商通常定义自己的设置中断函数的方法。您可能需要查阅特定编译器的文档。

要使用 Keil C51 编译器(应用笔记的 pdf 链接)定义中断函数,需要指定中断号和寄存器组,其中中断号对应于特定的中断向量地址。

void my_external_interrupt_0_routine(void) interrupt 0 using 2
{
/* do something */
}

要使用 8051 IAR C/C++ 编译器 (icc8051)(参考指南的 pdf 链接)定义中断函数,可以使用__interrupt关键字和#pragma vector指令。

#pragma vector=0x03
__interrupt void my_external_interrupt_0_routine(void)
{
/* do something */
}

如果您是 8051 的新手,请访问www.8052.com获取大量信息。我还推荐8051/8052 微控制器:架构、汇编语言和硬件接口,作者是 8052.com 的网站管理员和作者 Craig Steiner。

于 2010-04-30T18:15:26.040 回答
0

使能 IE 寄存器中相应的外部中断位。如果是电平触发,只需编写与该中断对应的子程序,否则将边沿触发中断对应的TCON寄存器位使能——不管是INT0还是INT1。

于 2020-07-02T13:26:43.777 回答