Дипломная работа: Разработка музыкального звонка с двумя режимами работы: автономным и от сети
Кроме этой таблицы нам еще понадобится таблица коэффициентов деления для всех 32 нот и таблица, хранящая константы задержки для всех используемых нами музыкальных длительностей.
Алгоритм работы электромузыкального звонка (Рисунок 2.5):
1. Просканировать и определить номер нажатой кнопки.
2. Извлечь из таблицы начал мелодий значение элемента, номер которого соответствует только что определенному номеру нажатой кнопки. Это значение будет равно адресу в программной памяти, где начинается нужная нам мелодия.
3. Начать цикл воспроизведения мелодии. Для этого поочередно извлекать коды нот из памяти, начиная с адреса, который мы определили в пункте 2 алгоритма.
4. Каждый код ноты разложить на код тона и код длительности.
5. Если код тона равен нулю, отключить звук и перейти к формированию задержки (к п. 9 настоящего алгоритма).
6. Если код тона не равен нулю, извлечь из таблицы коэффициентов деления значение элемента с номером, равным коду тона.
7. Записать коэффициент деления, который мы нашли в пункте 6 настоящего алгоритма, в регистр совпадения таймера Т1.
8. Включить звук (подключить вывод ОС1А к выходу таймера Т1).
9. Извлечь из таблицы длительностей задержки значение элемента с номером, равным коду длительности.
10. Сформировать паузу с использованием константы задержки, которую мы нашли в пункте 9 настоящего алгоритма.
11. По окончании паузы выключить звук (отключить ОС1А от выхода таймера).
12. Повторять цикл (пункты 4—11 настоящего алгоритма) до тех пор, пока нажата соответствующая кнопка.
13. Если очередной код ноты окажется равным 255, перейти к началу текущей мелодии, то есть вернуться к п. 3 настоящего алгоритма
??????? 2.5 ? ???????? ???????? ??? ??????????????????? ??????
2.6 Разработка программного обеспечения микроконтроллера
Возможный вариант программы на языке Ассемблер приведен в листинге 1 (См. Приложение А).
2.6.1 Описание программы
Описание программы удобнее начать с конца. Начиная со строки 136 программы располагается описание так называемых таблиц данных. На самом деле каждая из этих "таблиц" представляет собой цепочку кодов, записываемых в программную память микроконтроллера и предназначенных для кодирования того либо иного вида данных. Для описания этих данных используются как операторы db, так и операторы dw.
Первая таблица содержит коэффициенты задержки для формирования всех вариантов музыкальной длительности. Таблица начинается с адреса, соответствующего метке tabz. Вся таблица занимает одну строкупрограммы (строка 136).Так как в нашей программе мы будем применять лишь семь вариантов длительности, таблица имеет 7 элементов. Каждый элемент записывается в память как двухбайтовое слово.
В строках 137—140описывается таблица коэффициентов деления для всех нот. Начало таблицы соответствует метке tabkd. Каждый элемент этой таблицы также имеет размер в два байта. Первый элемент таблицы равен нулю. Это неиспользуемый элемент. Ноты номер ноль у нас не существует. Ноль мы использовали для кодирования паузы.
В паузе не формируется звуковой сигнал, поэтому и коэффициент деления там не имеет смысла. Поэтому значение нулевого элемента массива несущественно. Описание таблицы разбито на строки. Для удобства каждая строка описывает коэффициенты деления для одной октавы. Нулевая нота выделена в отдельную строку. Последняя октава неполная, так как наш электромузыкальный звонок будет использовать всего 32 ноты.
В строках 143—200описана таблица мелодий.Вернее, это не одна таблица, а семь таблиц (своя таблица для каждой из мелодий). Каждая таблица помечена своей отдельной меткой (те 11, те 12 — те 17). Значение каждой метки — это адрес начала соответствующей мелодии. Каждое значение таблицы мелодий записывается в память в виде одного байта. Поэтому все строки, кроме последней, для каждой таблицы имеют четное число значений.
В строках 141,142 описана таблица начал всех мелодий.Начало этой таблицы отмечено меткой tabm. Таблица используется для того, чтобы программа могла найти адрес начала нужной мелодии по ее номеру. В качестве элементов массива выступают удвоенные значения меток mell,mel2 —mel7. Применение удвоенных значений обусловлено необходимостью перевода адресов из основной адресации в альтернативную. При трансляции программы вместо меток в память будут записаны конкретные адреса.
2.6.2 Процедура вычисления адреса
Большое количество таблиц в нашей программе заставляет позаботиться о процедуре вычисления адреса.
Однотипные вычисления удобно оформить в виде подпрограммы. Эта подпрограмма занимает строки 78—84. Вызов подпрограммы производится по имени addw. Подпрограмма получает номер элемента таблицы и адрес ее начала. Номер элемента передается в подпрограмму при помощи регистра YL , а адрес — через регистровую пару Z.
Используя эти данные, подпрограмма вычисляет адрес нужного элемента.Для этого она сначала удваивает номер элемента (строка79). Затем дополняет полученное значение до шестнадцатиразрядного путем записи в YH нулевого байта (строка80). И, наконец, производит сложение двух шестнадцатиразрядных величин, находящихся к этому моменту в регистровых парах Y и Z (строки81, 82). Результат вычислений при этом попадает, в регистровую пару Z .
2.6.3 Текст программы