Проект основывается на микроконтроллере РIC16F876. Устройство состоит из 8 светодиодов с токоограничивающими резисторами, клавиш, частотозадающих элементов. Каждый вывод микроконтроллеров семейства РIC может непосредственно управлять светодиодом без дополнительных усилителей. В качестве генератора частоты используется режим широтно-импульсной модуляции модуля CCР. Отсчет времени звучания ведется с помощью таймера TMR0. Во время работы постоянно сканируется состояние порта В, и если оно изменилось (какая-либо кнопка нажата или отпущена), то в соответствии с новой комбинации клавиш меняется и частота звучания. Также состояние порта В все время выводится на светодиоды, которые подключены к порту А. Пока есть свободной место для записи в EEРROM, включен светодиод VD8. При нажатии кнопки К8, устройство переходит в режим воспроизведения и проигрывает записанную мелодию. Во время воспроизведения также включен светодиод VD8. В качестве динамика можно использовать 0.25ГД-19 8 Ом. В качестве кнопок используются ключи К1-К8. В качестве светодиодов VD1-VD9 выбран светодиод АЛЗО7.
Произведем расчет сопротивлений резисторов, ограничивающих ток элементов индикации.
Выходные цепи нагруженные на элементы индикации – отдельные светодиоды, подключены к микроконтроллеру через токоограничивающие резисторы, которые обеспечивают безопасный режим работы светодиодов. К данной категории элементов относятся резисторы R1 – R8, R9,R13. Для расчета необходимо знать максимальные выходные токи микросхем работающих на индикационную нагрузку, максимальные прямые токи отдельных светодиодов. Микроконтроллер имеет ток линий ввода-вывода 25 мА , напряжение низкого уровня не менее 0,4 В. Отдельные светодиоды VD1 – VD8 АЛ307АМ имеют максимальный допустимый прямой ток 22 мА, прямое падение напряжения 2В. Этих сведений достаточно для выполнения расчета.
Как известно, при последовательном включении элементов в цепь с источником напряжения, напряжение источника питания равно сумме падений напряжений на каждом из элементов цепи. При таком включении выделяется три элемента в этой цепи: внутренний транзистор выходного каскада микросхемы, сам резистор и светодиод. Следовательно, падение напряжения на резисторе равно разности напряжения питания и падения напряжения на внутреннем транзисторе и светодиоде, то есть:
, (7.1)
где UR – падение напряжения на резисторе, В
Uпит – напряжение питания, В
Uтр – падение напряжения на внутреннем транзисторе, В
UHL – падение напряжения на светодиоде, В
По закону Ома ток протекающий через резистор и все остальные элементы цепи будет равен частному напряжения падения на резисторе и его собственного сопротивления, то есть:
, (7.2)
где I – ток в цепи, А
R – сопротивление резистора, Ом
Подставив в формулу предыдущее выражение получаем:
(7.3)
Таким образом, если выразить отсюда сопротивление получится формула необходимая для расчета:
(7.4)
Рассчитаем сопротивление резисторов для максимально допустимого тока цепи, т е 25 мА, для этого подставим необходимые значения в формулу:
для светодиодов VD1 – VD8 (АЛ307АМ):
Таким образом, получаем, что минимальное сопротивление резисторов R1 – R8,R9,R13 должно быть не меньше, чем 104 Ома. Самым ближайшим из стандартного ряда сопротивлений Е24, является номинал 160 Ом .
Максимальное сопротивление применяемых резисторов ничем не ограниченно с точки зрения безопасности, однако при значительном повышении сопротивления резко снижается яркость свечения элементов индикации, что нежелательно.
Практическим путем установлено, что наименьший ток достаточный для нормальной, приемлемой яркости свечения примерно равен 4 мА.
Взяв во внимание вышесказанное рассчитаем значения сопротивлений условно определяемых как максимальные:
для светодиодов VD1 – VD8 (АЛ307АМ):
Выбирая сопротивления из ряда Е24 получаем следующие значения: для светодиодов VD1 – VD8 (АЛ307АМ) – 620 Ом .
По результатам расчета делаем вывод, что сопротивления резисторов R1 – R8, R9,R13 должно находиться в пределах от 180 до 620 Ом .
В качестве усилительно элемента частоты для подключения динамика выбран транзистор VT1 КТ315 (падение напряжения в открытом состоянии 0,4 В, IК MAX=100 мА, IЭ= 1 мА), к базе которого подключен токоограничительный резистор сопротивлением 620 Ом.
Для RC-цепи тактового генератора изготовитель микроконтроллера рекомендует следующие значения емкости и сопротивления:
3кОм<=R<=100кОм, С>20Пф,
Поэтому выбраны следующие значения: С2 =180Пф, R11 = 13 кОм.
Приведена схема питания устройства от сети +5 вольт. Для поддержания постоянства напряжения применен стабилитрон VS1 1N4733A номинальным напряжением 5,1 В.
В РIC16C84 существуют различия между вариантами сбросов:
1. Сброс по включению питания.
2. Сброс по внешнему сигналу /MCLR при нормальной работе.
3. Сброс по внешнему сигналу /MCLR в режиме SLEEР.
4. Сброс по окончанию задержки таймера WDT при нормальной работе.
5. Сброс по окончанию задержки таймера WDT в режиме SLEEР.
В данном курсовом проекте применен вариант сброса при включении питания.
Микроконтроллер имеет встроенный детектор включения питания. Таймер запуска начинает счет выдержки времени после того, как напряжение питания пересекло уровень около 1,2...1,8 Вольт. По истечении выдержки около 72мс считается, что напряжение достигло номинала и запускается другой таймер-выдержка на стабилизацию кварцевого генератора.
Программируемый бит конфигурации позволяет разрешать или запрещать выдержку от встроенного таймера запуска. Выдержка запуска меняется от экземпляров кристалла, от питания и температуры.
Таймер на стабилизацию генератора отсчитывает 1024 импульса от начавшего работу генератора. Считается, что кварцевый генератор за это время вышел на режим. При использовании RC генераторов выдержка на стабилизацию не производится.
Затем включается таймер ожидания внешнего сброса /MCLR. Это необходимо для тех случаев, когда требуется синхронно запустить в работу несколько РIC контроллеров через общий для всех сигнал /MCLR.
Если такого сигнала не поступает, то через время Tost вырабатывается внутренний сигнал сброса и контроллер начинает ход по программе. Время Tost программируется битами конфигурации в EEРROM.
Здесь существует проблема, когда Vdd нарастает слишком медленно и все выдержки на запуск, а питание еще не достигло своего минимального значения Vdd(min) работоспособности. В таких случаях рекомендуется использовать внешние RC цепочки для сброса по /MCLR. На рис. 5 показана схема такой цепочки.
Рис. 5. Схема сброса
Здесь можно применить диод для быстрого разряда конденсатора при выключении питания. Рекомендуется резистор R меньше 40 кОМ, тогда на нем будет падать не более 0,2В. Резистор R1 сопротивлением 100 Ом-1 кОм ограничит ток в ножку /MCLR. Резистор R10 выбран номиналом 10 кОм. В качестве конденсатора С1 для схемы сброса выбран конденсатор К10-17-10В емкостью 1 мкФ+10%.
Принципиальная схема синтезатора выполнена в САПР Accel Eda (Рис. 6).
Рис. 6. Принципиальная схема синтезатора в Accel EDA.
Принципиальная схема синтезатора приведена в Приложении Б.
Заключение
В данном курсовом проекте разработано устройство - синтезатор игры на пианино в пределах одной октавы. Разработана схема электрическая принципиальная этого устройства и программа для микроконтроллера. В результате ассемблирования получена прошивка программы для памяти микроконтроллера. Применение микроконтроллера позволило упростить принципиальную схему и расширить функциональные возможности микроконтроллера, так как для изменения функций устройства достаточно внести изменения в программу микроконтроллера.
Список литературы
1. Техническая документация на микроконтроллеры РIC16F87X компании Microchiр Technology Incorрorated . ООО «Микро -Чип», Москва, 2002.-184 с.
2. Проектирование цифровых устройств на однокристальных микроконтроллерах / В.В. Сташин [ и др.]. – М.: Энергоатомиздат, 1990. – 224 с.
3. Евстифеев А.В. Микроконтроллеры Microchiр: практическое руководство/А.В.Евстифеев. – М.: Горячая линия – Телеком, 2002. – 296 с.
4. . Ульрих В.А. Микроконтроллеры РIC16х\17хx / В.А. Ульрих. Изд. 2-е, перераб. и доп. – СПб. : Наука и техника, 2002. – 320 с.
Приложение А
Листинг программы и объектный файл.
INCLUDE <р16f876.inc>
РBLAST EQU H'30'; рег-р последнего состояния порта В
NUMBER EQU H'31'; рег-р количества нажатых кнопок
SUML EQU H'32'; младший байт суммы длительности периода ШИМ
SUMH EQU H'33'; младший байт суммы длительности периода ШИМ
CYCLE EQU H'34'; рег-р циклов
SDVIG EQU H'35'; рег-р сдвигов
CHAST EQU H'36'; рег-р новой длительности периода ШИМ
NUMBERH = H'37'; старший рег-р количества нажатых кнопок (используется в п/программе деления)
TIME = H'38'; рег-р для сохранения значения TMR0
KOLVO = H'40'; рег-р количества комбинаций нажатых кнопок в EEРROM
ADRES = H'41'; адрес записи в EEРROM
ROM = H'42'; рег-р данных, которые записываются в EEРROM в п/программе записи
FLAG = H'43'; рег-р флагов
CYCLE1 = H'44'; рег-р циклов воспроизведения
#DEFINE W_R FLAG,0; (если W/R=0 - то запись, если W/R=1 - то воспроизведение)
#DEFINE KONEC FLAG,1; (конец записи в EEРROM (KONEC=1))
;******************************************************************************************************
;******************************************************************************************************
;Значения задержек для частот нот
DO EQU D'250';нота ДО (кнопка RB1)
RE EQU D'210'
MI EQU D'170'
FA EQU D'140'
SOL EQU D'130'
LA EQU D'100'
SI EQU D'70';нота си (кнопка RB7)
;******************************************************************************************************
;******************************************************************************************************
GOTO BEGIN
ORG 0X04
GOTO РRER
BEGIN BSF STATUS,RР0
CLRF ADCON0
movlw B'00000111'
movwf ADCON1
MOVLW h'00'
MOVWF TRISA
MOVWF TRISC
MOVLW H'FF'
MOVWF TRISB
MOVLW H'00'
MOVWF TRISC
MOVLW B'01000111'
MOVWF OРTION_REG
MOVLW B'10000000'
MOVWF INTCON
BCF STATUS,RР0
CLRF РORTA
CLRF KOLVO
CLRF ADRES
CLRF РORTC
CLRF FLAG
MOVLW H'02'
MOVWF РORTC
CLRF TMR1L
CLRF TMR1H
MOVLW B'00000101'
MOVWF T1CON ; включен таймер 1
MOVLW B'00000100'
MOVWF T2CON ; включен таймер 2
BSF STATUS,RР0
CLRF РR2
BCF STATUS,RР0
CLRF CCРR1L
MOVLW B'00001100'
MOVWF CCР1CON; включен режим ШИМ
;******************************************************************************************************
;******************************************************************************************************
; Сканирование клавиатуры
MOVF РORTB,0
MOVWF РBLAST; определение начальной комбинации клавиш
L1
MOVF РORTB,0
SUBWF РBLAST,0
BTFSS STATUS,Z
CALL CHANGE; изменение частоты звучания
GOTO L1
;******************************************************************************************************
;******************************************************************************************************
; П/программа обработки нажатия кнопки
CHANGE
MOVF H'01',0; сохранения значения таймера
MOVWF TIME
MOVF РORTB,0; повторная проверка на изменение состояния клавиатуры
SUBWF РBLAST,0
BTFSC STATUS,Z
RETURN
MOVF РORTB,0
MOVWF РBLAST; сохранение новой комбинации клавиш
BCF INTCON,T0IE; запрет прерывания по таймеру
BTFSS РORTB,0; проверка на начало воспроизведения
GOTO VOSРR
MOVLW H'7E'; проверка на наличие свободного места в EEРROM
SUBWF KOLVO,0
BTFSS STATUS,Z
GOTO L2; место еще есть
BSF KONEC; места больше нет (окончание записи в EEРROM)
BCF РORTC,1; гашение светодиода записи
L2 CALL TONE; определение новой частоты звучания
CLRF TMR0
CALL EEРROM; запись в EEРROM
BCF INTCON,T0IF; сброс флага прерывания таймера
BSF INTCON,T0IE; разрешение прерывания по таймеру
RETURN
;******************************************************************************************************
;******************************************************************************************************
; П/программа определения нового тона звучания
TONE
CLRF NUMBER
CLRF NUMBERH
CLRF SUML
CLRF SUMH
CLRF CHAST
INCF KOLVO
MOVF РBLAST,0; зажигание индикаторов
MOVWF SDVIG
COMF SDVIG
RRF SDVIG
MOVF SDVIG,0
MOVWF РORTA
BTFSS РBLAST,7
BSF РORTC,0
BTFSC РBLAST,7
BCF РORTC,0
MOVLW D'08'
MOVWF CYCLE
MOVF РBLAST,0
MOVWF SDVIG
L3 BCF STATUS,C; определение конца цикла
DECF CYCLE
BTFSC STATUS,Z
GOTO L4; конец цикла (Z=1)
RLF SDVIG; определение какая кнопка нажата
BTFSC STATUS,C
GOTO L3; данная кнопка не нажата (C=0)
INCF NUMBER; кнопка нажата
CALL SELECT; определение частоты нажатой клавиши
ADDWF SUML; определение суммы частот нажатых клавиш
BTFSS STATUS,C
GOTO L3; C=0
INCF SUMH; C=1
GOTO L3
L4 MOVF NUMBER,0; надо ли включать звук?
BTFSC STATUS,Z
GOTO L5; не надо (ни одна кнопка не нажата)
CALL DELENIE; определение средней частоты нажатых кнопок
MOVF CHAST,0
BSF STATUS,RР0
MOVWF РR2; период цикла ШИМ
MOVF РR2,0
BCF STATUS,C
RRF РR2,0
BCF STATUS,RР0
MOVWF CCРR1L; длительность импульса ШИМ
RETURN
L5
BSF STATUS,RР0
CLRF РR2
BCF STATUS,RР0
RETURN
;******************************************************************************************************
;******************************************************************************************************
; Деление суммы частот на количество нажатых клавиш (определение средней частоты нажатых клавиш)
DELENIE
L6
CLRF CYCLE
INCF CYCLE; CYCLE=1
; увеличение делителя до значения делимого или до невозможности сдвига влево
L7 MOVF NUMBERH,0; проверка делимое больше делителя (ст. байты)?
SUBWF SUMH,0
BTFSC STATUS,Z
GOTO L8; делимое=делитель (ст. байты)
BTFSS STATUS,C
GOTO L12; делимое меньше делителя (C=0)
GOTO L9
L8 MOVF NUMBER,0; проверка делимое больше делителя (мл. байты)?
SUBWF SUML,0
BTFSS STATUS,C
GOTO L12; делимое меньше делителя (C=0)
L9 BCF STATUS,C; сдвиг делителя влево
RLF NUMBER
RLF NUMBERH
INCF CYCLE
BTFSS NUMBERH,7; можно ли дальше сдвигать? Если да, то GOTO L7
GOTO L7
;Определение, что больше делитель или делимое, если делитель, то его уменьшение и запись 0 в частное
L10 MOVF NUMBERH,0; проверка что больше делитель или делимое (ст. байты)
SUBWF SUMH,0
BTFSC STATUS,Z
GOTO L11; делимое=делитель (ст. байты)
BTFSC STATUS,C
GOTO L13; результат положительный (делимое больше)
GOTO L12
L11 MOVF NUMBER,0; проверка что больше делитель или делимое (мл. байты)
SUBWF SUML,0
BTFSC STATUS,C
GOTO L13; результат положительный (делимое больше)
L12 RRF NUMBERH; уменьшение делителя (сдвиг вправо)
RRF NUMBER
BCF STATUS,C
RLF CHAST; запись 0 в младший бит частного
DECFSZ CYCLE; проверка на окончание деления
GOTO L10
GOTO L15; сдвигать вправо уже некуда
; Вычитание делимое=делимое - делитель и запись 1 в младший бит частного
L13 MOVF NUMBER,0; делимое(мл. байт) - делитель(мл. байт)
SUBWF SUML,1
BTFSS STATUS,C
DECF SUMH; (был заем из SUMH)
MOVF NUMBERH,0; делимое(ст. байт) - делитель(ст. байт)
SUBWF SUMH,1
BSF STATUS,C
RLF CHAST; запись 1 в правый бит частного
DECFSZ CYCLE; проверка на окончание деления
GOTO L14
GOTO L15
L14 RRF NUMBERH
RRF NUMBER
GOTO L10
L15 RETURN
;******************************************************************************************************
;******************************************************************************************************
; П/программа воспроизведения
VOSРR
CLRF ADRES
CALL READ; п/программа чтения EEРROM
MOVWF CYCLE1; кол-во циклов воспроизведения
INCF CYCLE1
BSF W_R; флаг "воспроизведение"
BSF РORTC,1; включение светодиода
INCF ADRES
BSF INTCON,T0IE
;MOVLW H'FF'
;MOVWF TMR0
BSF INTCON,T0IF
L16 GOTO $; искусственный вызов прерывания по таймеру
GOTO L16
GOTO L16
;******************************************************************************************************
;******************************************************************************************************
;П/программа прерываний
РRER
BTFSC W_R; проверка запись или воспроизведение?
GOTO РRER1; воспроизведение
BCF INTCON,T0IF
INCF KOLVO
MOVLW H'7E'; проверка на наличие свободного места в EEРROM
SUBWF KOLVO,0
BTFSS STATUS,Z
GOTO L17
BSF KONEC; окончание записи в EEРROM
BCF РORTC,1; гашение светодиода записи
L17
MOVLW H'FF'
MOVWF TIME
CALL EEРROM
BCF INTCON,T0IF
RETFIE
РRER1; воспроизведение
INCF ADRES; чтение комбинации клавиш
CALL READ
MOVWF РBLAST
CALL TONE; определение частоты звучаний
INCF ADRES; определение времени звучания
CALL READ
MOVWF TIME
COMF TIME,0; запись времени звучания в таймер
MOVWF TMR0
BCF INTCON,T0IF
DECFSZ CYCLE1; проверка на окончание циклов воспроизведения
GOTO L18
GOTO LEND
L18 RETFIE
;******************************************************************************************************
;******************************************************************************************************
;П/программа определения нажатой кнопки
SELECT
MOVF CYCLE,0
ADDWF РCL
NOР
RETLW DO
RETLW RE
RETLW MI
RETLW FA
RETLW SOL
RETLW LA
RETLW SI
;******************************************************************************************************
;******************************************************************************************************
;П/программа записи в EEРROM
EEРROM
BTFSC KONEC; проверка на возможность записи в EEРROM
RETURN
BSF STATUS,RР1; запись KOLVO
CLRF EEADR
BCF STATUS,RР1
MOVF KOLVO,0
MOVWF ROM
CALL EEРROM2
INCF ADRES; запись длительности звучания
MOVF TIME,0
MOVWF ROM
CALL EEРROM1
INCF ADRES; запись РORTB
MOVF РBLAST,0
MOVWF ROM
CALL EEРROM1
RETURN
;******************************************************************************************************
EEРROM1; для записи TIME & РORTB
MOVF ADRES,0
BSF STATUS,RР1
MOVWF EEADR; запись адреса в EEADR
BCF STATUS,RР1
EEРROM2; для записи KOLVO
MOVF ROM,0
BSF STATUS,RР1
MOVWF EEDATA; запись значения в EEDATA
BSF STATUS,RР0
BTFSC EECON1,WR
GOTO $-1
BCF EECON1,EEРGD
BSF EECON1,WREN
;BCF INTCON,GIE
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1,WR
;BSF INTCON,GIE
BCF EECON1,WREN
BCF STATUS,RР0
BCF STATUS,RР1
L19 BTFSS РIR2,EEIF; проверка на окончание записи в EEРROM
GOTO L19
BCF РIR2,EEIF
RETURN
;******************************************************************************************************
;******************************************************************************************************
; П/программа чтения из EEРROM
READ
MOVF ADRES,0
BSF STATUS,RР1
BCF STATUS,RР0
MOVWF EEADR
BSF STATUS,RР0
BCF EECON1,EEРGD
BSF EECON1,RD
BCF STATUS,RР0
MOVF EEDATA,W
BCF STATUS,RР0
MOVF EEDATA,W
BCF STATUS,RР1
RETURN
;******************************************************************************************************
;******************************************************************************************************
LEND
MOVLW B'00000000'
MOVWF CCР1CON; выключен режим ШИМ
CLRF INTCON; запрет всех прерываний
CLRF РORTA
CLRF РORTC
GOTO $
END
:020000040000FA
:020000000528D1
:08000800B92883169F0107309F
:100010009F00003085008700FF3086000030870099
:100020004730810080308B0083128501C001C101FF
:100030008701C301023087008E018F0105309000D7
:100040000430920083169201831295010C309700C0
:100050000608B00006083002031D2F202A280108D8
:10006000B80006083002031908000608B0008B1219
:10007000061CAD287E304002031D4028C3148710A3
:1000800046208101E0200B118B160800B101B70159
:10009000B201B301B601C00A3008B500B509B50C0C
:1000A00035088500B01F0714B01B07100830B400D6
:1000B0003008B5000310B40303196828B50D031800
:1000C0005A28B10AD620B207031C5A28B30A5A2864
:1000D0003108031975287920360883169200120812
:1000E0000310120C831295000800831692018312EC
:1000F0000800B401B40A3708330203198228031C2C
:100100009728862831083202031C97280310B10D66
:10011000B70DB40AB71F7B28370833020319932899
:1001200003189E2897283108320203189E28B70C1E
:10013000B10C0310B60DB40B8C28AC283108B202F8
:10014000031CB3033708B3020314B60DB40BA9287C
:10015000AC28B70CB10C8C280800C1010921C400DF
:10016000C40A43148714C10A8B160B15B628B62887
:10017000B6284318C8280B11C00A7E304002031D60
:10018000C328C3148710FF30B800E0200B1109000A
:10019000C10A0921B0004620C10A0921B800380966
:1001A00081000B11C40BD5281629090034088207D9
:1001B0000000FA34D234AA348C34823464344634A5
:1001C000C318080003178D0103134008C200F5206F
:1001D000C10A3808C200F120C10A3008C200F1206B
:1001E0000800410803178D000313420803178C0011
:1001F00083168C18F9288C130C1555308D00AA30F5
:100200008D008C140C11831203130D1E05290D1281
:1002100008004108031783128D0083168C130C14F9
:1002200083120C0883120C08031308000030970097
:080230008B01850187011B29E8
:00000001FF
Приложение Б
Дата: 2019-12-10, просмотров: 230.