--PAGE_BREAK--4. Битовые операции в
MCS
-51
Пример 31.Операция Исключающее ИЛИ используется очень часто для сравнения бит, или их сброса. В кодах битового процессора такой операции нет, но легко осуществляется наложение логической операции Исключающее ИЛИ на флажок переноса:
JNB bit, LZ ; исключительное ИЛИ для флажка переноса
CPL С ; инверсия флажка
LZ: ; продолжение программы
Пример 32.Преобразовать байт в последовательный код и передать его через Р1.0, не воздействуя при этом на остальные разряды порта. Передачу вести, начиная с младшего бита:
MOV R7,#8D ; инициализация счетчика циклов
LOOP:RRC А ; присвоение переноса значение бита А.0
MOV Р1.0, С ; передача бита
DJNZ R7, LOOP ; цикл, если не все биты переданы
Время выполнения программы 41 мкс, время передачи – 5 мкс (скорость передачи – 200 кбит/с).
Пример 33.Вычислить булеву функцию 3-х переменных Y=(X×)+W (X+V). Переменные X, V, W поступают на линии 2, 1, 0 порта 1; результат Y необходимо вывести на линию 3 порта 1. Для сохранения промежуточных значений использовать бит F0H.
Y BIT P1.3 ; спецификация бит порта 1
Х BIT P1.2
V BIT Р1.1
W BIT Р1.0
MOV С, X ; ввод Х
ANL С,/V ; X×
MOV F0, С ; запоминание результата в F0
MOV С, Х ; ввод Х
ORL С, V ; X+V
ANL С, W ; W (X+V)
ORL С, F0 ; (W (X+V))+(X×)
MOV Y, С ; вывод результата
Время выполнения программы 14 мкс.
Пример 34.Организовать последовательную передачу данных из аккумулятора на 0 вывод порта 2. Пересылку вести манчестерским кодом (каждый бит кодируется двумя интервалами: первый интервал имеет инверсию бита, второй – его прямое значение):
MOV R0,#8D ; инициализация счетчика бит
LOOP:RRC А ; (С)¬(сдвиг мл. бита из акк-ра в перенос)
CPL С ; инверсия бита
MOV Р2.0, С ; передача инверсии бита
CPL С ; восстановление бита
NOP;
NOP ; выравнивание длины интервалов
NOP;
MOV P2.0, С ; передача прямого значения бита
DJNZ R0, LOOP ; цикл, если счетчик не нулевой
Передача начинается с младших битов. Продолжительность одного интервала 6 машинных циклов (6 мкс), время передачи одного бита – 12 мкс, время передачи байта – 96 мкс (скорость передачи 83 кбит/с, или 10,4 кбайт/с).
Пример 35.Пошаговый режим работы. Для его реализации необходимо:
- запрограммировать одно из внешних прерываний (к примеру INT0) на активизацию по уровню;
- в подпрограмме обработки прерывания ожидать последовательность «1» – «0» на входе INT0 (вывод P3.2), задаваемую, например, с помощью кнопки.
В основной программе необходимо дописать следующее:
SETB ІЕ.0 ; разрешение прерывания уровня 0
CLR TCON.0 ; прерывания разрешены по нулевому уровню
…; продолжение основной программы
Подпрограмма обработки прерывания должна закончиться следующими командами:
…; подпрограмма обработки
L1: JNB P3.2, L1 ; ожидание уровня 1
L2: JB P3.2, L2 ; ожидание уровня 0
RETI ; возвращение и выполнение одной; команды основной программы; после чего снова происходит; возвращение в подпрограмму.
Пример 36.Обращение к медленным микросхемам внешней памяти. Программным путем можно задать необходимую длительность импульсов WR и RD. Например, если сигнал должен длиться 50 мкс, то это осуществляется так:
CLR P3.7 ; =0
MOV R3,#24D ; инициализация счетчика (2 мкс)
L0: DJNZ R3, L0 ; цикл (24*2 мкс)
SETB P3.7 ; =1
5. Взаимодействие МК с объектом управления
Пример 3Опрашивание двоичного датчика, например, конечного выключателя.
Ключ подключен к входу MCS-51: порт 1, разряд 3.
WAIT0: JNB P1.С, WAIT0; ожидание размыкания датчика
WAITC: JB P1.3, WAITC; ожидание замыкания датчика
Пример 38.Опрашивание группы двоичных датчиков (аналогично нахождению заданного кода или комбинации датчиков).
WTCODE: MOV A,#10D ; загрузка в А эталонного кода 00001010В
WAIT:CJNE A, P1, WAIT; если кодовая комбинация не совпала с заданной, то ждать
EXIT: ; вывод
Пример 39.При достижении значения параметра равного 135, передать управление на подпрограмму с меткой LABEL А, иначе LABEL В.
MOV A,#135D ; загрузка значения параметра
CJNE A, P1, LABEL В; сравнение и передача управления
LABEL А:
LABEL В:
Пример 40.Зафиксировать импульс, поступающий на вход ОМЭВМ (P1.3) и его окончание.
WAITC: JB P1.3, WAITC; ожидание Р1.3=0
WAIT0: JNB P1.3, WAIT0; ожидание Р1.3=1
Зафиксированный импульс имеет вид .
Для импульса обратного вида нужно поменять WAIT0 и WAITC местами.
Таблица 1 – Минимальная продолжительность сигнала, которую определяет МК
Пример 41.Передать управление на метку TEST и установить Р3.7, если на Т0 поступит 30 импульсов.
MOV R1,#30D ; загрузка числа импульсов
L1: JB P3.4, L1 ; ожидание нуля
L0: JNB P3.4, L2 ; ожидание единицы
JMP L0
L2: DJNZ R1, L1 ; повторить 30 раз
JMP TEST
TEST:SETB Р3.7 ; установление бита
Пример 42.Схема для фиксации короткого импульса: D-триггер устанавливается коротким импульсом, а сбрасывается программно, после определения наличия сигнала на входе Т0.
Пример 43.Устранение дребезжания контактов. Дребезжание состоит в том, что благодаря упругим свойствам контактов возможен отрыв контактов, который приводит к переходному процессу. При этом сигнал может быть прочитан многократно как случайная последовательность нулей и единиц. Это можно устранить с помощью триггера (рис. 6).
Чаще всего с помощью MCS51 это делается программно так, как показано на рис. 7 и рис. 8.
Реализация первого метода, количество совпадений задано в R3.
DBNC:MOV R3,#3 ; инициализация счетчика
DBNC1: JB P3.4, DBNC; если контакт замкнутый,
; то начать отсчет опрашиваний
; сигнала сначала
DJNZ R3, DBNC1 ; повторять, пока значение в R3
; не станет равным 0
JB P3.4, DBNC; конечная проверка
Временная задержка подбирается экспериментальное (1–10 мс) в зависимости от типа датчика.
Пример 44.Формирование импульсных сигналов делается по принципу включен / выключен с необходимой временной задержкой:
PULLS:ON: ANL P1,#11110111B; выдача импульса в линию 3 порта 1
CALL DELAY ; временная задержка
OFF: ORL Р1,#00001000В; сброс
Пример 45.Считывание данных из таймера. Для устранения возможных сбоев при считывании сначала читается старший байт, потом – младший, после чего подтверждается, что старший байт за это время не изменился.
RDTIME: MOV A, TH0
MOV R0, TL0
CJNE A, TH0, RDTIME
MOV R1, А
RET
Пример 46.Подсчет числа импульсов, например, радиодеталей, которые движутся по конвейеру, зафиксированных фотоэлементом (рис. 9).
MOV TMOD,#01000000B; настройка счетчика 1
MOV TH1,#00H; сброс счетчика
WAIT0: JB P3.4, WAIT0; ожидание включения транспортера
SETB TCON.6 ; запуск счетчика 1
WAITC: JNB P3.4, WAITC; ожидание отключения транспортера
CLR TCON.6 ; остановка счетчика 1
MOV A.TH1 ; A ¬число деталей
EXIT: ; выход
Максимальное число радиодеталей – 255.
Пример 4Реализация функций времени на основе таймеров.
В MCS-51 при частоте генератора тактовых импульсов 12 МГц таймер / счетчик изменяет свое значение с частотой 1 Мгц (в режиме таймера), или при поступлении сигнала от внешнего источника через счетный вход T0, T1 (в режиме счетчика).
Если использовать таймер / счетчик в режиме 1 полного формата (16 бит), то получим задержки в границах (1 – 65536 мкс).
Программа задержки на 50 мс в MCS-51, прерывание разрешено. Организация перехода к метке NEXT при переполнении Т/С0:
ORG 0ВН ; адреса вектора прерываний от Т/С0
CLR TCON.4 ; остановка Т/С0
RETI ; выход из подпрограммы обработки прерываний
ORG 100H ; начальный адрес программы
MOV TMOD, #01Н; настройка Т/С0
MOV TL0, #LOW (NOT(50000) – 1); загрузкатаймера
MOV TH0, #HIGH (NOT(50000) – 1)
SETB TCON.4 ; стартТ/С
SETB IE.1 ; разрешение прерываний от Т/С0
SETB PCON.0 ; перевод в режим холостого хода
NEXT: ; продолжение программы.
Пример 48.Организация задержки программным путем:
DELAY: MOV R2, Х ; (R2)¬(Х)
COUNT: DJNZ R2, COUNT; декремент R2 и цикл, если не нуль
RET ; возвращение из подпрограммы
Пример 49.Подпрограмма задержки на 50 мс, используя Т/С0, погрешность не превышает 2 мкс.
DELAY: MOV TMOD,#00000001B; настройка Т/С0
MOV TH0,#HIGH (NOT(50000–16))
MOV TL0,#LOW (NOT(50000–16))
SETB TCON.4 ; запуск Т/С0
JNB TCON.5,$; ожидание
ANL TCON,#NOT(30H); остановка Т/С0, сброс TF0
RET ; возвращение из подпрограммы
Пример 50.Подпрограмма задержки на 1 секунду. Погрешность не больше, чем 123 мкс.
OS: MOV R3,#20D ; счетчик циклов
S1: ACALL DELAY; задержка на 50 мс
DJNZ R3, S1 ; организация цикла
RET ; возвращение из подпрограммы
Пример 51.Измерение временных интервалов. При применении таймера используется вход разрешения счетчика (). Тогда измеренный сигнал подается на вход , а измерение продолжительности выполняется в Т/С0.
«Положительный» импульс:
MOV TMOD,#00001001В; настраивание Т/С0
MOV TH0,#0 ; сбрасывание таймера
MOV TL0,#0
SETB TCON.4 ; запуск Т/С0
WAIT0: JNB P3.2, WAIT0; ожидание единичного уровня
WAITC: JB P3.2, WAITC; ожидание нулевого уровня
CLR TCON.4 ; остановка Т/С0
RET ; выход из процедуры
Управление программе должно передаваться при условии =0. Прерывание от Т/С0 и внешние от – должны быть запрещены. По завершению программы в Т/С0 будет находиться число, пропорциональное продолжительности импульса на входе . Максимальная продолжительность импульса 65536 мкс, погрешность 1 мкс.
Если необходимо измерять большую продолжительность импульса, то можно программным путем подсчитывать число переполнений от таймера.
Пример 52.Преобразование параллельного кода в последовательный в MCS-51 сводится к передаче одного байта в буфер приемо-передатчика:
MOV SBUF, А
Пример 53.Обратное преобразование последовательного кода в параллельный инициируется стоповым битом и выполняется аппаратно без участия программы. Основная программа должна выполнить команду
MOV A, SBUF.
Пример 54.Преобразование однобайтовых чисел в дополнительный код и наоборот. Числа со знаком можно представить в дополнительном коде в границах от -128 к +12 Алгоритмы перевода чисел из прямого кода со знаком в дополнительный и обратное преобразование одинаковы:
DOD-PR: JNB А.7, EXIT; проверка знакового разряда
CPL А ; инверсия аккумулятора
ADD A, #1 ; добавление единицы
SETB А.7 ; установление знака
EXIT: ; выход
Пример 55.Преобразование чисел из одной системы исчисления в другую методом «двух счетчиков». При этом методе из начального кода отнимается, а к новому коду прибавляется единица до обнуления начального кода. Причем отнимание осуществляется в старой системе счисления, а добавление – в новой.
Программа перевода двоичного числа в двоично-десятичное.
MOV R5, А ; передача начального числа в R5
CLR А ; сброс аккумулятора
REV: ADD A,#1 ; добавление единицы
DA A ; десятичная коррекция
DJNZ R5, REV ; декремент начального кода и цикл, если не нуль
Результат преобразования находится в аккумуляторе.
Пример 56.Подсчет числа импульсов за заданный промежуток времени. Решается 4-я способами:
1. Программная реализация временного интервала и программный подсчет числа импульсов.
2. Программная реализация временного интервала и аппаратный подсчет числа импульсов (на внутреннем таймере / счетчике).
3. Аппаратная реализация временного интервала и программный подсчет числа импульсов.
4. Аппаратная реализация временного интервала и аппаратная реализация подсчета импульсов.
Реализация на MCS-51: в таймере-счетчике Т/С1 осуществляется подсчет числа импульсов; в Т/С0 заданный временной интервал. Датчик импульсов должен быть подключен к Т1.
TIME: EQU NOT(10000)+1; определение константы TIME для отсчета времени в 10 мс
MOV TMOD,#01010001B; настройка таймеров-счетчиков:
1-й – счетчик 16 бит, 0-й – таймер
CLR A ; сброс аккумулятора
MOV ТН1, А ; сброс Т/С1
MOV ТL1, А;
MOV ТН0,#НІGH(ТIМE); загрузка в Т/С0 константы TIME
MOV TL0,#LOW (TIME);
ORL TCON,#50H; запускТ/С1 иТ/С
WAIT:JBC TCON.5, EXIT; проверка переполнения Т/С0
SJMP WAIT ; цикл, если TF=0
EXIT: MOV В, ТН1 ; (В) – (А), число импульсов за время 10 мс
MOV A, TL1
программный команда управление микроконтроллер
продолжение
--PAGE_BREAK--