Device = 16F676 Config CP_OFF, CPD_OFF, BODEN_OFF, PWRTE_ON, WDT_OFF, INTRC_OSC_NOCLKOUT Declare All_Digital = 1 Declare Xtal=4 Declare Optimiser_Level 1 Declare Adin_Res 10 Declare Adin_Stime 100 ADCON0 = %10010000 ' 76543210 ADCON1 = %00110000 ' 76543210 ANSEL = %00010000 ' 76543210 'Отображение-------------------------------------------------------------------------- Symbol SHCP = PORTC.1 Symbol DS = PORTC.2 Symbol STCP = PORTC.3 'Переменные--------------------------------------------------------------------------- Dim TermoErorr As Word 'Переменная для хранения температуры счетчика ошибки термопары Dim TermoS As Word 'Переменная для хранения установоной температуры Dim TermoIn As Word 'Переменная для хранения полученной температуры Dim TermoDS As Word 'Переменная для хранения отображаемой температуры Dim TermoD As Word 'Переменная для хранения температуры поправки Dim i As Word 'Переменная для хранения температуры поправки Dim LineM As Word 'Переменная для хранения уровня оборотов двигателя или инэрции Dim nB As Word 'Переменная для хранения для задержки мерцания Dim nBp As Word 'Переменная для хранения переменнной накопления для паерехода с 1 на 10 Dim nBm As Word 'Переменная для хранения переменнной накопления для паерехода с 1 на 10 Dim n As Byte 'Число для вывода на индикатор ССИ Dim Value As Byte 'Переменная для осуществления табличного конвертирования цифры '-------------------------------Настройка портов-------------------------------------- TRISA = %101111 'RA0, RA1, RA2, RA5 - входы; RA4 - выходы; RA3 - 10к на +5В PORTA = %000000 'Все порты в 0 TRISC = %100001 'RC0, - входы; RC1, RC2, RC3, RC4, RC5 - выходы; PORTC = %000000 'Все порты в 0 '-----------------------------------Главная программа--------------------------------- TermoErorr = 0 TermoIn = 0 TermoS = ERead 0 LineM = ERead 2 nB = 0 nBp = 0 nBm = 0 DelayMS 1000 Start: 'ЧЕЛНОК TermoIn = ADIn 4 TermoIn = TermoIn / 2 GoSub Coret If TermoIn < 70 Then TermoErorr = TermoErorr + 1 '-------------------------------Выбор вывода индикация------------------------------- If nB > 0 Then nB = nB - 1 If nB = 0 Then TermoDS = TermoIn nBm = 0 nBp = 0 Else TermoDS = TermoS DelayMS 100 EndIf '-------------------------Запись в память значений и констант------------------------ If nB = 1 Then EWrite 0,[TermoS] EWrite 2,[LineM] Else EndIf GoSub Ind: '--------------------------------------Кнопки---------------------------------------- If PORTA.0 = 1 Then DelayMS 200: Inc nBp: nB = 10: GoSub PlusJ If PORTA.1 = 1 Then DelayMS 200: Inc nBm: nB = 10: GoSub MinusJ If PORTA.2 = 1 Then DelayMS 200: Inc LineM: nB = 10 '--------------------------------Защита от максимума--------------------------------- If LineM > 8 Then LineM = 0 If TermoS > 450 Then TermoS = 100 If TermoErorr > 2000 Then TermoErorr = 2000 TermoS = 0 LineM = 8 nB = 10 Else EndIf If PORTA.5 = 1 Then TermoErorr = 0 GoSub Ten: GoTo Start '---------Включения/выключение тена от заданного диапозона учитывая инерцию --------- Ten: If TermoIn < TermoS - LineM * 2 Then PORTC.4 = 1 Else PORTC.4 = 0 EndIf Return 'подпрограмма кнопки добавить PlusJ: If nBp > 10 Then 'при долгом нажатии добавляем десятки TermoS = TermoS + 10 nBp = 10 Else TermoS = TermoS + 1 EndIf Return 'подпрограмма кнопки убавить MinusJ: If nBm > 10 Then 'при долгом нажатии убовляем десятки TermoS = TermoS - 10 nBm = 10 Else TermoS = TermoS - 1 EndIf Return Ind: 'десятые n = Dig TermoDS, 0 GoSub Convert SHOut DS, SHCP, MsbFirst, [$08, Value] PulsOut STCP, 1 DelayMS 1 'сотые n = Dig TermoDS, 1 GoSub Convert SHOut DS, SHCP, MsbFirst, [$04, Value] PulsOut STCP, 1 DelayMS 1 'тысячные n = Dig TermoDS, 2 GoSub Convert SHOut DS, SHCP, MsbFirst, [$02, Value] PulsOut STCP, 1 DelayMS 1 'линейный индикатор n = Dig LineM, 0 GoSub Convert2 SHOut DS, SHCP, MsbFirst, [$10, Value] PulsOut STCP, 1 DelayMS 1 Return 'сегментный индикатор Convert: Value = LookUp n, [$C0, $F9, $A4, $B0, $99, $92, $82, $F8, $80, $90, $BF, $FF ] ' таблица 0 1 2 3 4 5 6 7 8 9 - off Return 'линейный индикатор Convert2: Value = LookUp n, [$FF, $FD, $FC, $DC, $9C, $98, $18, $10, $00] ' таблица 0 1 2 3 4 5 6 7 8 Return '--------------------------------------------------------------------------------------------------- Coret: 'программная коректировка датчика If TermoIn < 300 Then TermoD = 250 For i = 0 To 5 If TermoIn < TermoD Then TermoIn = TermoIn - 1 TermoD = TermoD - 50 Next Else TermoD = 500 For i = 0 To 3 If TermoIn > TermoD Then TermoIn = TermoIn - 1 TermoD = TermoD - 50 Next EndIf Return End