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

Заняття 4. Приклади використання функціональних можливостей таймера в прикладних задачах

Тема заняття

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

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

Мета заняття

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

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

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

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

Генерація звукових сигналів та відтворення музики

Одним із найбільш розповсюджених застосувань таймера — генерація звукових сигналів та відтворення музики. Таймер дозволяє відтворювати музику у фоновому режимі, тобто під час роботи будь-якої програми може лунати музика. Спосіб підключення динаміка зображений на рис. 3.1.

Як ми вже говорили, канал 2 мікросхеми І8254 з'єднаний з гучномовцем комп'ютера. Але гучномовець не просто з'єднаний з виходом OUT каналу 2. Порт виводу 61h також використовується для керування гучномовцем. Молодший біт порту 61h підключений до входу GATE каналу 2 таймера. Цей біт при встановленні на 1 дозволяє роботу каналу, тобто генерацію імпульсів для гучномовця, а при встановленні на 0 забороняє.

Додатково для керування гучномовцем використову­ється біт 1 порту 61h. Якщо цей біт встановлений на 1, сигнали з виходу OUT2 каналу 2 таймера через схему збігу зможуть проходити на гучномовець. Якщо в біті 1 нуль, то схема збігу забороняє проходження сигналів на гучно­мовець. Інші біти порту 61 призначені для ініціалізації та діагностики ПЕОМ, тому їх змінювати не можна.

Розглянемо приклади програм, що генерують звук. Для демонстрації операцій низького рівня найзручніша мова Ассемблера. Але різні операції, зв'язані з вводом та виводом числової та символьної інформації, досить трудомісткі для Ассемблера і тому в наведених нижче програмах усе, що не стосується роботи з портами, написано мовою СІ. У ньому здійснюються ввід/вивід та деякі інші операції. Там, де потрібно показати конкретні правила роботи з апарату­рою на нижньому рівні, вмикаються фрагменти мовою Ассемблера.

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

#include <conio.h> //Програма bip.c — відтворення void MyBeep(int) звуків при натисненні клавіш клавіатури комп'ютера

asm {

push ax //Зберегти вміст регістра ах у стеку

push ex //зберегти вміст регістра сх у стеку

mov ex, Frac //завантаження аргументу в сх (коефіцієнта перерахунку)

mov al,0xB6 //в аі заноситься керуюче слово таймера-лічильника

out 0x43,al //керуюче слово відсилається в порт 43h

mov ах, сх //коефіцієнта перерахунку, заноситься в ах,

out 0x42,аl //пересилається в порт спочатку молодший байт

mov al.ah

out 0x42,аl

in al,0x61

mov ah,al

or al,3 out 0x61,аі

}

tm:

asm

in al, 0x60 //в аl заносимо скен-код натисненої клавіші

and al,0x80 //утворюємо додатковий скен-код

jz tm //та залишаємось у циклі, поки клавіша натиснена

mov al,ah //збережений раніше байт заноситься в аіl

out 0x61,al //відновлюємо початкове значення порту 61Н

pop сх //відновлюємо сх

pop ax //відновлюємо ах

}