Каждое из прерываний 8051s имеет свой собственный бит в регистре специальной функции ( IE
) разрешения прерывания и активируется с помощью установка соответствующего бита. Приведенные ниже примеры кода относятся к сборке 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
). При необходимости вы можете установить высокий приоритет внешних прерываний с помощью SFR приоритета прерывания ( IP
).
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 Можно использовать директиву
.
#pragma vector=0x03
__interrupt void my_external_interrupt_0_routine(void)
{
/* do something */
}
Если вы плохо знакомы с 8051, на www.8052.com имеется обширная информация. Я бы также порекомендовал Микроконтроллер 8051/8052: архитектура, язык ассемблера и аппаратный интерфейс , написанный Крейгом Штайнером, веб-мастером и автором 8052.com.
очень хорошее руководство, оно мне очень помогло. http://www.8052.com/tutint.phtml