Добавлен: 09.11.2023
Просмотров: 142
Скачиваний: 5
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНОБРНАУКИ РОССИИФедеральное государственное бюджетное образовательное учреждениевысшего образования«Тверской государственный технический университет»(ТвГТУ)Факультет Информационных ТехнологийКафедра ЭВМОтчёт к лабораторной работе № 2по дисциплине: «Проектирование специализированных компьютерных систем»на тему: «Команды передачи управления. Организация циклов»Выполнил: студент группыБ.ИВТ.ВМКСС-19.03Макаров М.К.Принял: Филиппов Р.Н.Тверь, 2023Цель работыИзучение организации пространства памяти программ микроконтроллера КМ1816ВЕ51, программных средств управления ходом выполнения программы, приобретение навыков программирования циклических алгоритмов в кодах микроконтроллера.ЗаданиеВариант №18
Часть 1:Пусть в памяти программ, начиная с ячейки ADR2, расположена таблица кодов длиной N. Записать в кодах МК К1816ВЕ51 программу, которая выполняет пересылку данного массива в RAM, начиная с адреса ADR3. Программа должна начинаться с ячейки ADR1. Коды данных задать произвольно.Часть 2:Собрать схему, в результате работы которой:
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.Команды передачи управленияГруппу команд передачи управления образуют команды безусловного перехода, безусловного перехода, команды вызова подпрограмм и команды возврата из подпрограммы.В большинстве команд используется прямая адресация. Характеристики команд приведены в следующей таблице:
Таблица 1. Группа команд передачи управленияПрактическая частьЧасть 1Для выполнения данной задачи сначала необходимо добавить на схему микроконтроллер 80C51, в который далее нужно будет загружать код программы в шестнадцатеричном формате. Можно воспользоваться схемой из предыдущей лабораторной работы, просто заменив в ней код на языке ассемблера.Рисунок 1. Добавление микроконтроллера 80C51 в проект.Код программы, который выводит строку «Yakovlev»:jmp startorg 1F2Hdb '$Makarov',0org 4D3Hstart:MOV DPTR,#01F2HMOV R0,#5BHMOV R1,#0AHm2:MOV A,R1MOVC A,@A+DPTRMOV @R0, ADJNZ R0, m1m1: DJNZ R1, m2NOPRETENDПосле сборки и компиляции написанного кода появляется файл Debug.HEX, содержимое которого показано на рис. 2.Рисунок 2. Содержимое файла Debug.hex.Далее приведены окна ячеек памяти, используемые во время отладки приложения:Рисунок 3. Окно ячеек памяти (SFR).Часть 2Во второй части данной лабораторной работы необходимо немного модернизировать схему клавиатуры с микроконтроллером из прошлой лабораторной работы, добавив в неё два семисегментных индикатора для вывода чисел в шестнадцатеричном формате. Полная схема изображена на рис. 5.Рисунок 4. Схема клавиатуры с микроконтроллером и семисегментными индикаторами.Ниже представлен модернизированный код программы предыдущей лабораторной работы, который позволяет выводить числа на индикаторы:ORG 0255hstart:MOV DPTR, #0781MOV P2, #00000000bchk:JB p1.5,chk ;проверка нажатия на числоSETB p1.7m2: SWAP Abit0:JB P1.0,bit1 ;считывание заданного числа побитноADD A,#00000001bbit1:JB P1.1,bit2 ;считывание заданного числа побитно
ADD A,#00000010bbit2:JB P1.2,bit3 ;считывание заданного числа побитноADD A,#00000100bbit3:JB P1.3,m1 ;считывание заданного числа побитноADD A,#00001000bm1:CALL delayCALL delayCALL delay;ожидание дальнейших действийnumber:JB p1.7,rstJMP m2rst:JB p1.6,mem ;сброс введённого числаCLR AJMP chk ;возврат на ожидание ввода числаmem:JB p1.4,number ;запоминание числаMOVX @DPTR,AMOV P2, AINC DPTRCLR AJMP chkdelay:MOV R7,#255ZD0:MOV R6,#255MOV R5,#255ZD1: DJNZ R6,ZD1ZD2: DJNZ R5,ZD2DJNZ R7,ZD0RETENDРисунок 5. Содержимое файла Debug.hex.Результат ввода и запоминания числа выглядит следующим образом:Рисунок 6. Результат ввода числа 45.При нажатии на кнопку запоминания можно наблюдать, как записывается введённое число, а также значение регистра R0 увеличивается на количество записей (запоминаний). Число из аккумулятора записывается в соответствующую ячейку памяти.Рисунок 7. Окно ячеек памяти (SFR).Рисунок 8. Окно ячеек памяти (IDATA).ВыводВ результате выполнения данной лабораторной работы были изучены организация пространства памяти программ микроконтроллера КМ1816ВЕ51 и программных средств управления ходом выполнения программы. Приобретены навыки программирования циклических алгоритмов в кодах микроконтроллера.В первой части лабораторной работы была написана простая программа на языке ассемблера для ознакомления с работой микроконтроллера.Во второй части построена схема шестнадцатеричной клавиатуры с микроконтроллером и двумя семисегментными индикаторами, на которые выводились шестнадцатеричные числа. В микроконтроллер также была записана программа на языке ассемблера, в результате сборки которой можно было наблюдать перемещение введённых данных по регистрам и битам микроконтроллера с помощью инструментов отладки программного средства Proteus, а также их отображение на индикаторах.
| НОМЕР | ADR1 | ADR2 | N | ADR3 |
| 14 | 4D3 | 1F2 | A | 5B |
-
с клавиатуры вводятся числа; -
записываются во внешнюю память МК (пространство XSEG).
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 startorg 1F2Hdb '$Makarov',0org 4D3Hstart:MOV DPTR,#01F2HMOV R0,#5BHMOV R1,#0AHm2:MOV A,R1MOVC A,@A+DPTRMOV @R0, ADJNZ R0, m1m1: DJNZ R1, m2NOPRETENDПосле сборки и компиляции написанного кода появляется файл Debug.HEX, содержимое которого показано на рис. 2.Рисунок 2. Содержимое файла Debug.hex.Далее приведены окна ячеек памяти, используемые во время отладки приложения:Рисунок 3. Окно ячеек памяти (SFR).Часть 2Во второй части данной лабораторной работы необходимо немного модернизировать схему клавиатуры с микроконтроллером из прошлой лабораторной работы, добавив в неё два семисегментных индикатора для вывода чисел в шестнадцатеричном формате. Полная схема изображена на рис. 5.Рисунок 4. Схема клавиатуры с микроконтроллером и семисегментными индикаторами.Ниже представлен модернизированный код программы предыдущей лабораторной работы, который позволяет выводить числа на индикаторы:ORG 0255hstart:MOV DPTR, #0781MOV P2, #00000000bchk:JB p1.5,chk ;проверка нажатия на числоSETB p1.7m2: SWAP Abit0:JB P1.0,bit1 ;считывание заданного числа побитноADD A,#00000001bbit1:JB P1.1,bit2 ;считывание заданного числа побитно
ADD A,#00000010bbit2:JB P1.2,bit3 ;считывание заданного числа побитноADD A,#00000100bbit3:JB P1.3,m1 ;считывание заданного числа побитноADD A,#00001000bm1:CALL delayCALL delayCALL delay;ожидание дальнейших действийnumber:JB p1.7,rstJMP m2rst:JB p1.6,mem ;сброс введённого числаCLR AJMP chk ;возврат на ожидание ввода числаmem:JB p1.4,number ;запоминание числаMOVX @DPTR,AMOV P2, AINC DPTRCLR AJMP chkdelay:MOV R7,#255ZD0:MOV R6,#255MOV R5,#255ZD1: DJNZ R6,ZD1ZD2: DJNZ R5,ZD2DJNZ R7,ZD0RETENDРисунок 5. Содержимое файла Debug.hex.Результат ввода и запоминания числа выглядит следующим образом:Рисунок 6. Результат ввода числа 45.При нажатии на кнопку запоминания можно наблюдать, как записывается введённое число, а также значение регистра R0 увеличивается на количество записей (запоминаний). Число из аккумулятора записывается в соответствующую ячейку памяти.Рисунок 7. Окно ячеек памяти (SFR).Рисунок 8. Окно ячеек памяти (IDATA).ВыводВ результате выполнения данной лабораторной работы были изучены организация пространства памяти программ микроконтроллера КМ1816ВЕ51 и программных средств управления ходом выполнения программы. Приобретены навыки программирования циклических алгоритмов в кодах микроконтроллера.В первой части лабораторной работы была написана простая программа на языке ассемблера для ознакомления с работой микроконтроллера.Во второй части построена схема шестнадцатеричной клавиатуры с микроконтроллером и двумя семисегментными индикаторами, на которые выводились шестнадцатеричные числа. В микроконтроллер также была записана программа на языке ассемблера, в результате сборки которой можно было наблюдать перемещение введённых данных по регистрам и битам микроконтроллера с помощью инструментов отладки программного средства Proteus, а также их отображение на индикаторах.