Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного числа на основание новой системы счисления. При этом деление должно выполняться по правилам исходной системы счисления. Например, для преобразования двоичного числа в двоично-десятичное исходное двоичное число должно быть поделено на 10. Деление должно осуществляться по правилам двоичной арифметики.
Пусть требуется выполнить преобразования 8-битного двоичного числа в двоично-десятичное. Исходный двоичный код хранится в аккумуляторе. Результат преобразования состоит из 12 бит: младшие
4 бита – единицы, представляют собой остаток от деления исходного числа на 10; следующее 4 бита – десятки, представляют собой остаток от деления на 10 полученного частного; старшие 4 бита – сотни, являются частным от второго деления. Листинг 4.29 содержит программу преобразования однобайтового двоичного кода в двоично-десятичный.
Листинг 4.29 – Программа преобразования однобайтового двоичного кода в двоично-десятичный
.ORG 0000h | ; Адрес начала программы | |
MOV A, #255 MOV B, #10 DIV AB MOV DPL, B MOV B, #10 DIV AB MOV DPH, A MOV A, B SWAP A ORL A, DPL MOV DPL, A ... | ; Загрузка в аккумулятор ; преобразуемого числа (255) ; Загрузка в регистр B ; делителя ; Деление A на B ; Сохранение остатка от ; деления (единиц) в регистре ; DPL. Регистр A содержит ; частное от первого деления ; Загрузка в регистр B ; делителя ; Деление A на B ; Сохранение частного от ; второго деления в DPH ; Сохранение остатка от ; второго деления в старшей ; тетраде регистра DPL |
Результат выполнения программы сохраняется в регистре DPTR. Формат результата приведен на рисунке 4.19.
DPTR | |||||||||||||||
DPH | DPL | ||||||||||||||
Незначащие | Сотни | Десятки | Единицы | ||||||||||||
Рисунок 4.19 – Формат результата преобразования
Обратное преобразование (из двоично-десятичного кода в двоичный) заключается в расчёте суммы:
«единицы» + «десятки» × 10 + «сотни» × 100…
Программа преобразования двухзначного двоично-десятичного кода в двоичный приведена в листинге 4.30.
В приведённой программе исходное значение хранится в младших двенадцати битах регистра DPTR. Результат сохраняется в аккумулятор.
Листинг 4.30 – Программа преобразования двухзначного
двоично-десятичного кода в двоичный
.ORG 0000H | ; Адрес начала программы | |
… MOV A, DPL SWAP A ANL A, #0FH MOV B, #10 MUL AB PUSH A MOV A, DPL ANL A, #0FH MOV DPL, A POP A ADD A, DPL MOV DPL, A MOV A, DPH ANL A, #0FH MOV B, #100 MUL AB ADD A, DPL … | ; Выделение десятков ; Умножение десятков на 10 ; Сохранение в стек ; результата умножения ; Выделение единиц ; Восстановление из стека ; Сложение единиц и ; результата умножения ; Выделение сотен ; Умножение сотен на 100 ; Сложение результата умножения ; с числом «единицы»+«десятки»×10 |
Кроме рассмотренного способа преобразования чисел из одной системы счисления в другую, можно воспользоваться более медленным, но зато и более простым способом «двух счетчиков». При этом способе из исходного кода вычитается, а к новому коду прибавляется по единице до обнуления исходного кода, причем вычитание осуществляется «в старой», а прибавление – в «новой» системе счисления. Пример программы преобразования двоичного числа в двоично-десятичное методом двух счетчиков приводится ниже (листинг 4.31).
В приведенной программе исходный двоичный код должен находиться в аккумуляторе, двоично-десятичный код – в регистре DPTR.
Листинг 4.31 – Программа преобразования двоичного числа
в двоично-десятичное методом двух счетчиков
.ORG 0000h | ; Адрес начала программы | |
NEXT: EXIT: | MOV A, #200 MOV DPTR, #0000H JZ EXIT MOV R0, A MOV A, DPL ADD A, #01H DA A MOV DPL, A MOV A, DPH ADDC A, #00H DA A MOV DPH, A DJNZ R0, NEXT … | ; в A преобразуемое число ; Обнуление регистра DPTR ; Выход из подпрограммы ; преобразования, если ; преобразуемое число 0 ; В регистр-счётчик ( R 0) ; преобразуемое число ; Увеличение регистра DPL ; на единицу и его ; двоично-десятичная ; коррекция ; Увеличение регистра DPH ; на единицу, если возник ; перенос при увеличении ; регистра DPL и ; двоично-десятичная коррекция ; результата ; Уменьшение счетчика циклов ; ( R 0) и переход на начало цикла, ; если R 0 не равно 0 |
4.4.4 Преобразование данных из параллельного кода
в последовательный и обратно
Наиболее распространенным применением процедур преобразования параллельной формы в последовательную и обратно является связь с удаленными датчиками, исполнительными механизмами и другими МК по однопроводным и двухпроводным линиям передачи информации.
Для этих целей удобно использовать аппаратные средства микроконтроллера – последовательный порт (см. п. 1.3.4). Порт может работать в двух режимах: в режиме сдвигающего регистра и режиме универсального асинхронного приёмопередатчика.
Работа последовательного порта в режиме сдвигающего регистра предполагает синхронную выдачу и приём битов информации (рисунок 4.20).
Внешнее устройство, принимающее информацию, должно «защёлкивать» биты по переднему фронту сигнала на выходе TXD, выдающее – устанавливать данные по заднему фронту.
Выдача информации в этом режиме может быть реализована следующим образом (листинг 4.32).
Рисунок 4.20 – Организация последовательного синхронного обмена между микроконтроллером и периферийным устройством |
Листинг 4.32 – Программа выдачи информации микроконтроллером
ORG 0000H | ; Адрес начала программы | |
NEXT: | MOV IE, #00H MOV SCON, #00H MOV P0, #FFH MOV A, P0 SETB P1.0 MOV SBUF, A JNB TI, $ CLR P1.0 CLR TI JMP NEXT | ; Запрет всех прерываний ; Настройка последовательного ; порта контроллера на режим ; синхронной передачи ; Настройка порта P0 на ввод ; Чтение данных из порта P0 ; Разрешение внешнему ; устройству приёма данных ; Запись данных в регистр SBUF ; (при этом автоматически ; начинается выдача данных) ; Ожидание завершения передачи ; Запрет внешнему устройству ; приёма данных ; Сброс флага конца передачи ; Переход на начало цикла |
Процедура приёма данных аналогична процедуре выдачи (листинг 4.33).
Листинг 4.33 – Программа приёма информации микроконтроллером
ORG 0000H | ; Адрес начала программы | |
NEXT: | MOV IE, #00H MOV SCON, #10H SETB P1.0 JNB RI, $ MOV A, SBUF MOV P0, A CLR P1.0 CLR RI JMP NEXT … | ; Запрет всех прерываний ; Настройка последовательного ; порта контроллера на режим ; синхронного приёма ; Разрешение внешнему ; устройству на передачу данных ; Ожидание завершения приёма ; Чтение данных из регистра SBUF ; и их выдача в P0 ; Запрет внешнему устройству ; передачи данных ; Сброс флага конца приёма ; Переход на начало цикла |
Режим универсального приёмопередатчика удобно использовать для асинхронной выдачи и асинхронного приёма информации по последовательному каналу связи (например, по интерфейсу RS-232). Описание работы последовательного порта в режиме универсального приёмопередатчика приведено в п. 1.3.4.
Программа, реализующая прием байта данных, его инвертирование и выдачу обратно (подобная процедура часто используется для тестирования физических линий связи), реализована следующим образом (листинг 4.34).
Листинг 4.34 – Программа, демонстрирующая асинхронный обмен
информации через последовательный порт
Дата публикования: 2014-11-03; Прочитано: 784 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!