Void main(void)
{ long i,port;
port=inportb(97); /* эапоминает состояние порта */
printf("%d\n",port);
outportb(97,79); /* включает громкоговоритель */
for(i=0;i<90000;i++); /* отметка эадержки времени */
outportb(97,port); /* Выключает громкоговоритель, */
}
/* Следующая функция tone(freq,time) позволяет извлекать звук определенной частоты freq (гц) и продолжительности time ( в десятых долях секунды). Продолжительность звука обеспечивается задержкой во времени, необходимой для выполнения цикла for. Частота звука устанавливается с помощью другого устройстватаймера. Таймер вырабатывает базовую частоту 1190000гц, которая не может быть воспринята человеком. Однако, мы можем послать на регистр таймера число для деления (divisor) для получения частоты freq = 1190000/divisor. Для этого используется еще два порта:
-
посылаем значение 182 через порт 67 для установки таймера в режим для приема делителя;
2. делитель посылается через порт 66 двумя приемами по 8 бит: сначала младший байт, затем старший.
Пример 2.
#define TIMERMODE 182 /* код установки таймера в нужный режим */
#define FREQSCALE 1190000L /* баэовая частота в герцах */
#define TIMESCALE 1230L /* число отсчетов времени в 0,1 сек */
#define T_MODEPORT 67 /*порт устанавливает режим работы таймера*/
#define FREQPORT 66 /* порт регулирует частоту эвука */
#define BEEPPORT 97 /* громкоговоритель */
void tone(int freq,int time)
{ int hibyt,lobyt,port;
long i,count,divisor;
divisor=FREQSCALE /freq; /* масштабирование частоты */
lobyt=divisor %256; /* раэбивает целое */
hibyt=divisor /256; /* на 2 байта */
count=TIMESCALE *time; /*преобразует время в единицы таймера*/
outportb(T_MODEPORT,TIMERMODE); /*подготавливает таймер*/
outportb(FREQPORT,lobyt); /* устанавливает младший байт */
outportb(FREQPORT,hibyt); /* устанавливает старший байт */
port=inportb(BEEPPORT); /* эапоминает состояние порта */
outportb(BEEPPORT,port|3); /* включает громкоговоритель */
for(i=0;i<count;i++); /* отметка эадержки времени */
outportb(BEEPPORT,port); /* Выключает громкоговоритель, */
/* восстанавливает состояние */
}
ЗАДАНИЕ
Используя функцию tone, написать программу, которая по-воляла бы использовать клавиатуру (часть ее) в качестве музыкального инструмента. Для примера воспроизвести мелодию, явно или отдаленно напоминающую широко известные произведения. Функцию и программу main поместить в разные файлы. Для получения загрузочного модуля создать файл проекта. Соответствие частоты (гц) нотам первой и второй октавы:
Нота 1 октава 2 октава
до 262 523
ре 294 597
ми 330 659
фа 349 698
соль 392 784
ля 440 880
си 494 988
