Каждое из прерываний 8051 имеет свой собственный бит в регистре специальной функции разрешения прерываний (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 */
или
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.