Файл: Команды передачи управления. Организация циклов.docx

ВУЗ: Не указан

Категория: Отчет по практике

Дисциплина: Не указана

Добавлен: 09.11.2023

Просмотров: 31

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНОБРНАУКИ РОССИИ

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

высшего образования

«Тверской государственный технический университет»

(ТвГТУ)

Факультет Информационных Технологий

Кафедра ЭВМ

Отчёт к лабораторной работе № 2

по дисциплине: «Проектирование специализированных компьютерных систем»

на тему: «Команды передачи управления. Организация циклов»

Выполнил: студент группы

Б.ИВТ.ВМКСС-19.03

Макаров М.К.

Принял: Филиппов Р.Н.

Тверь,

2023

Цель работы

Изучение организации пространства памяти программ микроконтроллера КМ1816ВЕ51, программных средств управления ходом выполнения программы, приобретение навыков программирования циклических алгоритмов в кодах микроконтроллера.

Задание

Вариант №18

НОМЕР

ADR1

ADR2

N

ADR3

 14

4D3

1F2

A

5B

Часть 1:

Пусть в памяти программ, начиная с ячейки ADR2, расположена таблица кодов длиной N. Записать в кодах МК К1816ВЕ51 программу, которая выполняет пересылку данного массива в RAM, начиная с адреса ADR3. Программа должна начинаться с ячейки ADR1. Коды данных задать произвольно.

Часть 2:

Собрать схему, в результате работы которой:

  • с клавиатуры вводятся числа;

  • записываются во внешнюю память МК (пространство XSEG).



Теоретическая часть

Пространство памяти программ CSEG

Для хранения программ и неизменяемых данных в МК 1816ВЕ51 используется логическое однородное линейное пространство памяти CSEG объемом 64Кбайт. Память программ адресуется 16-разрядным счетчиком РС. Младшие 4Кбайт этого пространства соответствует встроенному EPROM микроконтроллера, остальные 60 Кбайт реализуются внешним относительно МК схемами.

В пространстве CSEG выделяются следующие точки (адреса):

0000Н - RESET - стартовый адрес при сбросе системы;

0003H - EXTI0 - внешнее прерывание 0;


000BH - TIMER0 - прерывание таймера/счетчика 0;

0013H - EXTI1 - внешнее прерывание 1;

001BH - TIMER1 - прерывание таймера / счетчика 1;

0023H - SINT - прерывание последовательного порта;

002BH - TIMER2 - прерывние таймера 2 (для MCS 52).

В CSEG определены два способа передачи управления:

1. Прямая адресация с помощью 16- разрядного прямого адреса ad16;

