2010-04-30 99 views
6

如何啓用8051的外部中斷?8051外部中斷

+2

你可能在http://chiphacker.com有更好的運氣。 – Earlz 2010-04-30 19:51:17

回答

7

每個8051s中斷在中斷使能(IE)特殊功能寄存器(SFR)中都有自己的位,並通過設置相應的位使能。下面的代碼示例在8051程序集中以及C中,以提供正在發生的一般性概念。

要啓用外部中斷0(EX0),您需要設置位0的IE

SETB EX0ORL IE,#01MOV IE,#01

啓用外部中斷1(EX1),你需要設置IE第3位。

SETB EX1ORL IE,#08MOV IE,#08

中斷然後需要通過設置IE第7位,它是全球interupt啓用/禁用位(EA)全局啓用。如有必要,可以通過中斷優先級(IP)SFR將外部中斷的優先級設置爲高。

SETB EAORL 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 link to application note)定義中斷功能,可以指定一箇中斷號和寄存器組,其中中斷號對應於特定的中斷向量地址。

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

要使用8051 IAR 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豐富的信息。我還建議The 8051/8052 Microcontroller: Architecture, Assembly Language, and Hardware Interfacing由網站管理員Craig Steiner和8052.com的作者撰寫。