Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Контрольная-весна.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
849 Кб
Скачать
☆

Описание работы программы (листинг 1)

Программа содержит только одну главную функцию main. Перед началом этой функции происходит определение и инициализация массива (строка 2). Этот массив предназначен для хранения коэффициентов деления регистра сравнения.

При инициализации элементам массива присваиваются значения соответствующие значениям таблицы коэффициентов.

Главная функция main программы занимает строки 3—21. В строках 4 и 5 создаются две переменные:

  • переменная count, которая будет использоваться для определения кода нажатого датчика;

  • переменная temp, предназначенная для вспомогательных целей.

Строки 6—12, занимает модуль инициализации. Здесь настраиваются порты ввода вывода (строки 6—9), компаратор (строка 10) и таймер Т1 (строки 11,12).

Основной цикл программы занимает строки 13—21. В строке 14 программа читает содержимое порта PD и помещает прочитанный байт в переменную temp. Этот байт содержит информацию о состоянии датчиков.

В строках 15—17 находится цикл сканирования датчиков. В качестве параметра цикла используется переменная count. Цикл выполняется, пока значение переменной count меньше семи. В теле цикла происходит проверка младшего бита переменной temp (строка 16).

Для проверки значения бита используется выражение temp&l. Оператор «&» выполняет операцию побитового «И» между значением переменной temp и числом 1 (0x01). При этом все старшие биты обнуляются, и результат выражения становится равным значению младшего бита переменной temp.

Оператор if в строке 16 проверяет результат выражения. Если он равен нулю (контакты очередного датчика замкнуты), управление передается по метке m2, и цикл прекращается досрочно. В противном случае (контакты датчика разомкнуты) цикл выполняется дальше.

В строке 17 производится логический сдвиг содержимого переменной temp. А затем цикл сканирования начинается сначала. Таким образом, за семь проходов цикла проверяются все семь датчиков.

Если контакты всех датчиков окажутся незамкнутыми, то цикл for (строки 15—17) завершается естественным образом, а управление переходит к строке 18. Здесь происходит выключение звука: регистру TCCR1А присваивается нулевое значение.

Затем в строке 19 управление передается в начало процедуры. Для передачи управления используется оператор безусловного перехода.

Если цикл завершился досрочно переходом к строке 20 (по метке m2), начинается процесс формирования звука. Так как процесс сканирования датчиков закончился досрочно, в переменной count находится номер датчика, контакты которого оказались замкнутыми. Теперь нам остается лишь извлечь коэффициент деления, соответствующий этому номеру датчика, и записать его в регистр совпадения таймера.

На С++ для этого регистру OCR1А присваивается значение соответствующего элемента массива tabkd (строка 20). В строке 21 производится включение звука. Звук включается путем записи в регистр TCCR1А кода 0x40. На этом завершается тело основного цикла программы. Так как основной цикл программы выполнен в виде бесконечного цикла, то после завершения его последней команды весь цикл повторяется сначала.

Самостоятельно: Разработать код программы для устройства «Синтезатор 7 нот», которое использует микроконтроллер ATmega16. Разработать схему в Proteus. Разработать печатную плату для устройства, использующего МК ATmega16.