2. Относительная адресация, имеющая два варианта: с помощью 8- разрядного смещения куд (целое двоичное со знаком) относительно РС [(A)+(PC0] или DPTR [(A)+(DPTR)].

Для двух команд (AJMP, ACALL) предусмотрена страничная адресация в CSEG, с помощью 11-разрядного адреса ad11. В этом случае 8 младших разрядов адреса располагаются во втором байте команды, а 3 старших - в трех старших разрядах первого байта команды:



Номер страницы задается пятью старшими разрядами программного счетчика РС.

Необходимо подчеркнуть также, что в группе пересылки существуют специальные команды MOVC A,@A+DPTR и MOVC A,@A+PC, которые позволяют считывать содержимое памяти программ программ. Как правило эта возможность используется для организации таблиц констант в CSEG.

Команды передачи управления

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

В большинстве команд используется прямая адресация. Характеристики команд приведены в следующей таблице:



МНЕМОНИКА

КОП

Б

Ц

ОПЕРАЦИЯ

 

LJMP ad16

00000010

3

2

(PC) := ad16

 

AJMP ad11

aaa00001

2

2

(PC) := (PC) + 2

(PC[0-10] ) := ad11

 

SJMP rel

10000000

2

2

(PC) := (PC) + 2

(PC) := (PC) + rel

 

JMP @A+DPTR

01110011

1

2

(PC) := (A) + (DPTR)

 

JZ rel

01100000

2

2

(PC) := (PC) + 2; если (A) == 0

то (PC) := (PC)+rel

 

JNZ rel

01110000

2

2

(PC) := (PC) + 2; если (A) != 0

то (PC) := (PC)+rel

 

JC rel

01000000

2

2

(PC) := (PC) + 2; если (C) == 1

то (PC) := (PC)+rel

 

JNC rel

01010000

2

2

(PC) := (PC) + 2; если (C) == 0

то (PC) := (PC)+rel

 

JB bit, rel

00100000

3

2

(PC) := (PC) + 3; если (b) == 1

то (PC) := (PC)+rel

 

JNB bit,rel

00110000

3

2

(PC) := (PC) + 3; если (b) == 0

то (PC) := (PC)+rel

 

JBC bit, rel

00010000

3

2

(PC) := (PC) + 3; если (b) == 1

то (PC) := (PC)+rel, (b) :=0

 

DJNZ Rn, rel

11011rrr

2

2

(PC) := (PC)+ 2, (Rn) := (Rn) - 1; если (Rn) != 0

то (PC) := (PC)+rel

 

DJNZ ad, rel

11010101

3

2

(PC) := (PC)+ 3, (ad) := (ad) - 1; если (ad) != 0

то (PC) := (PC)+rel

 

CJNZ A, ad, rel

10110101

3

2

(PC) := (PC)+ 3;

если (A) != ad,

то (PC) := (PC)+rel;

если (А)<(ad), то (С):=1,

иначе (С) := 0;

 

CJNE A, #d, rel

10110100

3

2

(PC) := (PC)+ 3;

если (A) != #d,

то (PC) := (PC)+rel;

если (А)<(#d), то (С):=1,

иначе (С) := 0;

 

CJNZ Rn, #d, rel

10111rrr

3

2

(PC) := (PC)+ 3;

если (Rn) != #d,

то (PC) := (PC)+rel;

если (Rn)<(ad), то (С):=1,

иначе (С) := 0;

 

CJNZ @Ri, #d, rel

1011011i

3

2

(PC) := (PC)+ 3;

если ((Ri)) != #d,

то (PC) := (PC)+rel;

если ((Ri))<(#d), то (С):=1,

иначе (С) := 0;

 

LCALL ad16

00010010

3

2

(PC) := (PC)+3, (SP) := (SP) + 1

((SP)) := (PCL), (SP) := (SP)+1

((SP)) := (PCH), (PC) := ad16

 

ACALL ad11

aaa10001

2

2

(PC) := (PC)+2, (SP) := (SP) + 1

((SP)) := (PCL), (SP) := (SP)+1

((SP)):=(PCH), (PC[0-10]):= ad11

 

RET

00100010

1

2

(PCH) :=((SP)), (SP) := (SP) + 1,

(PCL) := ((SP)), (SP) := (SP) -1

 

RETI

00110010

1

2

(PCH) :=((SP)), (SP) := (SP) + 1,

(PCL) := ((SP)), (SP) := (SP) -1

 

NOP

00000000

1

1

(PC) := (PC) + 1


Таблица 1. Группа команд передачи управления

Практическая часть

Часть 1

Для выполнения данной задачи сначала необходимо добавить на схему микроконтроллер 80C51, в который далее нужно будет загружать код программы в шестнадцатеричном формате. Можно воспользоваться схемой из предыдущей лабораторной работы, просто заменив в ней код на языке ассемблера.



Рисунок 1. Добавление микроконтроллера 80C51 в проект.

Код программы, который выводит строку «Yakovlev»:

jmp start

org 1F2H

db '$Makarov',0

org 4D3H

start:

MOV DPTR,#01F2H

MOV R0,#5BH

MOV R1,#0AH

m2: MOV A,R1

MOVC A,@A+DPTR

MOV @R0, A

DJNZ R0, m1

m1: DJNZ R1, m2

NOP

RET

END

После сборки и компиляции написанного кода появляется файл Debug.HEX, содержимое которого показано на рис. 2.



Рисунок 2. Содержимое файла Debug.hex.

Далее приведены окна ячеек памяти, используемые во время отладки приложения:



Рисунок 3. Окно ячеек памяти (SFR).

Часть 2

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



Рисунок 4. Схема клавиатуры с микроконтроллером и семисегментными индикаторами.

Ниже представлен модернизированный код программы предыдущей лабораторной работы, который позволяет выводить числа на индикаторы:

ORG 0255h
start:

MOV DPTR, #0781

MOV P2, #00000000b
chk: JB p1.5,chk ;проверка нажатия на число

SETB p1.7

m2: SWAP A
bit0: JB P1.0,bit1 ;считывание заданного числа побитно

ADD A,#00000001b

bit1: JB P1.1,bit2 ;считывание заданного числа побитно


ADD A,#00000010b
bit2: JB P1.2,bit3 ;считывание заданного числа побитно

ADD A,#00000100b
bit3: JB P1.3,m1 ;считывание заданного числа побитно

ADD A,#00001000b
m1: CALL delay

CALL delay

CALL delay

;ожидание дальнейших действий

number: JB p1.7,rst

JMP m2
rst: JB p1.6,mem ;сброс введённого числа

CLR A

JMP chk ;возврат на ожидание ввода числа
mem: JB p1.4,number ;запоминание числа

MOVX @DPTR,A

MOV P2, A

INC DPTR

CLR A

JMP chk
delay: MOV R7,#255

ZD0: MOV R6,#255

MOV R5,#255

ZD1: DJNZ R6,ZD1

ZD2: DJNZ R5,ZD2

DJNZ R7,ZD0

RET

END



Рисунок 5. Содержимое файла Debug.hex.

Результат ввода и запоминания числа выглядит следующим образом:



Рисунок 6. Результат ввода числа 45.

При нажатии на кнопку запоминания можно наблюдать, как записывается введённое число, а также значение регистра R0 увеличивается на количество записей (запоминаний). Число из аккумулятора записывается в соответствующую ячейку памяти.



Рисунок 7. Окно ячеек памяти (SFR).



Рисунок 8. Окно ячеек памяти (IDATA).

Вывод

В результате выполнения данной лабораторной работы были изучены организация пространства памяти программ микроконтроллера КМ1816ВЕ51 и программных средств управления ходом выполнения программы. Приобретены навыки программирования циклических алгоритмов в кодах микроконтроллера.

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

Во второй части построена схема шестнадцатеричной клавиатуры с микроконтроллером и двумя семисегментными индикаторами, на которые выводились шестнадцатеричные числа. В микроконтроллер также была записана программа на языке ассемблера, в результате сборки которой можно было наблюдать перемещение введённых данных по регистрам и битам микроконтроллера с помощью инструментов отладки программного средства Proteus, а также их отображение на индикаторах.