Главная » Статьи » Proton PICBasic

Терморегулятор

При включении происходит чтение из ЕЕПРОМ установленной температуры и прибор выходит на измерение и регулировку температуры. На индикаторе отображается величина измеряемой температуры. Дискретность - 0.1 градуса С. 
Измерение происходит раз в 5-6 секунд.
При нажатии кнопки + или - происходит увеличение или уменьшение установленной температуры, при этом на индикаторе отбражается устанавливаемая температура (изначально 38 Гр. С.) и моргает точка. Если в течении примерно 10 сек не нажимается ни одна кнопка, то происходит запись установленной температуры в ЕЕПРОМ и прибор возвращается в режим измерения и регулировки температуры. На индикаторе - измеряемая температура. Собственно - вот:

Программа:

Code

'****************************************************************

'* Name : Термометр на 628А , семисегментном индикаторе

' FYT-3631BD - с общим анодом 

DEVICE 16F628A

REMINDERS = OFF

CONFIG INTOSC_OSC_NOCLKOUT , MCLRE_OFF, WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF

; включить внутренний генератор ...

'Reminders = On

DECLARE ALL_DIGITAL = ON ' все порты цыфровые

EDATA 380 ' записать в ЕЕПРОМ начальное значение 38 градусов

DIM Temp_read AS WORD ' считаное значение с датчика

DIM Sec AS WORD ' переменная счётчика

DIM TempC AS BYTE '

DIM TemperC AS WORD ' переменная для индикации

DIM TermUst AS WORD ' установленная температура Градусы

DIM U AS WORD ' установленная

DIM K AS WORD ' коррекция

DIM I AS FLOAT

DIM Erore AS WORD

DIM Time AS BYTE

DIM Float0 AS BYTE '

DIM Float1 AS BYTE '

DIM Out AS WORD ' выход

DIM c AS BIT ' бит конца преобразования

DIM b AS BIT '

DIM t AS BYTE ' для точки

DIM DigitDisp AS BYTE ; Для результата табличного преобразования

TRISA = %10110000 ' установить порт В 7, 5, 4 входами

TRISB = %00000000 ' установить порт А выходом 

SYMBOL led = PORTA.6 ' светодиод знака минус

SYMBOL DQ = PORTA.7 ' датчик температуры

SYMBOL rob = PORTA.3 ' нагрузка

SYMBOL pl = PORTA.5 ' кнопка плюс

SYMBOL mi = PORTA.4 ' кнопка минус



TermUst = EREAD 0 ' При вкл. питания прочитать из ЕЕПРОМ начальное значение

U = TermUst * 1.6

t = 128: Time = 0 ' Включить точку.

Sec = 599: K = 80 '

I = 0





;-------------------------- ОСНОВНАЯ ПРОГРАММА ------------------------------------------------------- 

main: 



IF mi = 0 OR pl = 0 THEN ' если нажата хоть одна кнопка то

Sec = 0 ' обнулить счётчик

GOTO knopki ' идти на обработку кнопок

ENDIF



GOSUB DisplayTime ' показать текущую температуру

INC Sec ' инкреминировать счётчик

IF Sec >= 600 THEN ' если счётчик равен или больше 300 то

Sec = 0: INC Time ' обнулить счётчик и считать значение температуры с датчика

OWRITE DQ, 1, [$CC,$44] ' Послать датчику DS18B20 команду старта измерения температуры 

REPEAT ' Начать внутренний цикл

GOSUB DisplayTime ' Ждать окончания преобразования пока не придет бит,

' показать текущую температуру

OREAD DQ, 4, [c] ' сигнализирующий об окончании преобразования 

UNTIL c > 0 ' Выйти из цикла если от DS18B20 поступил бит конца преобразования. 

OWRITE DQ, 1, [$CC,$BE] ' Послать команду чтения из ОЗУ датчика DS18B20 значения температуры 

OREAD DQ, 2, [Temp_read.LOWBYTE, Temp_read.HIGHBYTE] ' Прочитать значение температуры и записать

GOSUB DisplayTime ' показать текущую температуру

'-----------------------------Процедура преобразования температуры ----------------------------



IF Temp_read.11 = 1 THEN ' если температура отрицательная то

'High led ' включить минус

LOW led

Temp_read = ~Temp_read + 1 

ELSE ' иначе

'Low led ' выключить минус

HIGH led

ENDIF

; --------------------------считать значение температуры-------------------------------------

TempC = (Temp_read & $0FF0) >> 4

Float1 = Temp_read.LOWBYTE & $0F

Float0 = LOOKUPL Float1, [0,1,1,2,2,3,4,4,5,6,6,7,7,8,9,9]

TemperC = (TempC * 10) + Float0

GOSUB DisplayTime ' показать текущую температуру



;----------------------------------- Пропорциональное регулирование -----------------------------

Erore = U - Temp_read + 1



Out = 80 * Erore + K



IF Out < 0 THEN Out = 0

IF Out > 600 THEN Out = 600



IF U > Temp_read THEN DEC I

