Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_12.doc
Скачиваний:
3
Добавлен:
27.09.2019
Размер:
147.46 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

ГОМЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ДОРОЖНО-СТРОИТЕЛЬНЫЙ КОЛЛЕДЖ имени Ленинского комсомола

Методические указания по выполнению лабораторных работ по дисциплине «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ»

Лабораторная работа № 12

Исследование применения команд перехода в различных программах

ГГДСК Гомель 2011

  1. Цель работы

Изучить и практически исследовать применение команд передачи управления однокристальных микроконтроллеров семейства MCS-51 (МК51) в различных программах на персональном компьютере.

2.Основные теоретические сведения

Откройте МУ к лабораторной работе № 11 и вспомните основные команды передачи управления.

3. Порядок выполнения работы

3.1. Примеры применения команд перехода в различных программах

Для облегчения программирования на языке Ассемблера следует вначале составить структурную схему алгоритма или, по-другому, блок-схему алгоритма (сокращенно БСА). Желательно, чтобы каждому блоку БСА соответствовала одна команда микроконтроллера.

3.2.1. Необходимо разработать программу вычисления контрольной суммы массива данных, находящегося в памяти данных МК с адреса BASE и имеющего количество ячеек NUMB. Контрольной суммой называется сумма содержимого ячеек памяти, где хранятся данные, без учета переполнения. Рассмотрим реализацию этой задачи для случая BASE = 30H, NUMB = 8. Результат (контрольная сумма) будет в аккумуляторе.

Блок-схема алгоритма программы приведена на рис. 1 (Приложение). В блоке 1 производится загрузка регистра R0 – указателя адреса ячеек числом BASE, являющимся начальным адресом массива. В блоке 2 в регистр R7, который будет являться счетчиком ячеек, загружается их количество NUMB. Затем очищается аккумулятор (блок 3). В блоке 4 производится сложение содержимого аккумулятора с содержимым ячейки памяти, адрес которой находится в регистре R0 (косвенная адресация). В блоке 5 вычисляется адрес следующей ячейки массива – инкремент регистра R0. В блоке 6 декрементируется счетчик – регистр R7, а в блоке 7 проверяется на нуль его содержимое. Если (R7)  0, то выполняется переход на блок 4, т.е. продолжение цикла суммирования. Если (R7)  0, то программа выходит из цикла и заканчивается.

Задание. Создайте в Вашей папке файл sum.asm и занесите в него текст программы

BASE: EQU 30H ; Начальный адрес массива данных

NUMB: EQU 8 ; Количество элементов массива (количество ячеек)

SUM: MOV R0, #BASE ; Загрузить указатель адреса ячеек ПД

MOV R7, #NUMB ; Загрузить счетчик ячеек

CLR A ; Очистить аккумулятор

LOOP: ADD A, @R0 ; Сложение с содержимым ячейки памяти

INC R0 ; Адрес следующей ячейки

DJNZ R7, LOOP ; Декремент счетчика и цикл сложения, если (R7)  0

JMP $ ; Выход (зацикливание программы)

END ; Конец текста программы

Получите файлы sum.obj и sum.hex. Исследуйте работу программы с помощью симулятора AVSIM51 в пошаговом режиме, предварительно занеся в ячейки ПД с адреса 30H произвольные данные, например, 01H, 02H,…, 08H. Определите контрольную сумму «вручную». Сравните результат с полученным в программе.

3.2.2. Нахождение максимального числа в массиве данных. Допустим, что в памяти данных, начиная с адреса BASE, находятся целые двоичные числа без знака. Длина массива, т.е. количество ячеек равна NUMB. Блок-схема алгоритма программы приведена на рис. 2.

В блоках 1 и 2 производится инициализация регистров R0 – указателя адреса и R7 – счетчика ячеек. В блоке 3 выполняется пересылка в аккумулятор элемента массива – содержимого очередной ячейки памяти, которое объявляется (условно) максимальным. Затем в блоках 4 и 5 выполняется декремент счетчика R7 и проверка его на нуль. Если (R7)  0, то вычисляется адрес следующего элемента массива (инкремент R7). Затем содержимое аккумулятора пересылается в регистр B для временного запоминания. В блоке 9 производится сравнение содержимого аккумулятора со значением нового элемента массива. Сравнение выполняется методом вычитания. Если в результате вычитания устанавливается флаг переноса C, то это означает, что новый элемент массива больше ранее найденного максимума, поэтому он замещает его в аккумуляторе (переход на блок 3 из блока сравнения 10). Если же переноса после вычитания не произошло, то это означает, что старое содержимое аккумулятора, т.е. предыдущий элемент больше или равен новому. А так как после операции вычитания содержимое аккумулятора изменилось, то выполняется его восстановление из регистра B (блок 11) и переход программы на блок 4. Найденное максимальное число после окончания работы программы будет находиться в аккумуляторе.

