Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Цвинтарный Иван 362-1 Лабораторная работа 1

.docx
Скачиваний:
11
Добавлен:
21.06.2023
Размер:
39.43 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Федеральное государственное бюджетное образовательное учреждение высшего образования

«Томский государственный университет систем управления и радиоэлектроники» (ТУСУР)

Кафедра промышленной электроники (ПрЭ)

Программная модель и система команд МК51

Пояснительная записка к лабораторной работе № 1

по дисциплине "Цифровая и микропроцессорная техника

Вариант 10

Выполнил:

Студент гр. 362-1

Цвинтарный И.В.

«___» _______ 2023 г.

Проверил:

Преподаватель, Доцент,

Кандидат технических наук

Воронин А.И.

«___» _______ 2023 г.

Томск 2023

ВВЕДЕНИЕ

Целью лабораторной работы является приобретение навыков программирования на языке Ассемблер и использования интегрированной среды разработки MSU 8051 IDE при отладке прикладных программ для однокристальных микроконтроллеров семейства MCS-51.

1.ЗАДАНИЕ № 1

Создать проект, имя проекта должно быть уникальным, набрано латинским шрифтом. Рекомендуется все программы по циклу лабораторных работ записывать в одном проекте. Определив номер варианта (от N=1 до N=12), создать программу TEST.ASM.

Задачи: написать комментарий к каждой строке программы. До выполнения программы зафиксировать значение указателя стека.

VAR EQU 10 ; Определяем константу VAR и присваиваем ей значение варианта (т.е. 10)

X EQU (512/2+(VAR)); Определяем константу X как половины значения 512, увеличенного на значение VAR

Y SET LOW(X) ; Определяем константу Y как младшего байта константы X

Z SET HIGH(X) ; Определяем константы Z как старшего байта константы X

ABC SET 'A' ; Определяем константы ABC и присвоение ей значения 'A'

ORG 0H ; Установка адреса начала программы

MOV R0, #Y ; Помещаем значение константы Y (младший байт адреса X) в регистр R0

MOV R1, #Z ; Помещаем значение константы Z (старший байт адреса X) в регистр R1

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

MOV R2, A ; Помещаем значение результата подпрограммы CHAR (ABC+1+VAR) в регистр R2

JMP $ ; Бесконечный цикл, переходит на текущий адрес и выполняет его бесконечное число раз

CHAR:

MOV A, #(ABC+1) ; Загружает в регистр A значение ABC+1 (т.е. B)

ADD A, #VAR ; Добавляет к значению в регистре A значение VAR (т.е. 10)

RET ; Возврат из подпрограммы CHAR

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

Объяснить содержимое R0, R1, R2 после выполнения программы.

В R0 содержится младший байт (0A), в R1 – старший байт (01), в R2 – значение В+10 (4C)

С какого адреса располагается стек?

Стек начинается с адреса 08H

Что находится в вершине стека?

На вершине стека находится значение, которое вернет программа по выполнении работы

2.ЗАДАНИЕ № 2

Проверить работу программы IND.asm. Программа считает количество нажатий кнопки в двоично-десятичном коде подключенной к Р3.2 и выводит на двухразрядный семисегментный индикатор число нажатий кнопки.

Задачи: написать комментарий к программе.

org 0 ; Установка адреса начала программы в 0

mov dptr,#0050h ; Загрузка адреса таблицы символов в регистр DPTR

mov a, #0h ; Загрузка значения 0 в регистр A

m1: ; Метка цикла

jb p3.2, $ ; Если кнопка не нажата, то переходим на текущий адрес ($)

jnb p3.2, $ ; Если кнопка нажата, то переходим на текущий адрес ($)

inc a ; Увеличиваем значение в регистре A на 1

da a ; Декадно-корректирующее преобразование регистра A

call simvol ; Вызов процедуры simvol

jmp m1 ; Бесконечный цикл, переходит на метку m1

simvol:

push acc ; Сохранение значения регистра A в стеке

mov b, a ; Копирование значения регистра A в регистр B

anl a, #0fh ; Извлечение младшей четырехбитной части значения в регистре A

movc a, @a+dptr ; Загрузка кода символа в регистр A из таблицы символов

mov p1, a ; Запись кода символа в первый разряд семисегментного индикатора

mov a, b ; Восстановление значения регистра A из регистра B

swap a ; Обмен старшей и младшей четырехбитных частей значения в регистре A

