Цвинтарный Иван 362-1 Лабораторная работа 1
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Томский государственный университет систем управления и радиоэлектроники» (ТУСУР)
Кафедра промышленной электроники (ПрЭ)
Программная модель и система команд МК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.