Задание. Создайте в Вашей папке файл с именем max.asm и занесите в него текст программы нахождения максимального числа

BASE: EQU 30H ; Начальный адрес массива

NUMB: EQU 8 ; Количество ячеек

MAX: MOV R0, #BASE ; Регистр R0 – указатель адреса

MOV R7, #NUMB ; Регистр R7 – счетчик ячеек

NEWMAX: MOV A, @R0 ; Загрузить новый максимум

NEXT: DJNZ R7, AGAIN ; Проверка окончания

JMP $ ; Конец программы (зацикливание)

AGAIN: INC R0 ; Адрес следующей ячейки

MOV B, A ; Запоминание аккумулятора

CLR C

SUBB A, @R0 ; Сравнение с максимумом

JC NEWMAX ; Переход, если меньше

MOV A, B ; Восстановление аккумулятора

JMP NEXT ; Переход к следующему элементу

END  Конец текста программы

Получите файлы max.obj и max.hex. Произведите проверку работы программы, загрузив предварительно в ячейки памяти данных с адреса 30H по 37H произвольные данные. По содержимому аккумулятора убедитесь в правильности работы программы.

3.2.3. Требуется разработать программу подсчета количества единиц в байте. Допустим, что исходный байт находится в регистре R3. Результат работы программы (количество единиц) будет в регистре R1. Блок-схема алгоритма программы приведена на рис. 3.

В блоке 1 производится загрузка счетчика разрядов, затем очищается счетчик единиц (блок 2). Для анализа очередного разряда байта используется сдвиг аккумулятора вправо через перенос, при этом после сдвига младший бит оказывается во флаге переноса C. Перед первым сдвигом флаг C сбрасывается (блок 4). В блоке 6 анализируется флаг переноса C. Если C=0, то это значит, что очередной бит равен 0, поэтому инкремент R1 не производится. Если же C=1, то в блоке 7 инкрементируется счетчик единиц R1. В блоке 8 декрементируется счетчик разрядов байта, а в блоке 9 он проверяется на нуль. Если (R7)  0, то происходит переход на блок 5, т.е. продолжается цикл сдвига. Если (R7) = 0, то программа заканчивается.

Задание. Создайте в Вашей папке файл с именем byte_1.asm и занесите в него текст программы подсчета количества единиц в байте

BYTE_1: MOV R7, #8 ; Загрузить счетчик разрядов байта

MOV R1, #0 ; Очистить счетчик единиц

MOV A, R3 ; Пересылка исходного байта в аккумулятор

CLR C ; Сбросить флаг C

SHIFT: RRC A ; Сдвиг аккумулятора вправо через перенос

JNC MET1 ; Обойти инкремент счетчика единиц, если C = 0

INC R1 ; Инкремент счетчика единиц

MET1: DJNZ R7, SHIFT ; Переход на проверку следующего разряда байта

JMP $ ; Выход (зацикливание программы)

END  Конец текста программы

Получите файлы byte_1.obj и byte_1.hex. Выполните проверку работы программы в пошаговом и в автоматическом режимах, предварительно занеся в регистр R3 исходные данные, например, 00H, FFH, 55H.

3.2.4. Необходимо разработать программу сравнения двух 16-разрядных чисел, находящихся в памяти данных. В системе команд МК51 отсутствуют команды сравнения 16-разрядных чисел. Поэтому для выполнения сравнения можно использовать результаты вычитания чисел путем анализа флагов. Однако следует помнить, что анализировать флаги надо после вычитания старших байтов исходных чисел. Если обозначить как X первое число, а Y – второе число, то результат вычитания будет

равно 0, если (A) = 0,

X – Y = меньше 0, если C = 1,

больше 0, если C = 0, (A)  0.

Допустим, что 1-е число располагается в памяти данных, начиная с адреса ADR_1 (младший байт), а 2-е число располагается с адреса ADR_2 (младший байт). Если числа будут равны, то программа должна установить флаг пользователя F0, если не равны, то сбросить.

