Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга. Гуржій. 1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
3.53 Mб
Скачать

Void tm_delay(int ticks) {

asm {

push si

mov si, ticks

mov ah, О

int lah

mov bx, dx

add bx, si

}

delay_loop:

asm {

int lah

cmp dx, bx

jne delay_loop

pop si

}

}

//Функція формування частоти звучання ноти

Void tm_sound(int freq, int time){

unsigned long cnt;

outp(0x43,0xb6);

cnt = (unsigned int)(1193180L / freq);

asm{

push ax

mov ax, cnt

out 0x42, al

mov al, ah

out 0x42, al

in al, 0x6

or al, 00000011b

out 0x61, al

pop ax

}

}

//Програма виконує просту мелодію

Void main(){

int і;

for (i=0 ;mary[i] != 0 ;i++)

tm_sound(mary[i] , del[i]); }

Запускайте цю програму та слухайте, як вона працює!

Для підготовки таблиць частот за нотами Вам допо­можуть підручники з елементарної теорії музики та наступ­на таблиця, в якій наведені частоти для другої октави в гер­цах. Для інших октав при зниженні або підвищенні тону значення частот треба множити (при підвищенні тону) або ділити (при зниженні тону) на 2.

До

До-дієз

Ре

Ре-

дієз

Мі

Фа

Фа-дієз

Соль

Соль-

дієз

Ля-дієз

Ля

Сі

261,7

277,2

293,7

311,1

329,6

349,2

370,0

392,0

415,3

440,0

466,2

493,9

Генерація випадкових чисел

Останнє, що ми зробимо з таймером,— навчимося отримувати від нього випадкові числа. Для генерації випадкових чисел краще використовувати канал 2 в режимі 3. У регістр лічильника каналу ми занесемо значення, що дорівнює діапазону потрібних нам випадкових чисел. Наприклад, якщо ми запишемо в регістр число 80 та запустимо канал таймера, отримані випадкові числа будуть лежати в діапазоні від 0 до 79.

Пропонуємо для розгляду функцію rnd_set(), що призна­чена для початкової ініціалізації генератора випадкових чисел, в якості якого будемо використовувати лічильник другого каналу таймера:

//random.c #include <dos.h>

/* Функція rndset встановлює канал 2 таймера для вико­ристання в якості генератора випадкових чисел, пара­метр bound визначає верхню межу діапазону (0—bound)*/

