Device = 16F877A ' Сконфигурировать программу для микроконтроллера 16F628A Xtal = 20 ' Установить частоту кварцевого генератора равной 20 МГц. Declare LCD_Type = 0 ' Использовать алфавитно-цифровой ЖКИ Declare LCD_Interface = 4 ' Использовать 4-разрядный интерфейс для подключения ЖКИ Declare LCD_DTPin = PORTB.4 ' Использовать RB4,RB5,RB6,RB7 для подключения D4,D5,D6,D7 (цепей данных) ЖКИ Declare LCD_RSPin = PORTB.2 ' Подключение цепи RS ЖКИ Declare LCD_ENPin = PORTB.3 ' Подключение цепи EN ЖКИ Declare LCD_Lines = 2 ' Использовать 2-х строчный ЖКИ Declare LCD_CommandUs = 2000 ' Установить паузы между передачей команд на ЖКИ равными 2000 микросекундам Declare LCD_DataUs = 50 ' Установить паузы между передачей данных на ЖКИ равными 50 микросекундам Declare Adin_Res = 10 ' Установить кол-во битов в результате АЦП-преобразования (8, 10, или 12) Declare Adin_Tad = FRC ' Установить синхронизацию от внутреннего RC генератора Declare Adin_Stime = 50 ' Установить время ожидания в 50 мкс перед началом преобразования '-----------------------------------------------Настройки портов----------------------------------------------- TRISA = %00000001 ' Сделать канал (вывод) 1 - входом, 0 - выходом 'PORTA = %00000000 ' Сброс всех каналов TRISB = %00000000 ' Сделать канал (вывод) 1- входом, 0 - выходом 'PORTB = %00000000 Сброс всех каналов TRISC = %00000000 ' Сделать канал (вывод) 1 - входом, 0 - выходом PORTC = %00000000 ' Сброс всех каналов TRISD = %11111111 ' Сделать канал (вывод) 1 - входом, 0 - выходом 'PORTd = %00000000 ' Сброс всех каналов OPTION_REG = %00000110 TMR0=131 INTCON = %10100000 ADCON1 = %10000000 ' Установить 0 - вывод PORTA в режим АЦП '-------------------------------------------Объявление переменных------------------------------------------- Symbol DS1 = PORTB.0 ' Подключить DS18S20 к выводу - фактическая Symbol DS2 = PORTB.1 ' Подключить DS18S20 к выводу - выброс воздуха Symbol Kompres = PORTC.2 ' Компресор Symbol Ven_bis = PORTC.0 ' Вентелятор быстро Symbol Ven_med = PORTC.1 ' Вентилятор медлено Dim T_FAKT As Float ' Переменная для вывода на индикацию значения температуры DS1 (фактическая) Dim T_IND2 As Float ' Переменная для вывода на индикацию значения температуры DS2 (выброс воздуха) Dim T_Zadan As Float ' Переменная заданой температуры Dim R_Temp As Word ' Переменная для получения значения температуры отдельными двумя байтами Dim Ms As Word ' Переменная для хранения значения милисекунд Dim Sec As Byte ' Переменная для хранения значения секунд Dim Minut As Byte ' Переменная для хранения значения милисекунд Dim Hour As Byte ' Переменная для хранения значения милисекунд Dim f_izm_t As Bit ' Флаг на начало измерения температуры Dim Uroven_menu As Byte ' Уровень меню Dim smen_reg As Bit ' Флаг для смены режима индикации Dim F_s_r As Byte ' Переменная для смены режима индикации Dim Vent_reg As Bit ' Флаг режима работы вентилятора (0 - медлено, 1 - быстро) Dim Reg_otkl As Bit ' Флаг режима работы таймера на откл. кондера (0 - выкл, 1 - вкл) Dim Time_rab_H As Byte ' Таймер работы компресора часы Dim Time_otd_H As Byte ' Таймер отдыха компресора часы Dim Time_otk_H As Byte ' Таймер отключения кондиционера часы Dim Time_rab_M As Byte ' Таймер работы компресора минуты Dim Time_otd_M As Byte ' Таймер отдыха компресора минуты Dim Time_otk_M As Byte ' Таймер отключения кондиционера минуты Dim key As Byte ' Номер нажатой кнопки Dim BtnVar1 As Byte ' Перменная для кнопки Dim BtnVar2 As Byte ' Перменная для кнопки Dim BtnVar3 As Byte ' Перменная для кнопки Dim Analog As Word ' Объявить переменную VAR1 размером WORD '--------------------------------------Присвоение начальных значений--------------------------------------- Uroven_menu = 5 Time_rab_H = 1 ' Таймер работы компресора часы Time_otd_H = 1 ' Таймер отдыха компресора часы Time_otk_H = 1 ' Таймер отключения кондиционера часы Time_rab_M = 1 ' Таймер работы компресора минуты Time_otd_M = 1 ' Таймер отдыха компресора минуты Time_otk_M = 1 ' Таймер отключения кондиционера минуты Ven_med = 1 ' --------------------------------------------Создание символа знака градуса --------------------------------------- Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00 ' Поcлать на ЖКИ команду создания знака градуса, ' чтобы можно было на ЖКИ при печати цифры 8 видеть ' символ градуса On_Interrupt GoTo Prerivanie Enable '----------------------------------------------Главная программа----------------------------------------------- main: ' Метка начала гланой программы Analog = ADIn 0 DelayUS 100 ' Пауза 1 мкс Button PORTD.0, 0, 255, 250, BtnVar1, 1, Press1 ' Меню 1 Button PORTD.1, 0, 255, 250, BtnVar2, 1, Press2 ' Влево (вниз) 2 Button PORTD.2, 0, 255, 250, BtnVar3, 1, Press3 ' Вправо (вверх) 3 key = 0 main1: If f_izm_t = 0 And key = 0 Then GoTo main If f_izm_t = 1 Then GoSub TERMO_izmer ' Выполнить подпрограмму измерения температуры Cls Select Case Uroven_menu Case 0 If smen_reg = 0 Then Print At 1, 1, "tf-", Dec1 T_FAKT, 8, " ", Dec5 Analog ' 8 Выводит на ЖК знак градуса Print At 2, 1, "tz-", Dec1 T_Zadan, 8 ' 8 Выводит на ЖК знак градуса Else Print At 1, 1, "tf-", Dec1 T_FAKT, 8 ' 8 Выводит на ЖК знак градуса Print At 2, 1, "tv-", Dec1 T_IND2, 8 ' 8 Выводит на ЖК знак градуса EndIf Case 1 Print At 1, 1, " Ventil" If Vent_reg = 0 Then Print At 2, 1, "Medleno" Else Print At 2, 1, " bistro" EndIf Case 2 Print At 1, 1, "Timer ot" If Reg_otkl = 0 Then Print At 2, 1, " Vikl" Else Print At 2, 1, " Vkl" EndIf Case 3 Print At 1, 1, "yst.vrem" Print At 2, 1, "tpab", Dec1 Time_rab_H, "h", Dec2 Time_rab_M Case 4 Print At 1, 1, "yst.vrem" Print At 2, 1, "totd", Dec1 Time_otd_H, "h", Dec2 Time_otd_M Case 5 Print At 1, 1, "yst.vrem" Print At 2, 1, "totk", Dec1 Time_otk_H, "h", Dec2 Time_otk_M EndSelect ' Обработка времени и технология If Sec = 60 Then Sec = 0 Minut = Minut + 1 If Kompres = 1 Then Time_rab_M = Time_rab_M + 1 Time_otd_M = Time_otd_M + 1 Time_otk_M = Time_otk_M + 1 End If End If If Minut = 60 Then Minut = 0 Hour = Hour + 1 Time_rab_H = Time_rab_H + 1 Time_otd_H = Time_otd_H + 1 Time_otk_H = Time_otk_H + 1 End If If Hour = 24 Then Hour = 0 If T_Zadan < T_FAKT Then Kompres = 1 Else Kompres = 0 EndIf If Vent_reg = 1 Then Ven_bis = 1 Ven_med = 0 Else Ven_bis = 0 Ven_med = 1 EndIf 'If reg_otkl = 1 Then 'F_t_otkl = 1 'Else 'F_t_otkl = 0 'EndIf GoTo main Obrobotka_key: Select Case key Case 1 Uroven_menu = Uroven_menu + 1 If Uroven_menu > 5 Then Uroven_menu = 0 Case 2 ' Вниз If Uroven_menu = 0 Then T_Zadan = T_Zadan - 0.1 If T_Zadan < 20 Then T_Zadan = 30 '1 If Uroven_menu = 1 Then Vent_reg = 1 '2 If Uroven_menu = 2 Then Reg_otkl = 1 ' 3 If Uroven_menu = 3 Then Time_rab_M = Time_rab_M - 1 If Time_rab_M = 0 Then Time_rab_M = 59: Time_rab_H = Time_rab_H - 1 ' 4 If Uroven_menu = 4 Then Time_otd_M = Time_otd_M - 1 If Time_otd_M = 0 Then Time_otd_M = 59: Time_otd_H = Time_otd_H - 1 ' 5 If Uroven_menu = 5 Then Time_otk_M = Time_otk_M - 1 If Time_otk_M = 0 Then Time_otk_M = 59: Time_otk_H = Time_otk_H - 1 Case 3 ' Вверх If Uroven_menu = 0 Then T_Zadan = T_Zadan + 0.1 If T_Zadan > 30 Then T_Zadan = 20 '1 If Uroven_menu = 1 Then Vent_reg = 0 '2 If Uroven_menu = 2 Then Reg_otkl = 0 ' 3 If Uroven_menu = 3 Then Time_rab_M = Time_rab_M + 1 If Time_rab_M > 59 Then Time_rab_M = 0: Time_rab_H = Time_rab_H + 1 ' 4 If Uroven_menu = 4 Then Time_otd_M = Time_otd_M + 1 If Time_otd_M > 59 Then Time_otd_M = 0: Time_otd_H = Time_otd_H + 1 ' 5 If Uroven_menu = 5 Then Time_otk_M = Time_otk_M + 1 If Time_otk_M > 59 Then Time_otk_M = 0: Time_otk_H = Time_otk_H + 1 EndSelect smen_reg = 0 F_s_r = 0 GoTo main1 Press1: key = 1 GoTo Obrobotka_key ' Перейти к началу главной программы Press2: key = 2 GoTo Obrobotka_key Press3: key = 3 GoTo Obrobotka_key ' -----------------------Подпрограмма измерений температуры и конвертации данных в oC----------------------- TERMO_izmer: ' Метка начала подпрограммы измерения температуры ' Первый датчик (фактическая) OWrite DS1, 1, [$CC,$BE] ' Послать команду чтения из ОЗУ датчика DS18S20 значения температуры ORead DS1, 2, [R_Temp.LowByte, R_Temp.HighByte] ' Прочитать значение температуры и записать полученные два байта данных в переменную R_Temp типа Word, младщий байт в R_Temp.LowByte и старший байт в R_Temp.HighByte T_FAKT = R_Temp ' Вычисление температуры T_FAKT = T_FAKT / 16 If R_Temp > 64654 Then T_FAKT = T_FAKT - 4096.04 ' Если температура отрицательная OWrite DS1, 1, [$CC,$44] ' Послать датчику DS18S20 команду старта измерения температуры 'Второй датчик (на подаче возду OWrite DS2, 1, [$CC,$BE] ' Послать команду чтения из ОЗУ датчика DS18S20 значения температуры ORead DS2, 2, [R_Temp.LowByte, R_Temp.HighByte] ' Прочитать значение температуры и записать полученные два байта данных в переменную R_Temp типа Word, младщий байт в R_Temp.LowByte и старший байт в R_Temp.HighByte T_IND2 = R_Temp ' Вычисление температуры T_IND2 = T_IND2 / 16 If R_Temp > 64654 Then T_IND2 = T_IND2 - 4096.04 ' Если температура отрицательная OWrite DS2, 1, [$CC,$44] ' Послать датчику DS18S20 команду старта измерения температуры f_izm_t = 0 F_s_r = F_s_r + 1 If F_s_r = 10 Then smen_reg = 1 If F_s_r = 20 Then F_s_r = 0 : smen_reg = 0 Return ' Возврат из подпрограммы Перейти к началу главной программы Disable Prerivanie: ' Обработка прерывания If INTCON.2=1 Then Ms = Ms + 1 If Ms >= 330 Then Ms = 0 Sec = Sec +1 f_izm_t = 1 End If End If TMR0=131 INTCON.2=0 Context Restore