Блок-схема алгоритма программы сравнения приведена на рис. 4. В блоках 1 и 2 загружаются указатели адресов байтов чисел R0 – младший байт 1-го числа, R1 – младший байт 2-го числа. В блоке 3 сбрасывается флаг переноса C для подготовки выполнения команды вычитания SUBB. В блоке 4 в аккумулятор пересылается младший байт 1-го числа, а в блоке 5 производится вычитание младшего байта 2-го числа. Затем в блоке 6 выполняется инкремент указателей R0 и R1, которые теперь адресуют старшие байты чисел. В блоке 7 в аккумулятор пересылается старший байт 1-го числа, а в блоке производится вычитание старшего байта 2-го числа с учетом возможного заема после предыдущего вычитания младших байтов. В блоке 9 проверяется на нуль содержимое аккумулятора после операции вычитания. Если (A) = 0, то значит исходные числа были равны, поэтому в блоке 10 устанавливается флаг F0 и выполняется выход 1. Если (A)  0, то числа не равны, поэтому в блоке 11 проверяется флаг C. Если C=1, то 1-е число меньше 2-го, поэтому флаг F0 сбрасывается и выполняется выход 2. Если же C=0, то 1-е число больше 2-го, поэтому флаг F0 сбрасывается и выполняется выход 3.

Задание. Создайте в Вашей папке файл с именем comp.asm и занесите в него текст программы сравнения чисел

ADR_1: EQU 30H ; Адрес МлБ 1-го числа

ADR_2: EQU 38H ; Адрес МлБ 2-го числа

COMP: MOV R0, #ADR_1 ; Загрузить указатель адреса 1-го числа

MOV R1, #ADR_2 ; Загрузить указатель адреса 2-го числа

MOV A, @R0 ; Переслать в аккумулятор МлБ 1-го числа

CLR C

SUBB A, @R1 ; Вычитание младших байтов чисел

INC R0 ; Инкремент указателей байтов

INC R1

MOV A, @R0 ; Переслать в аккумулятор СтБ 1-го числа

SUBB A, @R1 ; Вычитание старших байтов чисел

JZ EQUAL ; Переход, если равно

JC LESS ; Переход, если меньше

; Больше 1-е число

CLR F0

JMP $ ; Выход 3

 Числа равны

EQUAL: SETB F0

JMP $ ; Выход 1

 Больше 2-е число

LESS: CLR F0

JMP $ ; Выход 2

END

Получите файлы comp.obj и comp.hex. Проверьте работу программы в пошаговом режиме, предварительно задавая исходные значения в ячейках 30H, 31H (1-е число) и 38H, 39H (2-е число) в соответствии с таблицей. Не забудьте, что младшие байты чисел находятся в ячейках 30H и 38H.

1-е число

0000

0F0F

FFFF

2-е число

0001

0F0F

FFF0

Флаг F0

Флаг C

3.2.5. Требуется через порты P1 и P2 ввести в микроконтроллер байты состояния двоичных датчиков. Далее нужно выполнить сравнение введенных байт и по результатам сравнения передать управление

а) в случае равенства управление передается фрагменту программы с меткой L1 и устанавливается в единицу флаг пользователя F0

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

Блок-схема алгоритма программы приведена на рис. 5. В блоке 1 программа выполняет ввод из порта P1 в аккумулятор, а в блоке 2 выполняется ввод из порта P2 в регистр B. В блоке 3 производится проверка содержимого регистров A и B на равенство. Если (A) = (B), то в блоке 4 устанавливается флаг F0 и производится переход на метку L1 программы. Если же (A)  (B), то в блоке 6 сбрасывается флаг F0 и проверяется флаг C (блок 7). Если флаг C=1, то это означает, что (A) < (B), поэтому в порт P0 выводится содержимое регистра B (блок 8) и программа переходит на метку L2. Если же C=0, то (A) > (B), и в порт P0 выводится содержимое регистра A (блок 9) и программа также переходит на метку L2.

Задание. Создайте в Вашей папке файл с именем compare.asm и занесите в него текст программы COMPARE:

COMPARE: MOV A, P1 ; Ввод из порта P1 в аккумулятор

MOV B, P2 ; Ввод из порта P2 в регистр B

CJNE A, B, CHECK ; Сравнить (A) и (B)

; Если (A) = (B)

SETB F0 ; Установить флаг F0

JMP L1

CHECK: CLR F0 ; Сбросить флаг F0

JC LESS ; Переход, если C=1, т.е. (A) < (B)

; Если (A) > (B)

MOV P0, A ; Вывод в порт P0

JMP L2

; Если (A) < (B)

LESS: MOV P0, B ; Вывод в порт P0

L2: JMP $  Зацикливание программы

L1: JMP $

END  Конец текста программы

Получите файлы compare.obj и compare.hex. Выполните проверку работы программы в пошаговом режиме, задавая предварительно на входах портов P1 и P2 исходные данные из таблицы.

Входы порта P1

AAH

88H

44H

Входы порта P2

55H

88H

BBH

Выходы порта P0

Флаг F0

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]