Задача
Поддерживать заданную температуру, управляя нагревателем.
Микроконтроллер: PIC16F877A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F877A
- кварц 4 МГц + 2×22 пФ
- датчик LM35
- источник опорного 2,56 В
- реле, транзистор, обратный диод
- светодиод аварии
Схема подключения
| Вывод | Подключение |
|---|---|
| RA0 / AN0 | выход датчика LM35 |
| RA3 / VREF+ | опорное напряжение 2,56 В |
| RC0 | ключ реле нагревателя |
| RC1 | светодиод перегрева |
| RB0…RB7 | индикация текущей температуры |
Алгоритм
- Измерить температуру датчиком через АЦП.
- Если температура ниже нижнего порога — включить нагрев.
- Если выше верхнего порога — выключить нагрев.
- При превышении аварийного порога принудительно отключить нагрев и зажечь индикатор.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p49.asm · p49.hex (готовая прошивка).
;=======================================================
; Проект 49. Термостат с гистерезисом
; PIC16F877A, 4 МГц. Датчик LM35 на AN0, опорное 2,56 В на RA3
; Нагреватель через реле — RC0, светодиод перегрева — RC1
; Уставка 25 град., гистерезис 2 град.
;=======================================================
LIST p=16F877A
#include <p16f877a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF
cblock 0x20
d1, d2, temp
endc
SETPOINT equ .25 ; уставка, градусы
HYST equ .2 ; гистерезис, градусы
ORG 0x000
goto Start
Start
bsf STATUS,RP0
clrf TRISB ; индикация температуры
bcf TRISC,0 ; выход на реле
bcf TRISC,1 ; светодиод
movlw b'00001001' ; RA0 — датчик, RA3 — опорное
movwf TRISA
movlw b'00000101' ; VREF+ = RA3
movwf ADCON1
bcf STATUS,RP0
movlw b'01000001'
movwf ADCON0
bcf PORTC,0
bcf PORTC,1
Main
call Measure
movf temp,w
movwf PORTB ; показываем температуру
;--- ниже нижнего порога — греем ---
movlw SETPOINT - HYST
subwf temp,w
btfss STATUS,C
bsf PORTC,0
;--- выше верхнего порога — выключаем ---
movlw SETPOINT + HYST
subwf temp,w
btfsc STATUS,C
bcf PORTC,0
;--- аварийный перегрев ---
movlw SETPOINT + .10
subwf temp,w
btfsc STATUS,C
goto Overheat
bcf PORTC,1
goto Wait
Overheat
bcf PORTC,0 ; принудительно снимаем нагрев
bsf PORTC,1
Wait
call Delay
goto Main
Measure
bsf ADCON0,GO
MW btfsc ADCON0,GO
goto MW
movf ADRESH,w ; при опорном 2,56 В код равен градусам
movwf temp
return
Delay
movlw .200
movwf d1
DL1 movlw .250
movwf d2
DL2 nop
decfsz d2,f
goto DL2
decfsz d1,f
goto DL1
return
END
Пояснения
- Уставка и гистерезис заданы константами через директиву
equ— менять их можно в одной строке, не трогая логику. - Гистерезис в пару градусов резко сокращает число включений реле: без него контакты щёлкают постоянно и быстро выгорают.
- Аварийный порог — независимая защита: она срабатывает, даже если основная логика ошиблась или реле залипло.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.