Федеральное агентство по образованию бийский технологический институт (филиал)

Вид материалаДокументы
4.4Преобразование кодов
4.4.1Преобразование унитарного кода в двоичный позиционный
4.4.2Преобразование двоичного позиционного кода в унитарный
4.4.3Преобразование кодов из одной системы счисления в другую
4.4.4Преобразование данных из параллельного кода в последовательный и обратно
4.4.5Цифро-аналоговое преобразование
4.4.6Аналого-цифровое преобразование
4.4.6.1Метод последовательного приближения
4.4.6.2Метод двойного интегрирования
Подобный материал:
1   ...   6   7   8   9   10   11   12   13   14

4.4Преобразование кодов


В задачах управления может возникнуть необходимость преобразования информации из одной формы представления в другую. Это связано с тем, что обработка данных в МК осуществляется в параллельном двоичном коде, а поступать в МК и выводиться из него информация может в иной форме представления.

Наиболее распространены в задачах логического управления следующие преобразования:

– из унитарного кода в двоичный (при вводе информации с клавиатуры или от оцифрованных переключателей);

– из двоичного в унитарный;

– из одной системы счисления в другую (при работе со специальными клавиатурами);

– специальные преобразования (для организации индикации и при выводе информации на периферийные устройства);

– из последовательного кода в параллельный (при вводе) и из параллельного в последовательный (при выводе);

– из аналоговой формы представления в цифровую, и наоборот (для связи с аналоговыми датчиками и исполнительными механизмами).

4.4.1Преобразование унитарного кода в двоичный позиционный


Двоичный эквивалент унитарного кода равен номеру бита, в котором находится единственная единица или ноль. Данное преобразование осуществляется путем сдвига исходного унитарного кода в сторону младших бит с одновременным подсчетом числа сдвигов. При «выдвигании» из младшего бита значения 1 (или 0) сдвиги прекращаются, а в счетчике сдвигов будет содержаться двоичный эквивалент унитарного кода (листинг 4.27).


Листинг 4.27 – Программа преобразования унитарного кода
в двоичный позиционный

; Активным сигналом для бита является логическая 1.




.ORG 0000h

; Адрес начала программы



NEXT:


EXIT:

MOV P1, #FFh

MOV A, P1

MOV R0, #FFh

JZ EXIT


INC R0

CLR C

RRC A


JMP NEXT



; Настройка порта P1 на ввод

; Считывание данных из порта P1

; Обнуление счётчика циклов

; Выход из процедуры, если считанное

; значение 0

; Увеличение счетчика циклов

; Сброс флага переноса

; Сдвиг вправо считанного значения с

; учётом переноса

; Переход на начало цикла

4.4.2Преобразование двоичного позиционного кода в унитарный


Необходимость такого преобразования возникает при выборе одного из исполнительных устройств, подключенных к параллельному порту контроллера, по номеру этого устройства.

Алгоритм преобразования включает следующие шаги:

– в регистр сдвига (R) загружается число 00000001b;

– если преобразуемый двоичный код (B) не равен нулю, то выполняется сдвиг содержимого регистра R влево В раз, иначе программа преобразования завершается.

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


Листинг 4.28 – Программа преобразования 3-битного двоичного кода, хранящегося в аккумуляторе, в 8-битный унитарный




.ORG 0000h

; Адрес начала программы



GO:

NEXT:


EXIT:



ANL A, #07H

MOV R0, A


MOV A, #01H

CJNE R0, #00H, GO


JMP EXIT


CLR C

RLC A


DJNZ R0, NEXT






; Обнуление незначащих бит

; Сохранение двоичного кода в

; регистре R0

; Загрузка регистра сдвига

; Сравнение преобразуемого

; двоичного кода с нулём

; Выход из подпрограммы, если

; преобразуемый код 000b

; Сброс флага переноса

; Сдвиг влево содержимого

; аккумулятора