IF U < Temp_read THEN INC I



IF Time = 20 THEN

IF I < 0 THEN INC K

IF I > 0 THEN DEC K

IF K > 500 THEN K = 500

IF K < 11 THEN K = 11

Time = 0: I = 0 

ENDIF 

rob = 1 

ENDIF



IF Sec = Out THEN rob = 0



GOTO main 



DisplayTime: ;--------------------------------- отображение ----------------------------

DigitDisp = TemperC DIG 2 ; первая слева цыфра

'PORTA.0 = 0: PORTA.1 = 1: PORTA.2 = 1 ; включить первую цыфру, а остальные выключить

PORTA.0 = 1: PORTA.1 = 0: PORTA.2 = 0 ' для индикаторов собщим анодом FYT-3631BD

GOSUB LOOK ; сходить на преобразование в семисегментный код

DELAYMS 4 ; ждать 4 Мс для отображения

PORTB = %11111111 ; выключить все сегменты OA=1 FYT-3631BD, OK=0



DigitDisp = TemperC DIG 1 ; средняя цыфра

'PORTA.0 = 1: PORTA.1 = 0: PORTA.2 = 1 ; включить вторую цыфру, а остальные выключить

PORTA.0 = 0: PORTA.1 = 1: PORTA.2 = 0 ' для индикаторов собщим анодом FYT-3631BD

GOSUB LOOK ; сходить на преобразование в семисегментный код

PORTB = PORTB + t ; точка

DELAYMS 4 ; ждать 4 Мс для отображения

PORTB = %11111111 ; выключить все сегменты OA=1 FYT-3631BD, OK=0

DigitDisp = TemperC DIG 0 ; цыфра после точки

'PORTA.0 = 1: PORTA.1 = 1: PORTA.2 = 0 ; включить пследнюю цыфру, а остальные выключить

PORTA.0 = 0: PORTA.1 = 0: PORTA.2 = 1 ' для индикаторов собщим анодом FYT-3631BD

GOSUB LOOK ; сходить на преобразование в семисегментный код

DELAYMS 4 ; ждать 4 Мс для отображения

PORTB = %11111111 ; выключить все сегменты OA=1 FYT-3631BD, OK=0

RETURN



LOOK:

; таблица для индикаторов с общим катодом

'PORTB = LookUpL DigitDisp,[63,6,91,79,102,109,125,7,127,111]

; таблица для индикаторов с общим анодом

PORTB = LOOKUPL DigitDisp,[192,249,164,176,153,146,130,248,128,144]

RETURN 

;-----------------------обработка кнопок-----------------------------------------------

knopki: 

INC Sec: b = ~b ; инкреминировать счётчик , изменить состояние б

IF b = 0 THEN ; если б=0 то

t = 0 ; погасить точку

ELSE ; иначе

t = 128 ; включить точку (точка моргает).

ENDIF



TemperC=TermUst ; при установке присвоить значение устанавливаемой температуры пер. для индикации

FOR Temp_read=0 TO 10 ; 20 раз

GOSUB DisplayTime ' показать текущую температуру

NEXT Temp_read



IF pl=0 THEN ; если нажата кнопка плюс то

INC TermUst: Sec = 0 ; инкрименировать значение устанавливаемой температуры , обнулить счёчик

FOR Temp_read=0 TO 10 ; 10 раз

GOSUB DisplayTime ' показать текущую температуру

NEXT Temp_read

ELSEIF mi=0 THEN ; если нажата кнопка минус то

DEC TermUst: Sec = 0 ; декрименировать значение устанавливаемой температуры , обнулить счёчик

FOR Temp_read=0 TO 10 ; 10 раз

GOSUB DisplayTime ' показать текущую температуру

NEXT Temp_read

ENDIF



IF Sec >= 40 THEN ; если счётчик равен или больше 20 то

EWRITE 0,[TermUst] ; записать в ЕЕПРОМ значение установленой температуры

U = TermUst * 1.6

t = 128 ; включить точку.

Sec = 600 ; присвоить 300 счётчику для перехода на измерение температуры

GOTO main ; идти на основную программу

ENDIF

GOTO knopki 
 

Светодиод D1 - вкл. нагревателя.

Светодиод D2 - минус температуры (в зависимости от применения девайса можно не устанавливать). 

Индикаторы с общим катодом. Резисторы 30 - 100 Ом из практики.
В архиве есть печатка для трёх раздельных импортных индикаторов TDSR 5160.
Индикаторы на той печатке устанавливаются со стороны печатных проводников!

 А все файлы здесь

Обсудить на форуме

  Возможно, вас заинтересуют и другие статьи по этой теме - Программируемый термостат, USB HID термометр, Работа с датчиком DS18B20, Прибор для измерения влажности, Работа с датчиком DS18S20, Работа с датчиком LM35




Категория: Proton PICBasic | Добавил: mikhail09p (05.12.2010)
Просмотров: 8640 | Теги: измерения, PROTON, Протон, статьи, терморегулятор | Рейтинг: 5.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]