8 051 внешнее прерывание

как включить внешнее прерывание 8 051?

6
задан jschmier 30 April 2010 в 18:15
поделиться

2 ответа

Каждое из прерываний 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.

7
ответ дан 10 December 2019 в 02:44
поделиться

очень хорошее руководство, оно мне очень помогло. http://www.8052.com/tutint.phtml

2
ответ дан 10 December 2019 в 02:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: