Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
71
Добавлен:
17.03.2015
Размер:
289.79 Кб
Скачать

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

/*ТЕМА ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ СТУДЕНТОВ: СТРУКТУРЫ

(STRUCT)

ЦЕЛЬ РАБОТЫ

Изучить материал и продемонстрировать умение работать со структурами в том числе:

1. описать шаблон структуры (в том числе вложенные структуры, структуры, содержащие объединение);

2. уметь объявить структурную переменную, массив структур, указатель на структуру, массив указателей на структуру;

3. уметь обращаться к полям структуры через имя структуры, указатель на структуру, элемент массива структур;

4. максимально просто копировать поля одной структуры в другую (пример 1);

5. максимально быстро осуществлять ввод (вывод) одной и более структур из файла (в файл) и хранить информацию в файле с минимальными затратами места на диске (функции fread, fwrite или read, write);

6. уметь передать структуру в функцию через параметры функции и, возможно, передать структуру в качестве результата;

7. уметь отсортировать массив структур, используя функцию qsort.

ПРИ НАПИСАНИИ ПРОГРАММЫ

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

2. Исходить из принципа модульного программирования:

2.1. отдельные функции должны быть написаны в соответствии с основными принципами построения функции (каждая функция решает только одну задачу, исходные данные передаются через параметры, результат всегда передается в вызывающую функцию);

2.2. разбить весь текст на раздел описаний и раздел реализаций. Раздел описаний (файл с расширением *.h) содержит заголовочные файлы, макроопределения, описания внешних переменных, прототипы собственных функций. Раздел реализаций (один или несколько файлов с расширением *.с) содержит тексты самих функций. Сборку программы производить с помощью файла проекта (пункт меню Project в BC или TC), на стадии отладки можно подключать файлы с помощью соответствующей директивы препоцессора.

3. Написать по тексту комментарии, особенно в файле описаний.

ПРИ ЗАЩИТЕ РАБОТЫ

1. Уметь выполнить программу.

2. Изложить узловые моменты и особенности алгоритма.

3. Дать объяснение любому оператору программы по требованию преподавателя.

СТРУКТУРЫ

Успех программы часто зависит от удачного выбора способа представления данных. С помощью структур возможно моделировать сложные объекты, возникающие при решении задач. Структуры представляют средство для доступа к записям, которые содержат поля одного или нескольких типов.

Для использования структуры необходимо:

1. установить шаблон для структуры

2. объявить переменную, соответствующую этому шаблону

3. осуществить доступ к компонентам структуры.

Шаблон структуры

Шаблон - это схема, описывающая содержание структуры.Установка структурного шаблона телефонный справочник:

struct sprav {

char fio[20];

long num;

};

Данный шаблон описывает структуру с именем типа структуры sprav, состоящую из двух компонентов: строки fio и целой переменной num типа long. Имя типа структуры sprav необязательно и используется для ссылки на эту структуру. Компоненты структуры - данные любого типа, включая и другие структуры. Имя внутри структуры может быть таким же, как имя объекта вне структуры. Если шаблон описан внутри функции - он доступен только этой функции, если шаблон описан вне функции - он доступен любой

функции программы. Установка шаблона не вызывает никаких действий в программе.

Структурные переменные

Объявление структурных переменных приводит к выделению памяти для компонент структуры, куда можно записать данные или откуда можно прочитать их. Для объявления структурных переменных имеются несколько способов.

1. Установить структурный шаблон:

struct sprav {

char fio[20];

long num;

};

Объявить простую переменную, массив структур, указатель на структуру: struct sprav tel1, tel2[5], *tel3;

2. Установить структурный шаблон с помощью макроопределения:

#define SPRAV struct sprav

SPRAV {

char fio[20];

long num;

};

Объявить переменные:

SPRAV sp1, sp2[6], *sp3;

3. Объявить переменные одновременно с установкой шаблона (если на данную структуру вы больше не ссылаетесь):

struct {

char fio[20];

long num;

} tel1, tel2[3], *tel3;

4. Ввести новый тип данных (TEL)-структура определенного вида:

typedef struct {

char fio[20];

long num;

} TEL;

Объявить переменные нового типа:

TEL tel1, tel2[6], *tel3;

Если программа достаточно объемна, представляется более удобным четвертый способ.

Инициализация структуры

Инициализировать можно только внешние или статические структуры.

static struct {

char fio[20];

long num;

} tel[2]={

"Иванов Ф.А.", 456756,

"Петров В.П.", 632345

};

Доступ к компонентам структуры

Доступ к компонентам структуры продемонстрируем с помощью примеров.

Пример 1.

/* Обращение к элементам структуры через имя переменной */

#include <stdio.h>

#include <conio.h>

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