; Проверка условия выхода из

; цикла

; Выход из подпрограммы



После выхода из подпрограммы результат хранится в аккумуляторе.

4.4.3Преобразование кодов из одной системы счисления в другую


Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного числа на основание новой системы счисления. При этом деление должно выполняться по правилам исходной системы счисления. Например, для преобразования двоичного числа в двоично-десятичное исходное двоичное число должно быть поделено на 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

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Незначащие

Сотни

Десятки

Единицы



Рисунок 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

; В регистр-счётчик (R0)

; преобразуемое число

; Увеличение регистра DPL

; на единицу и его

; двоично-десятичная

; коррекция


; Увеличение регистра DPH

; на единицу, если возник

; перенос при увеличении

; регистра DPL и

; двоично-десятичная коррекция

; результата

; Уменьшение счетчика циклов

; (R0) и переход на начало цикла,

; если R0 не равно 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 – Программа, демонстрирующая асинхронный обмен
информации через последовательный порт

FOSC:


BR:

COUNT:


.EQU 18432000


.EQU 9600

.EQU 256-(FOSC/(BR*192))

; Частота кварцевого

; резонатора

; Скорость обмена (бод)

; Число, загружаемое в

; таймер-счетчик T/C2




.ORG 0000H

; Адрес начала программы



CICLE:



MOV TMOD, #20H


MOV SCON, #50H


ORL PCON, #80H


MOV TH1, #COUNT

MOV TL1, TH1

CLR TI


CALL READ

CPL A


CALL SEND

JMP CICLE

; Настройка T/C2 в режим

; с автоперезагрузкой

; Настройка

; последовательного порта

; Установка бита 7

; регистра PCON (бит

; влияет на скорость

; передачи)

; Загрузка регистров T/C2


; Сброс флага готовности

; передатчика

; Сброс флага готовности

; приёмника

; Вызов процедуры приёма

; Инвертирование

; полученного байта

; Вызов процедуры выдачи

; Переход на начало цикла

; ПОДПРОГРАММЫ

; Подпрограмма асинхронного приёма

READ:



JNB RI, $


MOV A, SBUF


CLR RI


RET

; Ожидание установки

; флага готовности

; приёмника

; (устанавливается при

; получении символа)

; Считывание в

; аккумулятор принятого

; байта

; Сброс флага готовности

; приёмника

; Выход из подпрограммы

; Подпрограмма асинхронной выдачи

SEND:

MOV SBUF, A


JNB TI, $


CLR TI

RET

; Загрузка в регистр

; SBUF Отправляемого

; значения

; Ожидание установки

; флага готовности

; передатчика

; Сброс флага готовности

; передатчика

; Выход из подпрограммы

4.4.5Цифро-аналоговое преобразование


Преобразование информации из цифровой формы в аналоговую осуществляется путем подключения ЦАП к одному из портов МК. Выдача аналогового управляющего воздействия в этом случае сводится к команде пересылки двоичного кода в порт. При этом на выходе ЦАП появится напряжение (ток), пропорциональное двоичному коду, загруженному в порт.

Некоторые объекты управления могут требовать непрерывного воздействия изменяющегося сигнала. Простейшим случаем является формирование линейно изменяющегося сигнала (рисунок 4.21, листинг 4.35).





Рисунок 4.21 – Принцип формирования линейно изменяющегося сигнала с помощью ЦАП



Листинг 4.35 – Программа формирования линейно изменяющегося сигнала




. ORG 0000H

; Адрес начала программы



NEXT:

MOV A, #00H

MOV P1, A


CALL DELAY


INC A

JMP NEXT

; Обнуление аккумулятора

; Пересылка содержимого

; аккумулятора в порт P1

; Вызов подпрограммы,

; реализующей задержку

; Инкремент аккумулятора

; Переход на начало цикла



Программа формирования аналогового сигнала, заданного таблично, приведена в листинге 4.36.


