'****************************************************************
'* Name : ТЕРМОМЕТР_МАХ7219_ds18b20 *
'* Автор : Лобзанюк К.П. *
'* : *
'* : *
'* Дата : 01.04.2021 *
'* Версия : 1.00 *
'* : *
'* : *
'****************************************************************
Device = 16F630
'Set_OSCCAL 'сохрвняем калибровочную константу (последняя ячейка памяти программ)
Config CPD_OFF, CP_OFF, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF, INTRC_OSC_NOCLKOUT
'-------------------------------- -----Предустановки---------------------------------------------
Declare Xtal 4
' OPTION_REG = %00100110 'бит 5: T0CS: Выбор тактового сигнала для TMR0
'1 = внешний тактовый сигнал с вывода T0CKI
'0 = внутренний тактовый сигнал CLKOUT
' INTCON = %10100000 'TMR0 активизирован
'-------------------------------------Настройки портов----------------------------------------------
All_Digital = OFF ;Установить все порты цифровыми входами/выходами
TRISA = %00101001 ' 1-вход 0-выход
TRISC = %00110000
'-----------------------------------Конфигурация переменных-----------------------------------------
Symbol ZBUK PORTC.3 ' динамик
Symbol KH1 PORTA.3 ' кнопка листать датчики
Symbol KH2 PORTA.5 ' + или -
Symbol KH3 PORTC.5 ' температуры сигнализации + 1
Symbol KH4 PORTC.4 ' температуры сигнализации - 1
Symbol DIN PORTC.0 'Выход данных
Symbol CLK PORTC.2 'Выход синхро импульсов
Symbol LOAD PORTC.1 'Защелка
Symbol A PORTA.1 ' входы мультиплексора
Symbol B PORTA.2
Symbol S PORTA.4
' Symbol TOIF INTCON.2 ' TOIF - cимвол флага прерывания по переполнению таймера TMRO
Symbol DQ = PORTA.0 ' Подключить 1 DS18B20 к выводу PORT
Dim Value As Byte 'Переменная адрес знакоместа
Dim Value1 As Byte 'Переменная для преобразования табличной конвертации
Dim Dat As Byte 'Переменная для выделения из числа цифры разряда
Dim R_Temp As Word ' Переменная для получения значения температуры отдельными двумя байтами
Dim znak As Bit ' знак датчика N
Dim znak1 As Bit ' знак датчика 1
Dim znak2 As Bit ' знак температуры сигнализации
Dim C As Bit 'Переменная для хранения бита сигнализации окончания преобразования
Dim fl_n As Bit ' биты гашения незначащего ноля
Dim fl_n1 As Bit
Dim n As Byte ' номер датчика для опроса
Dim m As Byte ' номер датчика для показа
Dim T_P11 As Byte ' температура сигнализации
Dim T_P1 As Byte ' температура датчика 1
' Dim T_P2 As Byte
' Dim T_P3 As Byte
' Dim T_P4 As Byte
' Dim T_P5 As Byte
' Dim T_P6 As Byte
' Dim T_P7 As Byte
' Dim T_P8 As Byte
Dim T1 As Byte '
Dim T2 As Byte
Dim flagK1 As Bit ' флаг, кнопка нажата и уже отпущена
Dim flagK2 As Bit
Dim flagK3 As Bit
Dim flagK4 As Bit
' '-------------------Инициирование прерываний-------------------
' On Interrupt GoTo EvriSec ' Включить обработку програмных прерываний
' On_Interrupt GoTo EvriSec ' Включить аппаратную обработку прерывания
'-------------------Настройка дисплея-------------------
DelayMS 2000 ' за это время дисплей покажет кракозябру
Value = %00001111
Value1 = %00000000
GoSub DI
Value = %00001100
Value1 = %00000001
GoSub DI
Value = %00001011
Value1 = %00000111
GoSub DI
Value = %00001001 '
Value1 = %00000000
GoSub DI
Value = %00001010
Value1 = %00001111
GoSub DI
'-------------------------- Главная программа -------------------------
m = 1
T1 = 0
znak2 = 0
T_P11 = 2
' DelayMS 2000
Main:
A = 0 : B = 0 : S = 0 : n = 1 ' перебор датчиков
GoSub Opros_T
GoSub Set_T
A = 1 : B = 0 : S = 0 : n = 2
GoSub Opros_T
GoSub Set_T
A = 0 : B = 1 : S = 0 : n = 3
GoSub Opros_T
GoSub Set_T
A = 1 : B = 1 : S = 0 : n = 4
GoSub Opros_T
GoSub Set_T
A = 0 : B = 0 : S = 1 : n = 5
GoSub Opros_T
GoSub Set_T
A = 1 : B = 0 : S = 1 : n = 6
GoSub Opros_T
GoSub Set_T
A = 0 : B = 1 : S = 1 : n = 7
GoSub Opros_T
GoSub Set_T
A = 1 : B = 1 : S = 1 : n = 8
GoSub Opros_T
GoSub Set_T
GoSub ZBUK_
GoTo Main
Set_T: ' выбор
GoSub KH_1 : GoSub KH_2 : GoSub KH_3 : GoSub KH_4 :
If flagK1 = 1 Then flagK1 = 0 : m = m + 1
If m = 9 Then m = 1
If m = n Then GoSub Ind
If flagK2 = 1 Then flagK2 = 0 : znak2 = ~ znak2
If flagK3 = 1 Then flagK3 = 0 : T_P11 = T_P11 + 1
If flagK4 = 1 Then flagK4 = 0 : T_P11 = T_P11 - 1
Return
Opros_T: ' опрос датчика
OWrite DQ, 1, [$CC, $44] ' Послать датчику DS18B20 команду старта измерения температуры
Repeat ' Начать внутренний цикл
DelayMS 25 ' Ждать
ORead DQ, 4, [C] ' Ждать полного преобразования пока не придет сигнал окончания преобразования
Until C > 0 ' Выйти из цикла если DS18B20 закончило преобразование.
OWrite DQ, 1, [$CC, $BE] ' Послать команду чтения из ОЗУ датчика DS18S20 значения температуры
ORead DQ, 2, [R_Temp.LowByte, R_Temp.HighByte] ' Прочитать значение температуры и записать полученные два байта данных в
'переменную R_Temp , младщий байт в R_Temp.LowByte и старший байт в R_Temp.HighByte
'
If R_Temp.HighByte > 248 Then
R_Temp.LowByte = 255 - R_Temp.LowByte : R_Temp.HighByte = 255 - R_Temp.HighByte : znak = 0 : Else znak = 1
End If ' Проверяем на отрицательную температуру.
' Если температура отрицательная – вычитаем из 255
T1 = R_Temp.LowByte / 16 '16 это 10000 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = R_Temp.HighByte * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2 ' Формирмируем результам и выдаем его на индикатор.
If znak = 0 Then ' поправка результата на 1, для корректного вывода отрицательных температур
T1 = T1 + 1
End If
If n = 1 Then T_P1 = T1 : znak1 = znak : End If
' If n = 2 Then T_P2 = T1
' If n = 3 Then T_P3 = T1
' If n = 4 Then T_P4 = T1
' If n = 5 Then T_P5 = T1
' If n = 6 Then T_P6 = T1
' If n = 7 Then T_P7 = T1
' If n = 8 Then T_P8 = T1
Return
'----------------------------ПодпрограммЫ индикации -------------------------------------
Ind:
Value = %00000100 : Value1 = %00000000 ' гасим 1-4 знакоместо
GoSub DI
Value = %00000000 : Value1 = %00000000
GoSub DI
Value = %00000001 : Value1 = %00000000
GoSub DI
Value = %00000010 : Value1 = %00000000
GoSub DI
Value = %00000011 : Value1 = %00000000
GoSub DI
Dat = m
GoSub Convert
Value = %00001000 ' 8 знакоместо
GoSub DI
If znak = 0 Then
Value = %00000111 : Value1 = %00000001 : Else Value = %00000111 : Value1 = %00000000 : ' 7 знакоместо
EndIf
GoSub DI
Dat = Dig T1, 1 'Выделяем из числа десятки
If Dat = 0 Then
fl_n = 1 : Value = %00000101 : Value1 = %00000000 : Else fl_n = 0
EndIf
GoSub DI
GoSub Convert 'и отправляем на табличную конвертацию
Value = %00000110 ' 6 знакоместо
GoSub DI
Dat = Dig T1, 0
GoSub Convert
If fl_n = 1 Then
Value = %00000110 : Else Value = %00000101 ' 5 знакоместо
EndIf
GoSub DI
' 4 знакоместо не используется
If m = 1 Then
GoTo Label5 : Else GoTo Label6 :
EndIf
Label5:
If znak2 = 0 Then
Value = %00000011 : Value1 = %00000001 : Else Value = %00000011 : Value1 = %00000000 : ' 3 знакоместо
EndIf
GoSub DI
Dat = Dig T_P11, 1 'Выделяем из числа десятки
If Dat = 0 Then
fl_n1 = 1 : Else fl_n1 = 0
EndIf
GoSub Convert 'и отправляем на табличную конвертацию
Value = %00000010 ' 2 знакоместо
GoSub DI
Dat = Dig T_P11, 0
GoSub Convert
If fl_n1 = 1 Then
Value = %00000010 : Else Value = %00000001 ' 1 знакоместо
EndIf
GoSub DI
Label6:
Return
DI: ' динамическая индикация
LOAD = 0
SHOut DIN, CLK, MsbFirst, [Value \8,Value1 \8 ]
LOAD = 1
Return
Convert:
Value1 = LookUpL Dat, [126,48,109,121,51,91,95,112,127,123]
' 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Return
' ------------------------прерывание----------------------------------------
' EvriSec:
' Context Save
' Inc Sec ' увеличение Sec
' m = ~ m ' Переключить сегмент в противоположное состояние
' If Sec = 60 Then Sec = 0 :Inc minut
' TOIF = 0 ' сбросить флаг прерываний TOIF регистра TMRO
'Context Restore ' Восстановить регистры и выйти из обработки прерываний
'----------------------------Подпрограмма включения звукового сигнала-------------------------------------
ZBUK_:
If T_P1 = T_P11 And znak1 = znak2 Then Sound ZBUK,[125,20,0,10] : EndIf
Return
'----------------------------Подпрограмма нажатия кн1-------------------------------------
KH_1:
If KH1 = 0 Then DelayMS 50 : flagK1 = 1 : GoTo triger : EndIf ;
GoTo Label1
triger:
If KH1 = 1 And flagK1 = 1 Then DelayMS 50 : GoTo Label1 : EndIf
GoTo triger
Label1:
Return
'----------------------------Подпрограмма нажатия кн2-------------------------------------
KH_2:
If KH2 = 0 Then DelayMS 50 : flagK2 = 1 : GoTo triger2 : EndIf ;
GoTo Label12
triger2:
If KH2 = 1 And flagK2 = 1 Then DelayMS 50 : GoTo Label12 : EndIf
GoTo triger2
Label12:
Return
'----------------------------Подпрограмма нажатия кн3-------------------------------------
KH_3:
If KH3 = 0 Then DelayMS 50 : flagK3 = 1 : GoTo triger3 : EndIf ;
GoTo Label13
triger3:
If KH3 = 1 And flagK3 = 1 Then DelayMS 50 : GoTo Label13 : EndIf
GoTo triger3
Label13:
Return
'----------------------------Подпрограмма нажатия кн4-------------------------------------
KH_4:
If KH4 = 0 Then DelayMS 50 : flagK4 = 1 : GoTo triger4 : EndIf ;
GoTo Label14
triger4:
If KH4 = 1 And flagK4 = 1 Then DelayMS 50 : GoTo Label14 : EndIf
GoTo triger4
Label14:
Return
' далее широкое поле для улучшения
|