首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >8051外部中断

8051外部中断
EN

Stack Overflow用户
提问于 2010-04-30 21:50:18
回答 2查看 7.4K关注 0票数 6

如何使能8051的外部中断?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-01 02:15:26

在中断使能(IE)特殊功能寄存器中,每个8051中断都有自己的位,并通过设置相应的位来使能。下面的代码示例是用8051汇编语言编写的,也是用C语言编写的,以便对所发生的事情有一个大致的了解。

要使能外部中断0 (EX0),需要将IE的位0置1。

SETB EX0ORL IE,#01MOV IE,#01

要使能外部中断1 (EX1),需要将IE的位3置1。

SETB EX1ORL IE,#08MOV IE,#08

然后,需要通过设置IE的位7(全局中断使能/禁用位(EA) )全局使能中断。如有必要,可通过中断优先级(IP) SFR将外部中断的优先级设置为高。

SETB EAORL IE,#80

C语言示例:

代码语言:javascript
复制
#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 */

代码语言:javascript
复制
IE = 0x89;  /* enable both external interrupts and globally enable interrupts */

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

要使用Keil C51编译器(pdf link to application note)定义中断函数,需指定中断号和寄存器组,其中中断号对应于特定的中断矢量地址。

代码语言:javascript
复制
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指令。

代码语言:javascript
复制
#pragma vector=0x03
__interrupt void my_external_interrupt_0_routine(void)
{
/* do something */
}

如果您是8051的新手,www.8052.com上提供了大量的信息。我也推荐克雷格·斯坦纳写的,他是8052.com的站长和作者。

票数 7
EN

Stack Overflow用户

发布于 2020-07-02 21:26:44

在IE寄存器中使能外部中断的相应位。如果是电平触发,只需写入适用于该中断的子例程,或者使能与边沿触发中断相对应的TCON寄存器位-无论是INT0还是INT1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2744953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档