Листинг 4.36 – Программа формирования аналогового сигнала,
заданного таблично




. ORG 8000H

; Адрес начала программы

CYCLE:


NEXT:

MOV DPTR, #TABLE


MOV A, #00H


MOVC A, @A+DPTR

MOV P1, A


CALL DELAY


INC DPTR


MOV A, DPH

CJNE A, #
MOV A, DPL

CJNE A, #>END, NEXT

JMP CYCLE

; Загрузка в DPTR базового

; адреса таблицы


; Загрузка в аккумулятор

; смещения относительно

; базового адреса (00)

; Чтение байта из таблицы

; Пересылка считанного

; байта в порт

; Вызов подпрограммы,

; реализующей задержку

; Увеличение адреса

; обращения к таблице


; Проверка вхождения в

; пределы таблицы


; Переход на начало

; программы, если считано

; последнее значение из

; таблицы

TABLE:










.DB 00, 01, 02, 02, 02, 03

.DB 03…

; Таблица значений

; реализуемой функции

END:






4.4.6Аналого-цифровое преобразование


Преобразование аналогового сигнала от датчика в цифровой код, принимаемый и обрабатываемый в МК, можно осуществить несколькими способами:

– аппаратным на основе микросхемы АЦП, подключаемой к порту МК. В этом случае МК только инициирует АЦП и через заданные периоды преобразования считывает из него цифровой код. Данный способ характеризуется самым высоким быстродействием, но требует использования АЦП, что далеко не во всех применениях МК является оправданным с экономической точки зрения;

– программно-аппаратным на основе ЦАП и программы взвешивания битов (методом последовательного приближения). Данный способ характеризуется меньшим быстродействием, но требует использования относительно простых и дешевых микросхем ЦАП и операционного усилителя;

– программно-аппаратным способом на основе метода двойного интегрирования. Это самый дешевый, но и наиболее медленный способ. Данный способ может обеспечить достижение очень высокой точности преобразования;

– программно-аппаратным на основе использования преобразователя напряжение–частота и программы измерения периода сигнала.

Наибольший практический интерес представляют последние 3 способа, так как их использование обеспечивает получение высоких технико-экономических характеристик микропроцессорной системы относительно простыми средствами.

4.4.6.1Метод последовательного приближения


При использовании данного способа преобразования аналогового сигнала в код, из дополнительной аппаратуры в микроконтроллерном устройстве используются ЦАП и сравнивающий компаратор. Схема включения приведена на рисунке 4.22.





Рисунок 4.22 – Структурная схема аналого-цифрового преобразования по методу последовательного приближения

Микроконтроллер через порт Р1, работающий в режиме вывода, передает двоичные коды в ЦАП, выход которого соединяется с одним из входов компаратора. На второй вход компаратора подаётся преобразуемое напряжение. Сигнал с выхода компаратора подаётся на вход микроконтроллера.

На выходе компаратора формируется логический 0, если напряжение на выходе ЦАП (Uцап) меньше преобразуемого напряжения (Ux). Если Uцап>Ux, на выходе компаратора формируется логическая единица.

Программа аналого-цифрового преобразования (листинг 4.37) работает следующим образом: МК выдает через порт P1 байт данных, преобразуемый ЦАП в аналоговый сигнал Uцап и сравниваемый с входным аналоговым сигналом Ux, а затем анализирует результат сравнения. В зависимости от значения сигнала на входе INT0 МК или оставляет старший бит выводимого байта в 1, если Uцапx, или сбрасывает его в 0, если Uцап>Ux. Затем аналогичным образом в порядке убывания весовых значений проверяется каждый бит выводимого байта.


Листинг 4.37 – Программа аналого-цифрового преобразования
методом последовательного приближения



NEXT:


ENOUGH:

.ORG 0000H

MOV R0,#08H

MOV R1, #01H

MOV R2, #00H


