RadioNet
Search datasheet  
RadioNet
РЕЙТИНГ ТЕНДЕРЫ ИССЛЕДОВАНИЯ DATASHEETS КАТАЛОГ СХЕМ СХЕМЫ ФОРУМ ДОСКА ОБЪЯВЛЕНИЙ
  ПОИСК ПО САЙТУ
  Опции:    
  ВХОД
 Логин:
 Пароль:
Забыли пароль?
 
WEB-RING CHIPINFO: электроника, электронные компоненты иприборы.

Cайт и форум для электриков
HARDW.net

Пианино на PIC16F876


 С помощью данного синтезатора можно имитировать игру пианина в пределах одной октавы. 7 кнопок играют роль клавиш, каждая из которых соответствует своей ноте. Если нажаты сразу несколько кнопок, то частота звучания будет соответствовать среднеарифметической частоте нажатых клавиш. Во время игры мелодия записывается в EEPROM, и при нажатии специальной кнопки можно ее прослушать.




Принципиальная электрическая схема

Проект основывается на микроконтроллере PIC16F876. В качестве генератора частоты используется режим широтно-импульсной модуляции модуля CCP. Отсчет времени звучания ведется с помощью таймера TMR0. Во время работы постоянно сканируется состояние порта В, и если оно изменилось (какая-либо кнопка нажата или отпущена), то в соответствии с новой комбинации клавиш меняется и частота звучания. Также состояние порта В все время выводится на светодиоды, которые подключены к порту А. Пока есть свободной место для записи в EEPROM, включен светодиод VD8. При нажатии кнопки К8, устройство переходит в режим воспроизведения и проигрывает записанную мелодию. Во время воспроизведения также включен светодиод VD8. В качестве динамика можно использовать 0.25ГД-19 8 Ом.


Блок-схема программы

Рассмотрим алгоритм работы синтезатора: после конфигурации портов и регистров устройство ожидает нажатия какой-либо клавиши. После нажатия сохраняется значение таймера. Оно не играет роли, если это нажатие было первым. Затем сохраняется значение порта В. Если была нажата кнопка воспроизведения, то начнется проигрывание ранее записанной мелодии.
Если же была нажата одна (или несколько) клавиша, которая соответствует какой-либо ноте, то дальше работа устройства пойдет по алгоритму записи. Если есть свободной место в EEPROM, то туда будет записана длительность звучания предыдущей частоты (значение таймера) и новое состояние порта В. Если же свободного места больше нет, то светодиод VD8 гаснет и выставляется флаг “конец записи”, т.е. подпрограмма записи в EEPROM работать не будет. Затем определяется какие клавиши были нажаты и происходит суммирование их частот. Потом данная сумма делится на количество нажатых клавиш. Таким образом, находится среднеарифметическое значение новой частоты. Затем происходит сброс таймера, т.е. начало счета длительности звучания новой частоты и вызывается подпрограмма записи в EEPROM. Данная частота будет выводиться на динамик пока не произойдет следующее нажатие клавиш. Если произошло переполнение таймера, то генерируется прерывание. В подпрограмме прерываний также записывается в EEPROM состояние порта В, а в ячейку для длительности значение H’FF’ (переполнение таймера).
При воспроизведении сначала из EEPROM считывается количество комбинаций нажатых клавиш. Затем устанавливается флаг “воспроизведение”. Он нужен для подпрограммы прерываний. Затем искусственным путем вызывается прерывание. В начале подпрограммы прерываний при воспроизведении идет проверка на окончание, т.е. вся мелодия прозвучала или нет. Затем считываются комбинация нажатых клавиш и определяется новая частота. Потом считывается время звучания новой частоты и запись ее в таймер. При выходе из подпрограммы прерываний происходит зацикливание и ожидается переполнение таймера, которое вызовет новое прерывание, а следовательно, будет новая частота и новая длительность звучания.


В данном архиве (piano.zip) находятся: piano.hex - файл-прошивка для микроконтроллера; piano.asm - файл программы MpLab с подробнейшеми комментариями; piano.sch и piano.pcb - соответственно принципиальная схема и печатная плата в формате ACCEL EDA.


Иcточник: picro.narod.ru


Пианино на PIC16F876
Просмотров сегодня: 6380, всего: 6380
РЕЙТИНГ ТЕНДЕРЫ ИССЛЕДОВАНИЯ DATASHEETS КАТАЛОГ СХЕМ СХЕМЫ ФОРУМ ДОСКА ОБЪЯВЛЕНИЙ


Copyright © 2002-2021 RadioNet Admin

Страница создана за 0,01336 секунд.