Задача
Отбивать такт с регулируемым темпом звуком и светом.
Микроконтроллер: PIC16F84A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F84A
- кварц 4 МГц + 2×22 пФ
- пьезоизлучатель без генератора
- светодиод + резистор 330 Ом
- две кнопки + резисторы 10 кОм
Схема подключения
| Вывод | Подключение |
|---|---|
| RB0 | пьезоизлучатель (второй вывод на GND) |
| RB1 | светодиод через резистор 330 Ом |
| RA0 / RA1 | кнопки: быстрее и медленнее |
Алгоритм
- Выдать короткий тон и зажечь светодиод — это доля такта.
- Отсчитать паузу, длительность которой задаёт темп.
- Во время паузы опрашивать кнопки регулировки.
- Ограничить темп разумными пределами.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p50.asm · p50.hex (готовая прошивка).
;=======================================================
; Проект 50. Электронный метроном
; PIC16F84A, 4 МГц. Пьезоизлучатель — RB0, светодиод — RB1
; Кнопки RA0 (быстрее) и RA1 (медленнее), темп 40..208 уд/мин
;=======================================================
LIST p=16F84A
#include <p16f84a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
cblock 0x0C
d1, d2, period, cnt, beats
endc
ORG 0x000
goto Start
Start
bsf STATUS,RP0
clrf TRISB
movlw b'00011111'
movwf TRISA
bcf STATUS,RP0
clrf PORTB
movlw .50 ; стартовый темп (около 120 уд/мин)
movwf period
Main
call Click ; щелчок и вспышка
movf period,w ; пауза до следующей доли
movwf cnt
PDelay
call Delay10ms
call CheckKeys
decfsz cnt,f
goto PDelay
goto Main
;--- короткий тон 2 кГц на пьезоизлучателе ---
Click
bsf PORTB,1 ; вспышка светодиода
movlw .60
movwf beats
Tone
bsf PORTB,0
call Delay250us
bcf PORTB,0
call Delay250us
decfsz beats,f
goto Tone
bcf PORTB,1
return
CheckKeys
btfss PORTA,0 ; быстрее — уменьшаем паузу
goto Faster
btfss PORTA,1 ; медленнее — увеличиваем
goto Slower
return
Faster
movlw .20 ; предел темпа
subwf period,w
btfsc STATUS,C
decf period,f
return
Slower
movlw .150
subwf period,w
btfss STATUS,C
incf period,f
return
Delay250us
movlw .82
movwf d1
X2 nop
decfsz d1,f
goto X2
return
Delay10ms
movlw .20
movwf d2
Y1 movlw .165
movwf d1
Y2 nop
decfsz d1,f
goto Y2
decfsz d2,f
goto Y1
return
END
Пояснения
- Тон формируется переключением вывода с периодом, вдвое меньшим периода звука: 250 мкс на полупериод дают около 2 кГц.
- Пьезоизлучатель нужен пассивный, без встроенного генератора, иначе он выдаст собственный тон вместо заданного.
- Опрос кнопок встроен в паузу, поэтому регулировка отзывчива и не сбивает ритм.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.