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).