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

Void main(void){ int Frac; char k;

clrscr(); //Очищення екрана

printf("\nНатискайтеe клавіші та слухайте звуки!!!." "\nДля завершення роботи натисніть — Esc" "\n");

while ((c=getch()) != 27) { //27 = ESC — вихід з програми Frac = k * 100; //встановлюємо коеф. рахунку //(ASCII-код символу * 100 //для формування частоти звуку

}

}

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

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

Основна ідея полягає у використанні функції 00h переривання lAh, яка дозволяє зчитувати показники лічильника каналу 0 і на підставі цих показників Ваша програма формує затримку, що дорівнює тривалості ноти, вибраної з масиву, який містить мелодію. Частоту звучання ноти задає канал 2 таймера. Коефіцієнти перерахунку задаються в масиві частот.

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

Для визначення значення, яке повинне бути записане в регістр-лічильник каналу 2 таймера, треба розділити 1193180 на потрібну частоту в герцах.

Розглянемо функцію, призначену для генерації на гучномовці тону заданої частоти та тривалості:

#include <stdio.h>

#include <conio.h>

Void tm_sound(int freq, int time) {

int cnt, i;

//Задаємо режим каналу 2 таймера

out(0x43, 0xb6);

//Обчислюємо затримку для завантаження в регістр //лічильника таймера

cnt = 1193180L / freq;

asm{

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

push ax

mov ax, cnt

out 0x42, al

mov al, ah

out 0x42, al

//Вмикаємо гучномовець. Сигнал з виходу OUT 2 кана-//лу 2 таймера тепер буде проходити на вхід гучномовця.

in al, 0x61

or al, 00000011b

out

POP

0x61, al ax

}

//Виконуємо затримку (див. заняття 3)

tm_delay(time);

//Вимикаємо гучномовець asm{

push ax

in al, 0x61

and al, 11111100b

out 0x61, al

pop ax

}

Якщо підготувати для цієї функції таблиці частот та тривалостей, то можна з її допомогою виконувати прості мелодії. У наступному прикладі ми так і зробили:

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

//Масив частот для мелодії (ноти) int mary[] ={

330, 294, 262, 294, 330, 330, 330,

294, 294, 294, 330, 392, 392,

330, 294, 262, 294, 330, 330, 330, 330,

294, 294, 330, 294, 262, 0

}

//Масив тривалостей нот

int del[] ={

5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 5, 10,

5 5 5 5 5 5 5

5, 5, 5, 5, 20

//Затримка для формування тривалості звучання ноти