Главная » Статьи » Proton PICBasic |
При включении происходит чтение из ЕЕПРОМ установленной температуры и прибор выходит на измерение и регулировку температуры. На индикаторе отображается величина измеряемой температуры. Дискретность - 0.1 градуса С. Программа: 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 | |
Просмотров: 12330 | | |
Всего комментариев: 0 | |