Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы_по_вариантам.doc
Скачиваний:
14
Добавлен:
23.04.2019
Размер:
281.09 Кб
Скачать

Вариант19

  1. Система команд. Подпрограмма приема байта через UART с прерываниями

SPIN1: JNB RI, SPIN1 ; проверка флага RI

CLR RI ; сброс флага

MOV A, SBUF ; чтение символа

RET

  1. Механизм прерываний. Прерывания по срезу (организация, обработка, применение)

Прерывание происходит при перепаде из 1 в 0 на входах 8051. Выход из запроса происходит аппаратно (флаги сбрасываются аппаратно). Для организации необходимо в NCON установить биты IT0 и IE1 соответственно. Запрос сбрасывается аппаратно, а устанавливается и программно и аппаратно.

  1. Таймеры. Т1 как дополнительный вход запросов на прерывания

В старшую (ТН1) и младшую (ТL1) тетрады Т1 записываются единицы, т.е число FF. Далее содержимое

счетчика будет увеличено на 1 в том случае, если в предыдущем цикле был считан входной сигнал высокого

уровня, а в следующем - сигнал низкого уровня, после чего будет отправлен запрос на прерывание.

  1. Режимы работы, orl pcon,#01h

Холостой ход

Билет 20

  1. Система команд. Подпрограмма передачи байта через UART без прерываний.

В регистре SCON – 50h (01010000b) – SCON.6 (SM=1) и SM 0=0 – 8 битный приёмо-передатчик. И установлен SCON.4 – бит разрешения приёма.

ЕСЛИ 50h:

BYTE_T:

MOV SBUF, A

WAIT:

JNB SCON.1, WAIT

CLR SCON.1 //TI –флаг прерывания передатчика

RET

ЕСЛИ 52h:

BYTE_T:

WAIT:

JNB SCON.1, WAIT

CLR SCON.1 // сначала сбросим флаг (TI) прерывания передатчика.

MOV SBUF, A

RET

  1. Таймеры. Т1 как устройство синхронизации uart.

В режимах UART 1 или 2 (SM0:SM1:SM2 = 0:1:0/1 или SM0:SM1:SM2 = 1:1:0/1) частота обмена задается через T/C1 и равна:

2SMOD *FOV /32, где FOV – частота переполнения таймера 1 и равна: FOV = FOSC/(12* [256 – (TH1)]), где FOSC – частота осцелятора, а (TH1) – десятичный код содержимого регистра TH1. Т/С1 используется для приемника только если T2CON.5 = 0. Т/С1 используется для передатчика только если T2CON.4 = 0. Наиболее типично использование его в режиме таймера с автоперезагрузкой (старшая тетрада TMOD = 0010В).

SCON=0xd8; //reg. UART - 3, razr. priema., 9-i bit=1

TMOD=0x21; //T1 - reg.2, T0 - reg.1

TCON=0;

PCON=0x80; //skorost` *2

TL1=TH1=0xff; //115200

TR1=1; //run timer UART

IP=0;

IE=0x90; //Global, UART

  1. Модуль рса как измеритель длительности импульсов.

При обнаруджении фронта или спада на внешнем выводе СУЧт в этом режиме осуществляется запись значения PCA таймера-счетчика в регистры CCAPnH CCAPnL. Этот режим рекомендуется использовать при измерении длительности импульсов(режим захвата). Установка битов CAPPn и/или CAPNn в регистре CCAPMn определяет перепад(0-1 или 1-0), по которому будет осуществляться завхват.

11h = 00010001b – конец импульса

21h = 00100001b – начало импульса

DSEG

P_W EQU 30h

CAPTRE EQU 32h //сохранить первое значение времени

FLAG BIT 00h //привязывает следующую команду жестко к памяти

CSEG

ORG 0000h

AJMP MAIN

ORG 0033h

AJMP PCA_IR0

ORG 0100h

MAIN: //настройка и запуск

MOV CMOD, #00h; // WDTE =0 clock=fosc\12

MOV CL, #00h; //обнуляем регистр режима и счетчик

MOV CH, #00h;

MOV CCAPM0, #21h; (11h – для паузы) //настроить модуль 0, разрешение прерывания (2 бита в 1: 0010 0001 – позитив + фиксация событий)

CLR FLAG;

SETB IE.6; //разрешить прерывание от PCA массива

SETB IE.7; //отключить блокировку прерываний

SETB CCON.6; //установить CR

ORG 0200h

НАЧАЛО

PCA_ISR:

CLR CCF0; // Флаг прерывания модуля 0. Сбрасывается программно.

JBC FLAG, SECOND; // Переходим на метку если бит установлен и сбрасываем его.

FIRST:

MOV CAPTURE, CCAP0L; // запись в CAPTURE значения времени из CCAP0L

MOV (CAPTURE+1), CCAP0H; // запись по адресу CAPTURE+1 значения CCAP0H (фиксируем время наступления)

SETB FLAG; // Flag = 1

MOV CCAPM0, #11h; (или 21h; 21h для паузы) (11h- для импульса (конец импульса) (*) (перенастройка модуля меняет по отрицательному перепаду)

RETI; //разрешение прерывания этого уровня

SECOND:

PUSH PSW;….// выталкивает из стека последнюю затолкнутую переменную ( сохранить признаки

PUSH ACC; //и значения результата)

CLR C; //очистка бита переноса

MOV A, CCAP0L; // запись в ACC значения времени из CCAP0L

SUBB A, CAPTURE; // Вычитание из A – CAPTURE -C Вычитаем младшие байты времени поступления двух событий

MOV P_W, A (Pulse_WIDTH)

MOV A, CCAP0H

SUBB A, (CAPTURE+1) //аналогично старшие байты

MOV (P_W +1), A

POP ACC; // закидывает значение в стек //чтоб не испортить текущих значений

POP PSW;

MOV CCAPM0, #21h(начало импульса); (11h - для паузы)

CLR FLAG;

RETI;