6.12. Музыкальный звонок
1. Краткое описание
Эта схема музыкального звонка собрана на микроконтроллере, может быть, это похоже на «забивание гвоздей логарифмической линейкой», тем не менее у нее есть некоторые преимущества. Во-первых, используется всего одна микросхема, благодаря чему, кроме традиционных преимуществ вроде увеличения надежности, уменьшения потребления энергии, появляется принципиальная возможность разместить всю схему в очень небольшом объеме, например оформив в виде музыкальной поздравительной открытки.
2. Схема
Рис. 6.13. Электрическая принципиальная схема музыкального звонка
Благодаря использованию микроконтроллера схема предельно упрощается, необходимо только подключить питание (от 2,7 до 6 В), кварцевый резонатор и, если необходимо, усилитель низкой частоты, собранный на транзисторе КТ815. Если предполагается, что ток через нагрузку не будет превышать 20 мА (например, при использовании пьезоизлучателя), можно обойтись без усилителя.
Следует заметить, что 20 мА — это максимальный ток логического нуля, т. е. второй вывод звукового излучателя следует подключать к плюсу питания.
Кнопка звонка должна иметь нормально замкнутые контакты, при нажатии на нее схема обесточивается, а при отпускании на нее подается питание и происходит автоматический сброс микроконтроллера.
Сразу же после сброса начинает работать программа, проигрывающая заданную мелодию. После завершения мелодии микроконтроллер переходит в режим пониженного энергопотребления Power Down и находится в нем до следующего нажатия на кнопку.
Частоту кварца можно выбрать практически любую в диапазоне от 32 768 кГц до 10 МГц. Схема была проверена на частоте 10 МГц. Если вы хотите использовать кварц на меньшую частоту (при этом уменьшится и потребляемый ток схемы), необходимо пропорционально уменьшить коэффициенты таблицы SoundTab и длительности звучания всех нот.
3. Программа
Эта программа написана на ассемблере для AT90S2313, таблица нот рассчитана для работы процессора на максимальной частоте 10 МГц, вместо мелодии используется проигрывание гаммы от более низких нот к более высоким и обратно. Текст программы:
.INCLUDE "2313def.inc"
.DEF Step=r20
.DEF Freqlndex=r21
.DEF FreqDelay=r22
.DEF SSREG=r23
.CSEG
.ORG 0
rjmp Reset
.ORG OVFOaddr
in SSREG,SREG
dec FreqDelay
out SREG,SSREG
reti
Reset:
ldi r30,$DF
out SPL,r30
; Настройка направления работы линий порта В
ldi r30,$08
out DDRB,r30
; Режим работы таймера 0 с максимальным предварительным делением
; Здесь же разрешаем прерывания
ldi г30,$05
out TCCR0,r30
ldi r30,$02
out TIMSK,r30
sei
; Режим работы таймера 1 на переключение внешнего вывода,
; выбор коэффициента предварительного деления тактовой частоты 1:1
; и автоматический сброс таймера при совпадении
ldi r30,$40
out TCCR1A,r30
ldi r30,$09
out TCCR1B,r30
; Установка номера шага на начало
clr Step
ReadNote:; Чтение длительности и номера одной ноты
ldi r31,High(2*ProgramTab); Freqlndex = Lo ProgramTab[Step]
ldi r30,Low(2*ProgramTab); FreqDelay = Hi ProgramTab[Step]
mov r0,Step; Step++
lsl r0
add r30,r0
inc Step
lpm
mov Freqlndex,r0
inc r30
lpm
sbrc r0,7
rjmp SleepReset; Если старший бит установлен, то
mov FreqDelay,r0; это означает, что мелодия закончилась
SetFreq:; Настройка таймера 1 на вывод частоты текущей ноты
ldi r31,High(2*SoundTab); OCR1A = SoundTab[FreqIndex]
ldi r30,Low(2*SoundTab)
lsl Freqlndex
add r30,FreqIndex
lpm
out OCR1AL,r0
inc r30
lpm
out OCR1AH,r0
Wait: tst FreqDelay ; Ожидаем заданное время, пока проигрывается
brne Walt; текущая нота
rjmp ReadNote
SleepReset:
ldi r30,$3F ; Подготовка к переходу в режим Power Down
out MCUCR,r30
sleep; Отключение микроконтроллера
rjmp Reset; Эта команда в данной версии программы не должна исполняться никогда
.ORG $100
SoundTab:
; Таблица констант соответствующим нотам
; Желательно выровнять таблицу по границе 256 байтов, чтобы упростить программу, отказавшись от операций с 16-битовыми словами.
.DW 11364,10292,9322,8443,7647,6926,6273; 440 Гц — нота "ля"
.DW 5682,5146,4661,4222,3824,3463,3137: вторая октава
.DW 2841,2573,2330,2111,1912,1732,1568; третья октава
; При необходимости таблицу можно продолжить
ProgramTab:
; Таблица последовательности нот,
; формат таблицы: байт длительности/кода операции, байт номера частоты
; В этом примере записано проигрывание гаммы
.DW $1001, $1002, $1003, $1004, $1005, $1006, $1007
.DW $1008, $1009, $100А, $100В, $10 °C, $100D, $100Е
.DW S200D, $2006, $2009, $2007, $2005, $2003, $2001
.DW $8000
EXIT
Автор: Сафонников В. В. (E-mail: sw@ufanet.ru).