void rnd_set(int bound) {

//Встановлюємо режим 3 для другого каналу таймера outp(0x43, 0xb6); ;

//Завантажуємо регістр лічильника таймера — спочатку молодший, далі старший байт

outp(0x42, bound & OxOOff);

outp(0x42, (bound & OxffOO) » 8);

// Дозволяємо роботу каналу outp(0x61, іпр(Охбі) І 1);

і = іпр(0х42);

і = (іпр(0х42) « 8) + і;

return(i);

Void main() { int I,j; clrscr();

rnd_set(100); //Задаємо діапазон чисел ( 0 - bond = 100) for (i=l;i<40;i++) { //Задаємо кількість //випадкових чисел

printf(« % d»,rnd_getO); //Видаємо числа на екран getchar();

Функцію ініціалізації rnd_set() каналу 2 таймера використовуємо для формування заданої кількості псевдо-випадкових чисел у заданому діапазоні з виводом їх на екран дисплея.

//randoml.c #include <dos.h>

//Функція rnd_set з попереднього прикладу "random.с" void rnd_set(int bound) { outp(0x43, 0xb6); outp(0x42, bound & OxOOff); outp(0x42, (bound & OxffOO) » 8); outp(0x61, іпр(Охбі) | 1);

/*Функція rndget формує та видає на екран послідовність

випадкових чисел у діапазоні (0-bond)*/ int rnd_get(void) { int і;

//Видаємо команду CLC для заскакування поточного //значення регістра каналу 2 таймера outp(0x43, 0x86);

//Читаємо молодший та старший байти лічильника

Розглянена програма формування послідовностей випадкових чисел може бути використана при моделюванні багатьох випадкових процесів та функцій.

Практикум Лабораторна робота 2

Тема роботи

Використання функціональних можливостей таймера для генерації звукових сигналів, відтворення музики та формування послідовності випадкових чисел.

Мета роботи

Навчитись розробляти алгоритми програм, що від­творюють звукові сигнали.

Зрозуміти та засвоїти принципи розробки про­ грамних модулів, що відтворюють звуки.

Дослідити програми, що відтворюють фрагменти музичних творів та навчитись їх розробляти.

Навчитись розробляти алгоритми програм, що фор­ мують послідовності випадкових чисел.

Зрозуміти та засвоїти принципи розробки про­ грамних модулів, що формують послідовності випадкових чисел.

Дослідити програми, що формують послідовності псевдовипадкових чисел та навчитись їх розробляти.

Вимоги

Для виконання роботи потрібні знання та навички програмування мовами СІ та Ассемблера, ґрунтовні знання архітектури та принципів функціонування таймера, а також знання та навички програмування каналів таймера та портів 60h та 61h.

На вінчестері комп'ютера повинне бути встановлене се­редовище програмування Borland C++ V3.01 у каталозі ВС.

Вправа 1

  1. Дослідіть програму Ьір.с, що формує звукові сигнали пропорційні скен-коду натисненої клавіші клавіатури. Визначіть, у якому режимі працює канал 2 таймера.

  1. За текстом програми нарисуйте схему алгоритму.

  2. На вінчестері створіть каталог TIME.

  1. За допомогою редактора середовища програмування Borland C++ V3.01 створіть символьний файл тексту вивченої Вами програми та запишіть його в каталог TIME.

  2. Виконайте настройку програми та запустіть її на виконання.

  3. Змініть коефіцієнт пропорційності k спочатку в більший, а далі в менший бік та виконайте пункт 5. Зробіть висновки про Ваші спостереження та розробіть пропозиції з перетворення клавіатури ПК у клавіатуру ФОНО.

Вправа 2

  1. Вивчіть структуру програми (tm_sound) формування частоти та тривалості звуку, що видається на динамік. Виясніть, які функціональні можливості таймера вико­ ристовуються та якими засобами реалізовано керування три­ валістю звучання? З якою точністю задається тривалість?

  2. Дослідіть програму (melodyl.c) та відновіть схему алгоритму. Вкажіть місця програми, які треба змінити для програвання іншої мелодії.

  3. За допомогою редактора середовища програмування Borland C++ V3.01 створіть символьний файл тексту вивченої Вами програми та запишіть його в каталог TIME.

  4. Виконайте настройку програми та запустіть її на виконання.

5. Змініть програму так, щоб можна було точніше фор­ мувати тривалості нот. Виконайте пункти 3 та 4. Зробіть висновки про результати Ваших експериментів.

6. Найбільш допитливим пропонується розробити пропозиції по реалізації програмним способом багатоголо­ сих музичних творів.

Вправа З

  1. Вивчіть та дослідіть структуру програми randoml.c, що призначена для формування послідовності псевдовипад- кових чисел у заданому діапазоні уявлення.

  2. Відновіть схему алгоритму програми, в якій виділіть модуль ініціалізації таймера, задання діапазону уявлення та кількості чисел, а також модуль друку результату.

  1. Для більшої наочності зображення псевдовипад- кових чисел змініть програму так, щоб числа відображу­ вались на екрані у вигляді стовпчастої діаграми.

  2. Розробіть програму, в якій діапазон зображення чисел можна було б задавати з екрана дисплея в діалоговому режимі.

  3. Найвідчайдушніші і ті, що намагаються опанувати «вищий пілотаж» керування таймером спробуйте об'єднати можливості програми melodyl.c та randoml.c для формування «космічної» мелодії з випадковою частотою послідовності нот та випадковою їх тривалістю. Рекомендація: обмежтесь частотою в межах трьох октав та тривалістю нот від 1 цілої до 1/16.

Питання для самоконтролю знань

  1. Чому часові затримки, сформовані з використанням таймера, не залежать від продуктивності комп'ютера?

  2. Який порт використовується для керуванням лі­ чильником таймера та видавання сигналів на динамік?

  3. Який розряд порту 61h дозволяє рахунок каналу 2 таймера?

4. Який розряд порту 61h дозволяє проходження вихідного сигналу OUT 2 на динамік?

5. З якою точністю визначається тривалість ноти в роз­ глянених прикладах програм?. Назвіть переривання BIOS та його функцію, яка дозволяє зчитувати показники лічильника каналу 0 таймера.

  1. Вкажіть модуль формування затримки для керування тривалістю ноти в програмі, що виконує просту мелодію. Що треба змінити в цій програмі, щоб виконувати іншу мелодію?

  2. У програмі формування послідовності випадкових чисел вкажіть модуль ініціалізації каналу таймера, роз­ шифруйте режим.

Резюме

Таймер використовується для формування часових інтервалів, що не залежать від продуктивності комп'ютера; видавання звукових сигналів; відтворення музики; фор­мування послідовності псевдовипадкових чисел.

Для формування частоти звучання ноти необхідно в лічильник каналу 2 таймера записати відповідний кое­фіцієнт перерахунку. Перед цим необхідно заборонити видавання сигналу на динамік. Тривалість звучання ноти формується модулем підрахунку тіків каналу 0. Керування видаванням сигналів на динамік здійснюється бітами 0 та 1 порту 61h.

Таймер використовується в прикладних програмах для формування послідовності випадкових чисел у зада­ному діапазоні. З цією метою краще використовувати канал 2 в режимі 3.

Ваш наступний крок

Тепер, коли Ви вивчили принципи організації, функціо­нування і програмного керування підсистемою таймера, Вам значно легше буде розібратись із можливостями ще однієї підсистеми служби часу комп'ютера — годинником реального часу. Ця підсистема не менш важлива та цікава в розумінні використання її можливостей у прикладних програмах.

До вивчення підсистеми годинника реального часу Ви приступите у наступному занятті.