MOV A, R1

RR A

MOV R1, A

ORL A, R2


MOV P1, A


JB INT0, ENOUGH


MOV R2, A


DJNZ R0, NEXT

; Адрес начала программы

; Инициализация счётчика битов

; Инициализация регистра сдвига

; Инициализация регистра

; результата


; Ротация регистра сдвига


; Логическое сложение регистра

; сдвига и регистра результата

; (Результат сохраняется в

; аккумуляторе)

; Выдача в порт результата

; сложения

; Проверка результата сравнения

; Если на выходе компаратора 1,

; то регистр результата не

; изменяется (переход),

; иначе результат логического

; сложения сохраняется в R2

; Переход на начало цикла

4.4.6.2Метод двойного интегрирования


Схема подключения к МК дополнительной аппаратуры показана на рисунке 4.23, временные диаграммы, поясняющие принцип метода двойного интегрирования, приведены на рисунке 4.24.





Рисунок 4.23 – Структурная схема аналого-цифрового преобразования по методу двойного интегрирования




Рисунок 4.24 – Временные диаграммы, поясняющие принцип метода двойного интегрирования


Первоначально на вход интегратора подается отрицательное напряжение Eоп. При этом на выходе интегратора через некоторое время установится отрицательный уровень, а на выходе компаратора будет сформирован сигнал логического 0.

Процесс преобразования состоит из двух этапов. Сначала производится интегрирование входного аналогового сигнала в течение строго определенного времени Т1. Отсчет интервала Т1 производится от момента t0 перехода напряжения на выходе интегратора через нуль. Входной преобразуемый сигнал (для данной схемы) должен быть положительным. Затем в момент времени t1 на вход интегратора подается опорное отрицательное напряжение Eоп и измеряется время интегрирования Т2, которое и будет пропорционально входному напряжению (Uвх).

Время Т1 выбирается так, чтобы при максимальном входном напряжении интегратор не вошел в насыщение.

Листинг 4.38 содержит программу аналого-цифрового преобразования методом двойного интегрирования. После выполнения программы результат сохраняется в регистрах TH0:TL0.


Листинг 4.38 – Программа аналого-цифрового преобразования
методом двойного интегрирования

TIME:

.EQU #7FFFH

; Время интегрирования













.ORG 0000H

; Адрес начала программы




CLR EA

; Запрет всех прерываний




MOV TMOD,#01H

; Настройка таймер-счётчика Т/С0




MOV TL0, #
MOV TH0, #>TIME

; Загрузка Т/С0




SETB P1.1

; Настройка Р1.1 на ввод




SETB P1.0

; Подача Еоп на вход интегратора




JB P1.1, $

; Ожидание появления на выходе

; интегратора отрицательного

; уровня




CLR P1.0

JNB P1.1, $

SETB TR0

JNB TF0,$

; Подача Uвх на вход интегратора

; ожидание момента Т0

; Запуск Т/С0

; Ожидание момента Т1

; НАЧАЛО ОБРАТНОГО ИНТЕГРИРОВАНИЯ




SETB P1.0

; Подача Еоп на вход интегратора




MOV TL0, #00H

MOV TH0, #00H

JNB P1.1, $


CLR TR0



; Загрузка Т/С0


; Ожидание появления на выходе

; интегратора отрицательного

; уровня

; Остановка счётчика Т/С0



Контрольные вопросы
  1. Для чего необходимо преобразование кодов в микроконтроллерных устройствах?

Преобразование каких кодов наиболее часто выполняется микроконтроллером?

Для чего необходим двоично-десятичный код?

Как организуется преобразование из двоичного кода в двоично-десятичный и обратно?

Для чего необходимо преобразование последовательного кода в параллельный и обратно?

Что такое цифро-аналоговое преобразование и для чего оно нужно?

Опишите методы аналого-цифрового преобразования, применяемые в микроконтроллерных устройствах.