
- •Содержание
- •Список сокращений
- •Введение
- •Структура микроконтроллера
- •Процессор микроконтроллера
- •Адресное пространство микроконтроллера
- •Подключение erom и eram к микроконтроллеру
- •Периферийные устройства микроконтроллера
- •Параллельные порты ввода-вывода
- •Таймер-счетчик т/с0
- •Таймер-счетчик т/с1
- •Последовательный порт
- •Контроллер прерываний
- •Система команд микроконтроллера
- •Общие сведения о языке Ассемблер для микроконтроллеров стандарта mcs-51 и о программном пакете фирмы 2500 a.D.
- •Синтаксис языка Ассемблер
- •Определители основания системы счисления
- •Макроопределения
- •Сообщения о некоторых ошибках ассемблирования
- •Рекомендуемая процедура инициализации микроконтроллера
- •Типичные применения микроконтроллеров
- •Ввод информации с датчиков
- •Опрос двоичного датчика
- •Ожидание события
- •Ожидание импульсного сигнала
- •Устранение дребезга контактов
- •Подсчет числа импульсов
- •Подсчет числа импульсов за интервал времени между двумя событиями
- •Подсчет числа импульсов за заданный промежуток времени
- •Опрос группы двоичных датчиков
- •Ввод информации с матричной клавиатуры
- •Вывод управляющих сигналов из микроконтроллера
- •Формирование статических сигналов
- •Формирование импульсных сигналов
- •Генерация меандра
- •Формирование сигнала с заданной скважностью
- •Вывод и отображение информации
- •Динамический вывод информации на дисплей из семисегментных индикаторов
- •Реализация функций реального времени
- •Программное формирование временной задержки
- •Формирование временной задержки с использованием таймеров
- •Измерение временных интервалов
- •Преобразование кодов
- •Преобразование унитарного кода в двоичный позиционный
- •Преобразование двоичного позиционного кода в унитарный
- •Преобразование кодов из одной системы счисления в другую
- •Преобразование данных из параллельного кода в последовательный и обратно
- •Цифро-аналоговое преобразование
- •Аналого-цифровое преобразование
- •Метод последовательного приближения
- •Метод двойного интегрирования
- •Операции с памятью
- •Тестирование озу
- •Программа тестирования пзу
- •Обмен данными по шине i2с
- •Общие положения и введение в логику работы шины i2с
- •Пример обмена данными по шине i2c
- •Приём данных по протоколу Centronics
- •Литература
Преобразование унитарного кода в двоичный позиционный
Двоичный эквивалент унитарного кода равен номеру бита, в котором находится единственная единица или ноль. Данное преобразование осуществляется путем сдвига исходного унитарного кода в сторону младших бит с одновременным подсчетом числа сдвигов. При «выдвигании» из младшего бита значения 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 ; Увеличение счетчика циклов ; Сброс флага переноса ; Сдвиг вправо считанного значения с ; учётом переноса ; Переход на начало цикла |
Преобразование двоичного позиционного кода в унитарный
Необходимость такого преобразования возникает при выборе одного из исполнительных устройств, подключенных к параллельному порту контроллера, по номеру этого устройства.
Алгоритм преобразования включает следующие шаги:
– в регистр сдвига (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 ; Сброс флага переноса ; Сдвиг влево содержимого ; аккумулятора ; Проверка условия выхода из ; цикла ; Выход из подпрограммы |
После выхода из подпрограммы результат хранится в аккумуляторе.
Преобразование кодов из одной системы счисления в другую
Преобразование кода из одной позиционной системы счисления в другую осуществляется делением исходного числа на основание новой системы счисления. При этом деление должно выполняться по правилам исходной системы счисления. Например, для преобразования двоичного числа в двоично-десятичное исходное двоичное число должно быть поделено на 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 |