
- •Компьютерная и микропроцессорная техника в электрооборудовании
- •Тема № 1 Разработка и отладка программ линейного вычислительного процесса
- •Управления вводом/выводом
- •Варианты заданий
- •Тема № 2 Разработка и отладка программ разветвляющегося вычислительного процесса. Логический условный оператор
- •Разработка и отладка программ циклического вычислительного процесса. Оператор цикла с параметром
- •Основные управляющие структуры - повторения
- •Варианты заданий
- •Тема № 6 Разработка и отладка программ с использованием структурированных типов данных – одномерных массивов
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Омский государственный технический университет»
Е.Г. Андреева
Компьютерная и микропроцессорная техника в электрооборудовании
Конспект лекций
Омск
Издательство ОмГТУ
2013
УДК 621.31:004.9
ББК 31.2+32.973
А65
Рецензенты:
В.К. Федоров, д-р техн. наук, проф. каф. «Электротехника и электрофикация сельского хозяйства» Омского государственного аграрного университета (ОмГАУ)
В.И. Стариков, кандидат техн. наук, доцент каф. «Прикладная информатика и математика» Омского государственного института сервиса
А65 Компьютерная и микропроцессорная техника в электрооборудовании Конспект лекций/ Е. Г. Андреева - Омск: Изд-во ОмГТУ, 2013. – с.
Рассматриваются основные понятия, принципы и подходы к вопросам определения информационных систем и информационных технологий в электрохозяйствах предприятий и организаций.
Конспект лекций предназначен для студентов, магистрантов, аспирантов, преподавателей и специалистов, интересующихся информационными системами и технологиями электрохозяйств (для направлений 140400.62, 3 курс, ДО, 4 курс ЗО, 140600.65, 3 курс, ДО, 4 курс ЗО).
УДК
ББК
Омский государственный
технический
университет, 2012
КОМПЬЮТЕРНАЯ ТЕХНИКА
Структура компьютера
В 1946 - 1948 годах в Принстонском университете (США) коллективом исследователей под руководством Джона фон Неймана был разработан проект ЭВМ, который никогда не был реализован, но идеи которого используются и до сих пор. Этот проект получил название машины фон Неймана или Принстонской машины.
Структура Принстонской машины:
Арифметико-
логическое
устройство
Устройство Устройство
Ввода Память ввода
Устройство
управления
Рис. 2 Структура Принстонской машины
Управляющая
связь; Информационная связь
Несмотря на огромное разнообразие вычислительной техники и ее необычайно быстрое совершенствование, фундаментальные принципы устройства машин во многом остаются неизменными. С самых первых поколений, любая ЭВМ состоит из следующих основных устройств: процессор, память (внутренняя и внешняя) и устройства ввода и вывода информации, шины (связывающие устройства).
Процессор является главным устройством компьютера, в котором собственно и происходит обработка всех видов информации. Другой важной функцией процессора является обеспечение согласованного действия всех узлов, входящих в состав компьютера. Соответственно наиболее важными частями процессора являются арифметико-логическое устройство АЛУ и устройство управления УУ.
Каждый процессор способен выполнять вполне определенный набор универсальных инструкций, называемых чаще всего машинными командами. Каков именно этот набор, определяется устройством конкретного процессора, но он не очень велик и в основном аналогичен для различных процессоров. Работа ЭВМ состоит в выполнении последовательности таких команд, подготовленных в виде программы. Процессор способен организовать считывание очередной команды, ее анализ и выполнение, а также при необходимости принять данные или отправить результаты их обработки на требуемое устройство. Выбрать, какую инструкцию программы исполнять следующей, также должен сам процессор, причем результат этого выбора часто может зависеть от обрабатываемой в данный момент информации.
Хотя внутри процессора всегда имеются специальные ячейки (регистры) для оперативного хранения обрабатываемых данных и некоторой служебной информации, в нем сознательно не предусмотрено место для хранения программы. Для этой важной цели в компьютере служит другое устройство - память. Мы рассмотрим лишь наиболее важные виды компьютерной памяти, поскольку ее ассортимент непрерывно расширяется и пополняется все новыми и новыми типами.
Память в целом предназначена для хранения как данных, так и программ их обработки: согласно фундаментальному принципу фон Неймана, для обоих типов информации используется единое устройство.
Начиная с самых первых ЭВМ, память сразу стали делить на внутреннюю и внешнюю. Исторически это действительно было связано с размещением внутри или вне процессорного шкафа. Однако с уменьшением размеров машин внутрь основного процессорного корпуса удавалось поместить все большее количество устройств, и первоначальный непосредственный смысл данного деления постепенно утратился. Тем не менее, терминология сохранилась.
Под внутренней памятью современного компьютера принято понимать быстродействующую электронную память, расположенную на его системной плате. Сейчас такая память изготавливается на базе самых современных полупроводниковых технологий (раньше использовались магнитные устройства на основе ферритовых сердечников - лишнее свидетельство тому, что конкретная физические принципы значения не имеют). Наиболее существенная часть внутренней памяти называется ОЗУ - оперативное запоминающее устройство. Его главное назначение состоит в том, чтобы хранить данные и программы для решаемых в текущий момент задач. Наверное, каждому пользователю известно, что при выключении питания содержимое ОЗУ полностью теряется. В состав внутренней памяти современного компьютера помимо ОЗУ также входят и некоторые другие разновидности памяти, которые при первом знакомстве можно пропустить. Здесь упомянем только о постоянном запоминающем устройстве (ПЗУ), в котором в частности хранится информация, необходимая для первоначальной загрузки компьютера в момент включения питания. Как очевидно из названия, информация в ПЗУ не зависит от состояния компьютера (для лучшего понимания можно указать на некоторую аналогию между информацией в ПЗУ и "врожденными" безусловными рефлексами у живых существ). Раньше содержимое ПЗУ раз и навсегда формировалось на заводе, теперь же современные технологии позволяют в случае необходимости обновлять его даже не извлекая из компьютерной платы.
Внешняя память реализуется в виде довольно разнообразных устройств хранения информации и обычно конструктивно оформляется в виде самостоятельных блоков. Сюда, прежде всего, следует отнести накопители на гибких и жестких магнитных дисках (последние несколько жаргонно пользователи часто именуют винчестерами), а также оптические дисководы (устройства для работы с CD ROM). В конструкции устройств внешней памяти имеются механически движущиеся части, поэтому скорость их работы существенно ниже, чем у полностью электронной внутренней памяти. Тем не менее, внешняя память позволяет сохранить огромные объемы информации с целью последующего использования. Подчеркнем, что информация во внешней памяти прежде всего предназначена для самого компьютера и поэтому хранится в удобной ему форме; человек без использования машины не в состоянии, например, даже отдаленно представить содержимое немаркированной дискеты или диска CD ROM.
Современные программные системы способны объединять внутреннюю и внешнюю память в единое целое, причем так, чтобы наиболее редко используемая информация попадала в более медленно работающую внешнюю память. Такой метод дает возможность очень существенно расширить объем обрабатываемой с помощью компьютера информации.
Если процессор дополнить памятью, то такая система уже может быть работоспособной. Ее существенным недостатком является невозможность узнать что-либо о происходящем внутри такой системы. Для получения информации о результатах, необходимо дополнить компьютер устройствами вывода, которые позволяют представить их в доступной человеческому восприятию форме. Наиболее распространенным устройством вывода является дисплей, способный быстро и оперативно отображать на своем экране как текстовую, так и графическую информацию. Для того чтобы получить копию результатов на бумаге, используют печатающее устройство, или принтер.
Наконец, поскольку пользователю часто требуется вводить в компьютерную систему новую информацию, необходимы еще и устройства ввода. Простейшим устройством ввода является клавиатура. Широкое распространение программ с графическим интерфейсом способствовало популярности другого устройства ввода - манипулятора мышь. Наконец, очень эффективным современным устройством для автоматического ввода информации в компьютер является сканнер, позволяющий не просто преобразовать картинку с листа бумаги в графический компьютерный файл, но и с помощью специального программного обеспечения распознать в прочитанном изображении текст и сохранить его в виде, пригодном для редактирования в обычном текстовом редакторе.
Теперь, когда мы знаем основные устройства компьютера и их функции, осталось выяснить, как они взаимодействуют между собой. Для этого обратимся к функциональной схеме современного компьютера, приведенной на рисунке.
Для связи основных устройств компьютера между собой используется специальная информационная магистраль, обычно называемая инженерами шиной. Шина состоит из трех частей: шина адреса, на которой устанавливается адрес требуемой ячейки памяти или устройства, с которым будет происходить обмен информацией;
шина данных, по которой собственно и будет передана необходимая информация;
шина управления, регулирующей этот процесс (например, один из сигналов на этой шине позволяет компьютеру различать между собой адреса памяти и устройств ввода/вывода).
Рассмотрим в качестве примера, как процессор читает содержимое ячейки памяти. Убедившись, что шина в данный момент свободна, процессор помещает на шину адреса требуемый адрес и устанавливает необходимую служебную информацию (операция - чтение, устройство - ОЗУ и т.п.) на шину управления. Теперь ему остается только ожидать ответа от ОЗУ. Последнее, "увидев" на шине обращенный к нему запрос на чтение информации, извлекает содержимое необходимой ячейки и помещает его на шину данных. Разумеется, реальный процесс значительно подробнее, но нас сейчас не интересуют технические детали. Особо отметим, что обмен по шине при определенных условиях и при наличии определенного вспомогательного оборудования может происходить и без непосредственного участия процессора, например, между устройством ввода и внутренней памятью.
Подчеркнем также, что описанная нами функциональная схема на практике может быть значительно сложнее. Современный компьютер может содержать несколько согласованно работающих процессоров, прямые информационные каналы между отдельными устройствами, несколько взаимодействующих магистралей и т.д. Тем не менее, если понимать наиболее общую схему, то разобраться в конкретной компьютерной системе будет уже легче.
Магистральная структура позволяет легко подсоединять к компьютеру именно те внешние устройства, которые нужны для данного пользователя. Благодаря ей удается скомпоновать из стандартных блоков любую индивидуальную конфигурацию компьютера.
МИКРОПРОЦЕССОРНАЯ ТЕХНИКА
ПРОГРАММИРОВАНИЕ
В данном конспекте лекций рассматриваются основы системы программирования на языке С/С++, разработанной фирмой Borland International.
Концепция языка С была предложена Б. Керниганом и Д. Ричи в начале 70-х годов для ЭВМ PDP-11 фирмы DEC, которая впоследствии развилась в стандарт ANSI (Американский институт национальных стандартов). Для начинающего программиста на языке Borland C/C++ представляется необходимым хорошее знание стандарта ANSI С.
Язык программирования С++ был разработан Б.Строуструпом в качестве альтернативы языку программирования Симула-67. Первое наименование языка было “язык С с классами”. Дальнейшее развитие эта разработка получила в корпорации АТ&Т(США). Официальные поставки нового языка для ОС UNIX начались с 1985 года. Если первые версии языка разрабатывались как препроцессор для С, то сейчас существуют прямые компиляторы. Базовым понятием в С++ является понятие класса. Класс - это введенный пользователем тип, обеспечивающий сокрытие данных, инициализацию, управление памятью и переопределение операций.
В 1987 году фирмой Borland International была реализована система Турбо С для микропроцессоров 8086, работающих с ОС MS DOS. Данная система сочетала лучшие свойства интегрированной среды Турбо (Integrated Development Environ-ment, IDE) для популярных языков (Паскаль, Бейсик, Ассемблер, Пролог) и концепции языка С. IDE имеет автономный компилятор и загрузчик, интегрированный редактор-компилятор-загрузчик, отладчик, утилиту make построения программ.
Данная методическая разработка ориентирована на интегрированную систему Borland С/С++ как под DOS, так и под Windows . Borland IDE соединяет в себе менеджер проекта, редактор, компилятор языка С\С++, библиотекарь, компоновщик, встроенный отладчик. Используя IDE, можно создавать библиотеки и прикладные программы (исходный или исполняемый код) для DOS, Windows (16-битной, 32-битной и NT). Исходный код прикладной программы находится в файле с расширением *.с или *.срр, а исполняемый или загрузочный код прикладной программы - в файле с расширением *.ехе. Главными инструментами языка являются компилятор, библиотекарь и компоновшик (редактор связей), именно они обрабатывают исходный код прикладной программы, объектные модули и библиотеки и генерируют исполняемый код исходной программы.
Все системы программирования на языке С фирм Borland International и Microsoft в полном объеме поддерживают стандарт С.
С - маленький язык, однако этот язык и мощная библиотека поставляемых библиотечных файлов (с расширением *.h) являются базовым средством для создания мощных программных профессиональных приложений с эффективным исполняемым кодом. Язык С более или менее поддерживает стиль программирования как языка Паскаль, так и Фортран, однако имеет непосредственный доступ к аппаратным средствам ПК, требуя знаний аппаратных компонент компьютера.
С(Си) можно назвать языком ассемблера высокого уровня, поскольку позволяет программисту работать с битами, байтами, регистрами, управлять работой центрального процессора и внешних устройств. Однако это нечто большее, чем язык ассемблера высокого уровня, так как поддерживаются многие важные структуры данных высокого уровня и управляющие структуры, ставшие привычными в современных языках программирования.
Язык С является очень гибким и демократичным и позволяет иметь компактный и эффективный код программы, однако это требует высокой ответственности и самоконтроля при написании приложений, так как компилятор данного языка не всегда контролирует привычные для программиста-пользователя моменты, такие как, например, контроль границ массива. Для эффективного использования С\С++ требуются обучение, опыт и навыки.
Необходимо помнить, что в программировании добиться результата можно, используя различные языковые средства или логические структуры, а в языке С/С++ они очень разнообразны. Поэтому перед программистом всегда стоит сложная задача выбора оптимального языкового средства или варианта для решения своих задач.
Структура С-программ
//Заголовки и комментарии, описывающие программу
/* Директивы include */
#include <stdio.h>
#include "prim5.c"
. . .
/* Макро*/
#define m 4
. . .
//Описание глобальных данных
int i; float f_1; ...
//Описание функции № 1 (подпрограммы)
float sum(float d, int k)
{ тело функции № 1;
}
...
// Описание функции № n (подпрограммы)
int prn()
{тело функции № n;}
void main()
{// Описания extern, обеспечивающих ссылку вперед на функции, приве-
// денные после main-функции */
extern float mi(float z, int l);
extern int inp();
/* Описание локальных данных*/
float s, s_2[10]; ...
// Тело главной функции main; ...
}
//Описание функции № 1_1 (подпрограммы)
float mi(float z, int l)
{ тело функции № 1_1;
}
...
// Описание функции № k (подпрограммы)
int inp()
{тело функции № k;}
Написание операторов также как и в Паскаль-программах заканчивается символом ";". Строка записи может содержать как один, так и несколько операторов. Помните о визуальности, "читабельности" программ.
Данные. Константы и переменные
До использования любого данного в программе оно должно быть предварительно описано, т.е. связано с определенным видом и типом. Виды данных - константы и переменные.
Типизированные константы описываются следующим образом:
const тип имя=значение;
например,
const float pi=3.14159;.
Переменные представляются как
тип имя или имена;
а также
тип имя=значение;
например,
char s,d; int i,n; float d_s=4,f;
т.е. переменные можно инициализировать начальными значениями в месте их описания.
С
калярные
типы Тип void
Агрегатные типы
Указатель Арифметический Перечисляемый
Вещественный Целый Массив Структура Объединение
Рис. 2. Типы данных
Тип данного определяет количество байт, выделяемых в памяти под это данное; набор допустимых значений и операций, производимых над данным. Тип void (отсутствие типа) не имеет ни значений, ни действий.
Таблица 2
Арифметический тип данных
Т
ип
данного Размер, байт
Диапазон значений
char 1 -128 ... +127
unsigned char 1 0 ... +255
int 2 -32768....+32767
unsigned int 2 0 ... +65535
short int 2 - 32768....+32767
long 4 -2147483648...+2147483647
unsigned long 4 0 ... +4294967295
float 4 3.4Е-38 ... 3.4Е+38
double 8 1.7E-308 ...1.7E+308
long double 10 3.4E-4932 ...3.4E+4932
Для
размещения в памяти числа с плавающей
точкой типа float
отводится 32 бита - 8 бит для представления
порядка и знака и 24 - бита - для мантиссы.
Такой способ дает возможность представлять
числа с точностью до 6-7 десятичных цифр
(по умолчанию, если не задается точность
в спецификации формата). Под данные типа
double
отводится 64 бита, и все 32 добавочных
бита используются для хранения мантиссы.
Константы языка С/С++
Константа Формат Пример
Символьная Символ, заключенный в апострофы ’w’
Целая Десятичный 183
Восьмеричный. Запись начинается с 0,
за которым следуют восьмеричные цифры 015
Шестнадцатеричный. Запись начинается с
0х или 0Х, за которыми следуют шестнад-
цатеричные цифры 0хAF
Вещественная Десятичный 2.1
Экспоненциальный, где Е - десятичное
основание 4.2Е-12
Строковая Совокупность символов, заключенных в
кавычки Мама
Операции
В состав оператора на любом алгоритмическом языке входят служебные слова; идентификаторы (имена) переменных, функций и констант; константные значения; выражения. В выражениях используются операции. Основные операции - это арифметические, побитовые и логические. Когда выражение содержит более, чем одну операцию, порядок их выполнения определяется соотношением приоритетов. Операция с более высоким приоритетом выполняется раньше. Операции с одинаковым приоритетом обрабатываются в соответствии с правилом ассоциативности, т.е. либо слева направо (), либо справа налево ().
Таблица 5
Операции
языка С\С++
Операция Описание Пример Приоритет/ассоциативность
1
2 3 4
Первичные и постфиксные операции
[ ] индекс массива а[1] 16,
( ) вызов функции sin(f) 16,
. элемент структуры tn.h 16,
-> элемент структуры tn->h1 16,
++ постфиксное приращение с++ 15,
- - постфиксное уменьшение с-- 15,
Унарные операции
++ префиксное приращение ++с 14,
- - префиксное уменьшение --с 14,
Продолжение таблицы 5
1
2 3 4
sizeof размер в байтах sizeof(b) 14,
(тип) преобразование типов float(j) 14,
~ побитовое
НЕ ~v_s
14,
! логическое НЕ !EOF 14,
- унарный минус -w 14,
& адрес d 14,
* разыменование *ptr 14,
Бинарные операции
* умножение 10*d 13,
/ деление x/5 13,
% получение остатка d%2 13,
+ сложение b+c 12,
- вычитание b - c 12,
Побитовый сдвиг
<< сдвиг влево b<<1 11,
>> сдвиг вправо b>>1 11,
Операции отношения
< меньше, чем b<c 10,
> больше, чем b>c 10,
<= меньше или равно, чем b<=c 10,
>= больше или равно, чем b>=c 10,
== равно b==c 9,
!= не равно b!=c 9,
Побитовые операции
& побитовое И cf 8,
^ побитовое исключающее ИЛИ сf 7,
| побитовое ИЛИ c|f 6,
Логические операции
&& логическое И x>0x<5 5,
|| логическое ИЛИ x<0||x>8 4,
Условные операции
?: при условии x<0 ? 2:4 3,
Присваивание
= присваивание x = 3 2,
*= присваивание произведения x *= 4 2,
/= присваивание деления x /= 4 2,
Продолжение таблицы 5
1 2 3 4
%= присваивание остатка x % = 4 2,
+= присваивание суммы x += 4 2,
-= присваивания разности x -= 4 2,
<<= присваивание левого сдвига y <<= 2 2,
>>= присваивание правого сдвига y >>= 2 2,
&= присваивание И i = j 2,
^= присваивание исключающего ИЛИ i = j 2,
|= присваивание ИЛИ i |= j 2,
, запятая c =2, f=4.5 1,
Некоторые аспекты программирования
на алгоритмическом языке С/С++
1. Компилятор языка чувствителен к коду символов (литер). Служебные слова в операторах, как правило, пишутся маленькими (не прописными) буквами. Существуют специальные случаи, например служебное слово ЕОF, написание которых оговорено в справочной или сопроводительной литературе.
2. В логических выражениях, с помощью которых описываются условия в управляющих структурах, используются логические величины (переменные), однако в языке С/С++ отсутствует специальный тип для их описания. Если выражение может быть приведено к целому значению 1 или любому ненулевому целому значению, то оно считается истинным, если к целому 0 - то ложным.
3. Во всех структурах языка С/С++ "оператор" может представлять собой как одиночный оператор, так и блок (составной оператор), т.е. совокупность операторов, заключенных в фигурные скобки {...}, например,
if (y>0)
{x=2.4;
printf(“x=%f\n”,x);}
4. Для использования стандартных или входящих в комплект поставки функций С/С++ к исполняемой программе подключаются необходимые библиотечные файлы. Это можно сделать при помощи директивы препроцессору #include < имя библиотечного файла>. Эти директивы предписывают препроцессору поместить на место встретившегося в исполняемой программе имени функции содержимое функции-подпрограммы из указанного библиотечного файла.
5. Директивы препроцессору могут находится в любом месте файла с программой. Препроцессор расширяет все макро (макровызовы) и подставляет все внешние файлы. В результате работы препроцессора формируется исходный текст на С/С++, который далее обрабатывается компилятором.
6. Ввести данные в программе можно либо оператором присваивания, либо оператором ввода с экрана дисплея, либо с помощью генератора случайных чисел. Функции генерации случайных чисел описаны в библиотечном файле stdlib.h. Функция randomize() (time.h) генерирует начальное значение последовательности случайных чисел, а функция random(100) определяет (возвращает) целое положительное число в диапазоне от 0 до 100.
7. Следует помнить, что комментарии - это пояснения к оператору, блоку или тексту программы. Они используются либо по прямому своему назначению, либо на начальном этапе отладки программы, поскольку являются не исполняемой частью программы. Комментарии в С-программах заключают в скобки /* ... */; а также пишутся после двойной косой черты //, тогда информация до конца строки воспринимается комментарием.
8. Язык С мобилен и причудлив в описании типов и позволяет создавать сложные структуры данных. При описании сложных идентификаторов используются следующие модификаторы: * - указатель; () - функция; [ ] - массив, а также следующие правила:
- чем ближе модификатор стоит к идентификатору, тем выше его приоритет;
- модификаторы [ ] и () имеют более высокий приоритет, чем *;
- круглые скобки используются для объединения частей идентификатора, имеющих самый высокий приоритет.
Примеры:
int **a; // указатель на указатель типа int
int *d[5]; // 5-ти элементный массив указателей на тип int;
int (*f)[8]; // указатель на 8-ми элементный массив типа int;
float *ff(); // функция, возвращающая указатель на тип float;
float (*ft) (); // указатель на функцию, возвращающую тип float;
float *fr() [2]; // функция, возвращающая указатель на 2-х элементный массив типа float;
float *fg[7] (); // 7-ми элементный массив указателей на функцию, возвращающую тип float;
9. Функции и операторы, позволяющие завершать или приостанавливать выполнение блока или программы, а также приостанавливать вывод данных на экран:
void exit(int status) - функция описана в библиотеке stdlib.h, завершает выполнение программы и всех функций, буферы открыты для записи; status - определяет статус или код завершения и равен 0, если осуществляется нормальное завершение программы;
void abort(void) - функция описана в библиотеке stdlib.h, завершает выполнение программы при наличии ошибок выполнения, соответствует функции exit(3);
break - завершает выполнение операторов while...; do... while; for...; switch..., в которых он в данный момент находится;
continue - схож по назначению с оператором break, но не влияет на оператор switch, и в цикле возвращает управление к началу цикла, пропуская оставшуюся часть;
return выражение - прерывает выполнение функции и возвращает ей значение выражения;
void delay(unsigned milliseconds) - функция описана в библиотеке dos.h и приостанавливает выполнение программы на заданное число миллисекунд;
int getch(void) - функция описана в библиотеке conio.h; читает символ с клавиатуры без эхоповтора на экране; приостанавливает выполнение программы до нажатия на любую клавишу; аналогична по действию функции readkey: char в Паскаль-программах;
int kbhit(void) - функция описана в библиотеке conio.h; возвращает целое ненулевое значение, если на клавиатуре была нажата клавиша, и 0 в противном случае; аналогична по действию функции keypressed:boolean в Паскаль-программах;
Пример 1.
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
/* Sets DOS errorlevel */
exit(status - '0');}
void main(void)
{ int status;
printf("Enter either 1 or 2\n");
status = getch();
Пример 2.
В примере приведены функции, обеспечивающие звучание встроенного динамика с высотой звука 440 Гц.
#include <dos.h>
void main(void)
{ sound(440);
delay(500);
nosound();
return 0;
Замечание. В примере 2 показано как программно используется встроенный динамик, обеспечивая звук заданной высоты и длительности. Следует помнить, что динамик отключается только программно, поэтому наличие оператора nosound(); в каком-либо месте программы обязательно.