Результати роботи
0 0 0 0 X1 X2 X3 0
Лабораторна робота №2
Тема: Складання простих програм на прикладі програмування звукових ефектів
Мета: Написати програму, що створює гудки пивної частоти, проекспериментувати з програмою і на основі результатів зробити висновки.
У мікропроцесорній лабораторії гучномовець приєднано до молодшого біта порта світло-діодів. Якщо змінювати по послідовному каналу десятки разів на секунду стан молодшого біта порту з одиниці на нуль і навпаки, то в гучномовці буде звук певної частоти. Наприклад, нота «ля» 1-ої октави-це коливання фізичного тіла (камертон, струна) 440 раз в секунду, тобто 440 Гц. Програмним шляхом можна змінювати часові затримки між командами (імпульсами) і тим самим змінювати висоту звуку.
Завдання 1
Відтранслювати та виконати програму, яка видає гудок певної частоти.
Знаки запитання у програмі означають довільний байт. Зірочками помічені команди, які треба поміняти для виконання наступного етапу.
Результат
Адреса |
Програма |
Коментар |
8000 |
NOP |
Зарезервоване місце |
8001 |
NOP |
Порожні команди |
8002 |
MVI A, #81 |
Завантажити в акумулятор код для програмування інтефейсу |
8004 |
OUT #FB |
Вивести вміст акумулятора на програмний порт інтерфейсу |
8006 |
M1: INR A |
Інвертування молодшого біта шляхом збільшення на одиницю |
8007 |
MVI C, #FF |
Завантажити в регістр “С” період затримки між імпульсами, вираженими у часі виконання команд “DCR” та “JNZ” |
8009 |
M2: DCR C |
Зменшення лічильника циклів затримки на одиницю |
800A |
JNZ M2 |
Перехід на початок циклу |
800D |
OUT #F9 |
Вивід молодшого біта акумулятора на гучномовець |
800F |
NOP |
Зарезервоване місце для подальших етапів роботи |
8010 |
JMP M1 |
Перехід на підготовку до виконання наступного імпульсу |
Завдання 2
Замінити у введеній програмі команди, що помічені зірочками. Запустити програму. Визначити за яким законом змінюється частота звуку.
Результат
Адреса |
Програма |
Коментар |
8000 |
NOP |
Зарезервоване місце |
8001 |
NOP |
Порожні команди |
8002 |
MVI A, #81 |
Завантажити у акумулятор код для програмування інтерфейсу |
8004 |
OUT #FB |
Вивести вміст акумулятора на програмний порт інтерфейсу |
8006 |
M1: INR B |
інкремент регістра В (інвертувати молодший біт регістру В) |
8007 |
MOV A, B |
Вміст регістра В передати в акумулятор А |
8008 |
MOV C, B |
Підготовка до затримки |
8009 |
M2: DCR C |
Зменшення лічильника циклів затримки на одиницю |
800A |
JNZ M2 |
Реалізація затримки |
800D |
OUT #F9 |
Вивід інвертованого імпульсу на гучномовець |
800F |
NOP |
Зарезервоване місце для подальших етапів роботи |
8010 |
JNZ M1 |
Перехід на підготовку до видачі наступного імпульсу |
Завдання 3
Виконати програму, яка видає короткий гудок і зупиняється.
Результат
Адреса |
Програма |
Коментар |
8000 |
+MVI E, #FF |
Завантажити у регістр “Е” кількість імпульсів, яку треба видати на гучномовець |
8002 |
MVI A, #81 |
Завантажити в акумулятор код для програмування інтерфейсу |
8004 |
OUT #FB |
Вивести вміст акумулятора на програмуючий порт інтерфейсу |
8006 |
M1: INR A |
Інвертування молодшого біта шляхом збільшення на одиницю |
8007 |
MVI C, #FF |
Завантажити у регістр “С” період затримки між імпульсами, вираженими у часі виконання команд “DCR” та “INZ” |
8009 |
M2: DCR C |
Зменшення лічильника циклів затримки на одиницю |
800A |
JNZ M2 |
Перехід на початок циклу, якщо не нуль |
800D |
OUT #F9 |
Вивід інвертованого імпульсу на гучномовець |
800F |
DCR E |
Зменшити лічильник імпульсів на одиницю |
8010 |
JNZ M1 |
Перехід на підготовку до видачі наступного імпульсу, якщо не нуль |
8013 |
HLT |
Зупинка процесора |
Завдання 4
З поданої вище програми зробити підпрограму, яка видає гудок у залежності від коду натиснутої клавіші. Основну програму розмістити в пам’яті за адресою #8100. У основній програмі використання підпрограми вводу з клавіатури, яка знаходиться у моніторі за адресою #216. Код клавіші після звернення до підпрограми буде знаходитись в акумуляторі.
Результат
Адреса |
Програма |
Коментар |
8100 |
M3: CALL #0216 |
Опитати клавіатуру |
8103 |
RLC |
Збільшити код клавіші в 4 рази |
8104 |
RLC |
|
8105 |
MOV B, A |
Зберегти його у “В” як параметр частоти |
8106 |
CALL #8000 |
Викликати підпрограму для видачі звуку |
8109 |
JMP M3 |
Зробити нескінчений цикл |
|
|
|
8000 |
MVI E, #FF |
Завантажити у регістр “Е” кількість імпульсів, яку треба видати на гучномовець |
8002 |
MVI A, #81 |
Завантажити в акумулятор код для програмування інтерфейсу |
8004 |
OUT #FB |
Вивести вміст акумулятора на програмуючий порт інтерфейсу |
8006 |
M1: INR A |
Інвертування молодшого біта шляхом збільшення на одиницю |
8007 |
MOV C, B |
Переслати у регістр “С” параметри затримки |
8008 |
NOP |
Порожня команда |
8009 |
M2: DCR C |
Зменшення лічильника циклів затримки на одиницю |
800A |
JNZ M2 |
Перехід на початок циклу, якщо не нуль |
800D |
OUT #F9 |
Вивід інвертованого імпульсу на гучномовець |
800F |
DCR E |
Зменшити лічильник імпульсів на одиницю |
8010 |
JNZ M1 |
Перехід на підготовку до видачі наступного імпульсу, якщо не нуль |
8013 |
RET |
Безумовне повернення з підпрограми |