如何使能8051的外部中断?
发布于 2010-05-01 02:15:26
在中断使能(IE)特殊功能寄存器中,每个8051中断都有自己的位,并通过设置相应的位来使能。下面的代码示例是用8051汇编语言编写的,也是用C语言编写的,以便对所发生的事情有一个大致的了解。
要使能外部中断0 (EX0),需要将IE的位0置1。
SETB EX0、ORL IE,#01或MOV IE,#01
要使能外部中断1 (EX1),需要将IE的位3置1。
SETB EX1、ORL IE,#08或MOV IE,#08
然后,需要通过设置IE的位7(全局中断使能/禁用位(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 */各种8051C编译器供应商通常定义自己的中断函数设置方法。您可能需要查阅特定编译器的文档。
要使用Keil C51编译器(pdf link to application note)定义中断函数,需指定中断号和寄存器组,其中中断号对应于特定的中断矢量地址。
void my_external_interrupt_0_routine(void) interrupt 0 using 2
{
/* do something */
}要使用8051IAR C/C++编译器(icc8051) (pdf link to reference guide)定义中断函数,可以使用__interrupt关键字和#pragma vector指令。
#pragma vector=0x03
__interrupt void my_external_interrupt_0_routine(void)
{
/* do something */
}如果您是8051的新手,www.8052.com上提供了大量的信息。我也推荐克雷格·斯坦纳写的,他是8052.com的站长和作者。
发布于 2020-07-02 21:26:44
在IE寄存器中使能外部中断的相应位。如果是电平触发,只需写入适用于该中断的子例程,或者使能与边沿触发中断相对应的TCON寄存器位-无论是INT0还是INT1。
https://stackoverflow.com/questions/2744953
复制相似问题