Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие по АТ89С51 изд.вариант 2010-54.doc
Скачиваний:
86
Добавлен:
19.11.2019
Размер:
865.22 Кб
Скачать
      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

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

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

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

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

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

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

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

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

– в регистр сдвига (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

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

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

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

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

; цикла

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

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

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

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