Программа переводит двоичное число, находящееся в аккумуляторе, в двоично-десятичный код, который может быть трехразрядным (в десятичной системе счисления). В этом случае число сотен будет размещено в R0, десятки и единицы – соответственно в А и В.
MOV B,#100D ; (B) ¬ 100 для вычисления числа сотен в числе
DIV AB ; в А є число сотен (то есть старшая цифра)
MOV R0, A ; пересылка в R0 старшей цифры
ХСН А, В ; пересылка остатка от деления входного числа в А
MOV B,#10D ; (В)¬10 (определяется число десятков в числе)
DIV AB ; в А – число десятков, В-число единиц
SWAP A ; размещение числа десятков в старшей тетраде А
ADD А, В ; суммирование остатка (числа единиц) аккумулятор сохраняет две младших цифры.
Время преобразования – 16 мкс.
Пример 1 Сравнение двух четырехразрядных чисел, которые подаются на входы порта Р2.
Сигнал равенства выводится на Р1.1, большее – Р1.2, меньшее – Р1.3, разрешение сравнения подается на Р1.0.
ANL P1,#11110001В ; сброс всех сравнений
L0: JNB Р1.0, L0 ; ожидание разрешения
MOV A, P2
ANL A,#F0H ; выделение первого числа
SWAP A
MOV В, A ; запоминание первого числа
CLR C ; сброс переноса
MOV А, P2
ANL A,#0FH ; выделение второго числа
SUBB А, В ; вычисление В
JZ LR ; переход, если А=В
JC LL ; переход, если А<В
SETB P1.2 ; результат А>В
JMP EXIT
LR: SETB P1.1 ; результат А=В
LL: SETB P1.3 ; результат А<В
EXIT: ; продолжение выполнения программы
Аналогично выполняется сравнение чисел большей разрядности. Если необходимо сравнивать многобайтные числа, то сравнение следует начинать со старших байтов.
3. Логические операции в MCS-51
Пример 18. Вывод управляющих сигналов из МК.
Формирование статических сигналов используется для управления исполнительным механизмом по принципу «включен-выключен». При этом соответствующие линии портов просто устанавливаются в 0 или 1.
Если имеем группу исполнительных механизмов, то для их управления необходимо сформировать управляющее слово (УС), каждый бит которого – соответствующий управляющий сигнал.
Для изменения УС достаточно выполнять логические операции над теми битами портов, которые необходимо изменить.
Например: ANL – для сброса тех битов УС, какие заданные нулями
ORL – для установки бит
XRL – инверсия бит по времени
Пример 19. Определение переполнений. При накоплении большого количества слагаемых может возникнуть переполнение разрядной сетки. Для определения этого используют модифицированный дополнительный код, который отличается от обычного дополнительного введением дополнительного знакового разряда. При добавлении k слагаемых таких разрядов должно быть r = log2 k.
Признаком переполнения служит отличие знаковых разрядов. Отметим, что использование r знаковых разрядов суживает диапазон изменения сигналов в 2r раз.
Пример 20. Сбросить биты 0,2,4,6 порта 2:
ANL Р2,#10101010В; сбрасывание бит 0,2,4,6 порта 2
Пример 21. Установить биты 0…3 из порта 1
ORL P1.#00001111В; (P1.0…P1.3) ¬ 1111
Можно также записать
ORL P1,#0FH
Пример 22. Выбрать нулевой регистровый банк:
ANL PSW,#11100111В; сбрасывание бит RS0 и RS1
Пример 23. Проинвертировать биты порта Р1, которые отвечают единичным битам в аккумуляторе:
XRL Р1, А ; сумма по модулю два значения порта 1 и аккумулятора
Пример 24. Проинвертировать биты 7,6,5,4 порта 0:
XRL Р,#11110000В; сумма по модулю два значений порта 0 и константы
Можно также записать XRL Р0, #0F0H
Пример 25. Проинвертировать биты 0…3 в аккумуляторе:
XRL A,#0FH ; сумма по модулю два значения аккумулятора и константы
Пример 26. Настроить биты 1,3,5,7 порта 1 на ввод:
ORL Р1,#10101010В; установление P1.1, P1.3, Р1.5, Р1.7
Пример 2 Маскировка данных при вводе. Ввести в регистр R3 информацию из линий 1,3,5,6,7 порта 1:
MOV А, Р1 ; ввод байта с Р1
ANL А,#11101010В; маскировка
MOV R3, А ; передача в R3
Пример 28. Выполнить логический сдвиг вправо двухбайтового числа, которое размещено в R5, А:
SHIFTR: CLR С ; сбрасывание переноса
CPL С ; установление переноса
ХСН А, R5 ; обмен байтами
JNB А.7, L1 ; если R5.7=1, то снять флажок переноса
CLR C
RRC A ; сдвиг флажка переноса
L1: XCH A, R5 ; обмен
RRC A ; сдвиг младшего байта
Пример 29. Выполнить сдвиг влево двухбайтового числа, которое размещено в R5 и А:
SHIFT L: RLC А ; сдвиг младшего байта
XCH А, R5 ; обмен А и R5
RLC A ; сдвиг старшего байта
XCH А, R5 ; обмен
Пример 30. Управление группой бит порта.
В РПД находится массив распакованных десятичных цифр. Необходимо передать их внешнему устройству в соответствии с протоколом (рис. 2). Для передачи 4-х бит данных используются младшие линии порта 1. Линии Р1.4 и Р1.5 используются как сигналы квитирования, то есть передачу сигналов на выход МК сопровождает стробирующий сигнал на линии Р1.4. Внешнее устройство, которое приняло данные, сообщает об этом сигналом на входе Р1.5. Биты Р1.6 и Р1.7 не должны изменять своих значений.
Исходные данные программы: начальный адрес массива – (R0), длина массива – (R1).
ORL P1, #00100000В; настройка
; Р1.5 на ввод
LOOP: MOV A, @R0; загрузка байта
; в аккумулятор
ANL P1,#11100000В; сброс данных
; и строба
ORL P1, A ; выдача данных
ORL P1,#00010000В; выдача строба
WAIT: JNB Р1.5, WAIT; ожидание ответа
INC R0 ; продвижение указателя адреса
JNZ Rl, LOOP ; цикл, если не все данные переданные
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 ; выравнивание длины интервалов
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.
Страницы: 1, 2, 3, 4