'**************************************************************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 07.09.2011 * '* Version : 1.0 * '* Notes : * '* : * '**************************************************************** @ device pic12F675, cpd_off, wdt_on, PWRT_off, mclr_off , bod_off DEFINE OSCCAL_1K 1 CMCON = %00000111 ANSEL = %01110010 OUTPUT GPIO.0 GPIO.0 = 0 m var GPIO.0 ' Управление компрессором ust var byte ' Переменная хранения заданной температуры q var byte t var word ' Время работы компрессора t = 0 Comm_Pin var GPIO.4 ' Сюда цепляется DS18B20 Sign VAR BYTE ' +/- Dummy VAR BYTE R_Temp VAR WORD TempC VAR WORD ' Температура в C TempF VAR WORD ' Температура в F Float VAR WORD Busy VAR BIT ' Busy Status-Bit temp_d VAR BYTE Cold_Bit VAR R_Temp.Bit11' Sign-Bit for +/- Temp. 1 = Below 0 deg C Real_Cold CON 1 ' Define Real_Cold = 1 temp var byte m = 0 begin: pause 1000 if m = 1 then t = t + 1 endif if t >= 14400 then timeout ' Оттайка 40 мин. после 4х часов работы adcin 1, ust ' Сюда цепляется переменный резистор для установки заданного значения температуры ust = ust/42 + 2 GOSUB ts ' Подпрограмма опроса DS18B20 if sign = "-" THEN m = 1 goto begin endif IF temp >= ust + 3 THEN start if temp <= ust + 1 THEN ostanov goto begin start: m = 1 goto begin ostanov: m = 0 goto begin timeout: m = 0 for q = 1 to 40 pause 60000 NEXT q t = 0 goto begin ts: Start_Convert1: OWOUT Comm_Pin, 1, [$CC, $44] Wait_Up1: OWIN Comm_Pin, 4, [Busy] IF Busy = 0 THEN Wait_Up1 OWOUT Comm_Pin, 1, [$CC, $BE] OWIN Comm_Pin, 2, [R_Temp.Lowbyte, R_Temp.Highbyte] Convert_Temp: IF Cold_Bit = Real_Cold THEN Yikes Sign = "+" Dummy = 625 * R_Temp TempC = DIV32 10 Dummy = 1125 * R_Temp TempF = DIV32 100 IF TempF >6795 THEN TempF = TempF + 3200 ELSE TempF = TempF + 3200 ENDIF TempC = (R_Temp & $0FF0) >> 4 Float = ((R_Temp.Lowbyte & $0F) * 625) temp = TempC: temp_d = Float DIG 3 RETURN Yikes: Sign = "-" Dummy = 625 * ~R_Temp+1 TempC = DIV32 10 TempF = ~R_Temp / 16 IF TempF >=18 THEN TempF = ((((TempF + 50) * 9) /5) -122) temp = (TempC DIG 4)*10 + (TempC DIG 3): temp_d = TempC DIG 2 ELSE TempF = ((((-TempF + 50) * 9) /5) -58) temp = (TempC DIG 4) *10 + (TempC DIG 3): temp_d = TempC DIG 2 ENDIF RETURN