Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб по С и С++ / lc++teor.doc
Скачиваний:
70
Добавлен:
17.03.2015
Размер:
147.46 Кб
Скачать

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. Для этого используется еще два порта:

  1. посылаем значение 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

Соседние файлы в папке Лаб по С и С++