anl a, #0fh ; Извлечение младшей четырехбитной части значения в регистре A

movc a, @a+dptr ; Загрузка кода символа в регистр A из таблицы символов

mov p2, a ; Запись кода символа во второй разряд семисегментного индикатора

pop acc ; Восстановление значения регистра A из стека

ret ; Возврат из процедуры simvol

org 50h ; Установка адреса начала таблицы символов

db 11000000b ; Код символа '0'

db 11111001b ; Код символа '1'

db 10100100b ; Код символа '2'

db 10110000b ; Код символа '3'

db 10011001b ; Код символа '4'

db 10010010b ; Код символа '5'

db 10000010b ; Код символа '6'

db 11111000b ; Код символа '7'

db 10000000b ; Код символа '8'

db 10010000b ; Код символа '9'

end ; Конец программы

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

В начале программы происходит загрузка адреса таблицы символов в регистр DPTR, а затем происходит бесконечный цикл, в котором значение в регистре A увеличивается на 1 при каждом проходе цикла. Перед выводом значения на индикатор происходит вызов процедуры simvol, в которой значение в регистре A преобразуется в код символа на основе таблицы символов. Код символа затем записывается в первый и второй разряды семисегментного индикатора, после чего происходит возврат из процедуры simvol и цикл начинается заново

3. ЗАДАНИЕ № 3

Разработать и отладить на эмуляторе индивидуальное задание в соответствии со своим вариантом:

Рисунок 3.1 – Вариант индивидуального задания

org 0h

mov dptr, #050h ;Загрузка адреса таблицы символов

;Метка m1

m1: jb p3.2, $ ;Переход дальше, если кнопка нажата

clr c ;Сброс бита переноса

jnb p3.2, $ ;Переход, если бит равен нулю

mov a, p0 ;Передаём значение порта P0 в аккумулятор

mov b, a ;Помещаем значение аккумулятора в расширитель

anl b, #0fh ;Логическое И константы и расширителя аккумулятора

swap a ;Меняем местами тетрады в аккумуляторе

anl a, #0fh ;Логическое И константы и аккумулятора

subb a, b ;Складываем

mov r0, a ;Пересылаем в регистрR 0 значение аккумулятора

subb a, #0ah ;Вычитаем из аккумулятора константы и число, которое занимали

mov a, r0 ;Пересылаем в регистр аккумулятор значение регистра R0

jc $+4 ;Переход, если перенос равен единице

mov a, #0ah ;Загрузка константы в аккумулятор

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

jmp m1 ;Переход на метку m1

;Метка simvol

simvol: movc a, @a+dptr ;Пересылаем в аккумулятор байт из памяти программ

mov p2, a ;Передаём значение аккумулятора на порт P2

ret ;Возврат из подпрограммы

org 50h

db 11000000b ; 0

db 11111001b ; 1

db 10100100b ; 2

db 10110000b ; 3

db 10011001b ; 4

db 10010010b ; 5

db 10000010b ; 6

db 11111000b ; 7

db 10000000b ; 8

db 10010000b ; 9

db 10111111b ;-

end ;Завершение программы

4. КОНТРОЛЬНЫЕ ВОПРОСЫ

4.1. Чему равно содержимое регистров МК51 после системного сброса?

После системного сброса содержимое всех регистров обнуляется. Указатель стека устанавливается в адрес памяти начала программы (07Н).

4.2. Чем отличаются друг от друга команды MOV R5,7 и MOV 5,#7?

Команда MOV R5,7загружает значение 7 в регистр R5

Команда MOV 5,#7 загружает значение 7в ячейку памяти по адресу 5, т.е. число будет не записано не в регистр, а по адресу памяти 5

4.3. Как выполняется команда MUL AB?

Команда MUL AB используется для умножения содержимого регистров А и В. Сначала происходит умножение (произведение двух 8-ми битных беззнаковых чисел), после чего результат сохраняется. Старшая часть в В, младшая в А. Если результат умножения превышает 16 байт, то старшие биты будут утеряны.

4.4. С помощью каких команд можно прочитать в регистр В информацию с датчиков, подключенных к линиям порта Р1?

Для этого можно использовать команду MOV и MOVC

Например: MOV A, P1;Передача значений порта Р1 в аккумулятор

ЗАКЛЮЧЕНИЕ

В ходе лабораторной работы приобрел навыки программирования на языке Ассемблер, научился пользоваться средой разработки MSU 8051 IDE.