Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ Прог ЦТ лабы для БАУ 2011.doc
Скачиваний:
17
Добавлен:
01.05.2015
Размер:
2.99 Mб
Скачать

8 Лабораторная работа №8. Перевод чисел из 2-й в 2_10 систему.

Цель работы: научиться переводить числа из двоичной системы в двоично-десятичную систему, создание подпрограмм, возвращающих значение в вызвавшую программу.

Как правило, всегда выполняется индикация состояния технологического процесса на пульт оператора в цифровом или символьном виде. Простейший индикатор цифр имеет семь сегментов. Чтобы вывести числа из МК на такой индикатор их необходимо представить в двоично-десятичной системе счислений. В этой системе в одном регистре могут поместиться две десятичные цифры, каждая из которых будет занимать половину байта. От 00000000 до 00001001 в двоичной системе. Таким образом, в регистр можно записать две десятичные цифры и получить числа от 00 до 99.

Блок-схема алгоритма перевода частично приведена на рисунке 8.1.

Подпрограммы, которые мы применяли раньше, имели тип void, т.е. не возвращали никаких значений в вызвавшую их программу. Напишем подпрограмму, результатом работы которой будет передача однобайтного значения в вызвавшую программу. Эта подпрограмма обычно используется совместно с цифровым индикатором. Большинство таких индикаторов работают по прин­ципу выборочного включения требуемых сегментов, как показано на рис. 8.2. Цифрами обозначены разряды порта передающего информацию. Обычно эти сегменты представляют собой светодиоды или электроды элементов на жидких кристаллах.

Рис.8.2-сегментный индикатор

Системное представление нашей подпрограммы приведено на рисунке 8.2а. Входным сигналом в данном случае является 4-битный двоичный код, находя­щийся в рабочем регистре. Выходным значением, также возвращаемым в W, является соответствующий 7-сегментный код, необходимый для отображения соответству­ющей цифры (подпрограмма Vyb_Seg). В микро­контроллерах PIC гарвардская архитектура делает не­возможным использование значений памяти программ в виде данных. Вместо этого таблицы преобра­зования реализуются в виде наборов команд retlw, каждая из которых возвра­щает однобайтную константу, см. подпрограмму Vybor_Seg. Седьмой бит используется для точки.

Подпрограмма Vybor_Seg осуществляет выбор­ку строки таблицы, прибавляя число N, передаваемое через рабочий регистр, к младшему байту счетчика команд (регистр PCL, расположенный по адресу h'02'). Поскольку PCL уже указывает на 1-ю команду retlw с кодом для цифры «0», то после прибавления N он будет указывать на N-ную команду, что нам и требуется.

Фрагменты программы. Применяемые символьныеимена регистров показаны на рисунке 8.3. Стандартные инструкции настройки МК опущены.

MOVLW b'11101011'; исходное число

MOVWF CHISLO

MOVWF Rab_Reg

; подсчитываем количество сотен

MOVLW D'100'

MOVWF VYCH; вычитаемое для сотен.

M_SOT INCF K_SOT, F;

SUBWF Rab_Reg, F; Rab_Reg= Rab_Reg-100

BTFSC STATUS, C; разность отрицательна (С=0)?

GOTO M_SOT; цикл подсчета количества сотен

ADDWF Rab_Reg, F; был заем, выполняем возврат назад на один шаг.

DECF K_SOT, F ; восстанавливаем количество сотен

MOVLW D'10'

MOVWF VYCH ; вычитаемое для определения десятков.

Подсчитываем количество десятков аналогично сотням. Напишите самостоятельно.

; запоминаем количество единиц.

MOVFW Rab_Reg; рабочий регистр содержит единицы после возврата.

MOVWF K_ED; переписываем количество единиц в регистр

SWAPF K_DES, W; перемещаем десятки в старшие разряды

ADDWF K_ED, W; добавляем количество единиц в младшие разряды

MOVWF R_D_ED; регистр теперь содержит десятки и единицы.

MOVF K_ED, W

CALL VYBOR_SEG; вызываем подпрограмму с аргументом W.

MOVWF Kod_seg_ed; записываем возвращенный код цифры

; аналогично найдите коды для десятков и сотен.

GOTO $; разделитель главной программы и подпрограмм.

VYBOR_SEG; подпрограмма, возвращающая код для включения сегментов.

addwf PCL, f; Прибавим W к PCL, получая PCL+W

retlw b'00111111'; код для цифры 0. Возвращается приW=0.

retlw b'00000110'; код для цифры 1. Возвращается при W=1.

retlw b'10101101'; код для цифры 2. Возвращается при W=2.

retlw b'01001111'; код для цифры 3. Возвращается при W=3.

retlw b'01100110'; код для цифры 4. Возвращается при W=4.

retlw b'01101101'; код для цифры 5. Возвращается при W=5.

retlw b'01111101'; код для цифры 6.Возвращается при W=6.

retlw b'00000111'; код для цифры 7.Возвращается приW=7.

retlw b'01111111'; код для цифры 8.Возвращается приW=8.

retlw b'01101111'; код для цифры 8.Возвращается при W= 8.

END

Переведите двоичное число в двоично-десятичное число и определите коды сотен, десятков и единиц.

Т а б л и ц а 8.1 – Варианты заданий двоичного числа

Вариант

Число

Вариант

Число

1

10010111

6

11001110

2

11110010

7

11000101

3

10000101

8

10111100

4

11100000

9

10110011

5

01110011

10

10100000

Рисунок 8.3 – Окно наблюдения

Из рисунка 8.3 видно, что заданное двоичное число содержит 2 сотни, 3 десятка и 5 единиц, то есть равно 235.

Контрольные вопросы

  1. Назначение 2-10 системы счисления.

  2. Сколько бит занимает 2-10 число?

  3. Какое максимальное 2-10 число можно записать в регистр?

  4. Как формируются цифры в индикаторе?

  5. Назначение команды addwf PCL, f ?

  6. Что вернется в вызывающую программу, если при вызове w=h’06’?

  7. С какой целью в программе применена команда Swap?

  8. Объясните алгоритм нахождения сотен.

  9. Какое назначение регистра R_D_ED?

  10. Как определяется, что получилась отрицательная разность?

  11. Как определяется, что получился нулевой результат?

  12. Назначение регистра PCL?