исходник на протоне.
Declare SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные
Declare FSR_CONTEXT_SAVE = OFF ' Не заботиться о сохранении содержимого регистра FSR
Declare Reminders = OFF ' Выключить напоминания компилятора
Declare Warnings = OFF ' Выключить предупреждения компилятора
'Declare OPTIMISER_LEVEL 4 ' Включить оптимизацию программы
'Declare BOOTLOADER = OFF ' Выключить загрузчик
;-------------------------- Общие настройки------------------------------------
Device = 16F877 ' Используемый микроконтроллер
Xtal = 4 ' Частота осциллятора 4 МГц
'-------------------------- Конфигурация программирования --------------------
;Config CP_OFF, DEBUG_OFF, CPD_OFF, LVP_OFF, BODEN_OFF, PWRTE_OFF, WDT_OFF, XT_OSC
'-------------------------- Настройки портов ---------------------------------
Declare PortB_Pullups = OFF ' Включить подтягивающие резисторы на PORTB
Declare All_Digital = OFF ' Установить все порты цифровыми входами/выходами
'---Настройки подключения ЖКИ---
Declare LCD_Type ALPHA
Declare LCD_DTPin PORTB.4
Declare LCD_ENPin PORTB.3
Declare LCD_RSPin PORTB.2
Declare LCD_Interface 4
Declare LCD_CommandUs 2000
Declare LCD_DataUs 50
Declare LCD_Lines 2
;--Настройки АЦП--
Declare Adin_Res 10 ;Разрядность результата преобразования АЦП
Declare Adin_Tad FRC ;Источник тактирования АЦП
Declare Adin_Stime 100
'--Определение назначения каналов портов--
TRISA = %11111111 ' Сделать канал PORTA входом
TRISE = %00000111 ' Сделать канал porte входом для кнопок
TRISC = %00000000 ' Сделать каналы PORTС вЫходами
TRISD = %00000000 ' Сделать каналы PORTD вЫходами
TRISB = %00000010 ' Сделать каналы PORTВ вЫходами для LCD а PORTB.1-Входом для термодатчика
Dim tim2 As Word
Dim tim3 As Word
Dim tim4 As Word
Dim tim5 As Word
Dim tim6 As Word
Dim tim7 As Word
Dim tim8 As Word
Dim value As Word
Dim tim9 As Word
Dim tim10 As Word
Dim tim11 As Word
Dim tim12 As Word
Dim tim13 As Word
Dim tim14 As Word
Dim tim15 As Word
Dim r2 As Word
Dim r3 As Word
Dim r4 As Word
Dim r5 As Word
Dim r6 As Word
Dim r7 As Word
Dim r8 As Word
Dim r9 As Word
Dim r10 As Word
Dim r11 As Word
Dim r12 As Word
Dim r13 As Word
Dim r14 As Word
Dim skordvig As Word
'==========================================================
'========== ОПИСАНИЕ ПЕРЕМЕННЫХ ДЛЯ ТЕМПЕРАТУРЫ===============================
Dim temperature As Byte ' Температура на улице
Dim count_remain As Byte ' Остаток счета
Dim count_per_c As Byte ' Счет C
Dim TempC As Byte
Dim TemperC As Byte
Dim Temp_read As Word
Dim Sign As Word
Dim command As Word
DQ VAR PORTB.1 ' Подключение DS 1820
'=================Просто перемеррые============================================
'Dim value As Word
'D var Word
Dim B As Byte
Dim c As Byte
Dim A As Byte
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim ACP As Byte
Dim T1 As Byte
Dim dtk As Byte
Dim dtk1 As Byte
Dim e As Byte
Dim g As Byte
Dim l As Byte
Dim m As Byte
Dim prd As Byte
Dim flag1 As Byte
Dim time1 As Word
Dim time2 As Word
Dim temperatur1 As Word
Dim temperatur2 As Word
Dim rez As Word
Dim rez1 As Word
Dim rez2 As Word
Dim ttt As Word
Dim tm As Word
PORTC=0
PORTD=0
PORTB=0
skordvig=0'определение скорости двигателя
tim3=0
tim5=0
tim7=0
tim6=0
r2=0
rez=0
rez1=0
rez2=0
tm=40
;-----------------------------------------------------------
;GoSub termul
;GoSub termul
lcdout $fe,1
Print At 1 ,1,$A8,$70,$6F,$B2,$61,$20,$B8,$BD,$E3,$B8,$BA,$61,$BF,$6F,$70,$61
Print At 2 ,1,$31,$32,$33,$34,$35,$36,$37,$38,$39,$30
DelayMS 10000
;GoSub writeeeprom
GoSub readeeprom
If rez>5 Then rez=0
If rez1>4 Then rez1=0
If rez2>6 Then rez2=0
If tm>90 Then tm=0
r2=rez1
tim2=rez
lcdout $fe,1
Print At 1 ,1,Dec rez,"-",Dec rez1,"-",Dec rez2
Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00 'записать символ градуса и показывать его когда вызываем цифру 8
DelayMS 5000
If rez=1 Then GoSub rezim1
If rez=2 Then GoSub rezim2
If rez=3 Then GoSub rezim3
If rez=4 Then GoSub rezim4
If rez=5 Then GoSub rezim5
If rez2=1 Then GoTo zalivvodi
If rez2=2 Then GoTo baraban1
If rez2=3 Then GoTo ctirka1
If rez2=4 Then GoTo slivvodi
If rez2=5 Then GoTo poloskanie
If rez2=6 Then GoTo otzim
'*******************************************************************************
' Основной цикл программы
'********************************************************************************
loop:
DelayMS 500
If PORTA.2=1 Then GoTo dverka
DelayMS 1000
GoTo rezimlcd
GoTo loop
'=================================================================================
primdvig:
GoSub stopdvig
PORTC.3=0'включить прямой ход двигателя
DelayMS 2000
PORTC.2=1'включить питание на двигатель
DelayMS 2000
PORTD=skordvig'управление скоростью вращения (10)
Return
reversdvig:
GoSub stopdvig
PORTC.3=1'включить реверс ход двигателя
DelayMS 2000
PORTC.2=1'включить питание на двигатель
DelayMS 2000
PORTD=skordvig'управление скоростью вращения
Return
stopdvig:
DelayMS 2000
PORTD=0 'управление скоростью=0
DelayMS 5000
PORTC.2=0'отключить питание двигателя
DelayMS 2000
PORTC.3=0'включить прямой ход двигателя
Return
klapanvodivkl:
PORTC.0=1 'включить клапан залива воды 1
Return
klapanvodiotkl:
PORTC.0=0 'выключить клапан залива воды 1
Return
klapanvodivkl2:
PORTC.1=1 'включить клапан залива воды 2
Return
klapanvodiotkl2:
PORTC.1=0 'выключить клапан залива воды 2
Return
dverka:
If PORTA.2=0 Then GoTo loop
GoSub dvlcd
DelayMS 500
GoTo dverka
dvlcd:
Print At 1 ,1,$E0,$42,$45,$50,$62,$20,$48,$45,$20,$A4,$41,$4B,$50,$AE,$54,$41
Print At 2 ,1,$A4,$41,$4B,$50,$4F,$A6,$54,$45,$20,$E0,$42,$45,$50,$4B,$A9
DelayMS 500
Return
rezimlcd:
lcdout $fe,1
Print At 1 ,1,$B3,$C3,$B2,$65,$70,$B8,$20,$70,$65,$B6,$B8,$BC
DelayMS 2000
tim2=1
GoTo viborrezim
;-------------------------------------------
writeeeprom:
EWrite 1,[rez,rez1,rez2,tm]
Return
readeeprom:
rez= ERead 1
rez1=ERead 3
rez2=ERead 5
tm=ERead 7
Return
;----------------------------------------------
Добавлено (05.10.2010, 04.35.23)
---------------------------------------------
viborrezim:;установка режима
If PORTE.2=0 Then usttemper
If PORTE.0=0 Then tim2=tim2+1
If tim2>5 Then tim2=1
If PORTE.1=0 Then tim2=tim2-1
If tim2<1 Then tim2=5
lcdout $fe,1
Print At 1 ,1,$50,$45,$A3,$A5,$4D,"-",Dec tim2
DelayMS 500
GoTo viborrezim
usttemper: ;установка температуры
If PORTE.0=0 Then tm=tm+10
If tm>90 Then tm=10
If PORTE.1=0 Then tm=tm-10
If tm<1 Then tm=90
lcdout $fe,1
Print At 1 ,1,$A9,$63,$BF,$61,$BD,$6F,$B3,$BA,$61
Print At 2 ,1,$BF,$65,$BC,$BE,$65,$70,$61,$BF,$79,$70,$C3," +",Dec tm
DelayMS 500
If PORTE.2=0 Then vipolrezim
GoTo usttemper
vipolrezim:
If tim2=1 Then GoTo rezim1
If tim2=2 Then GoTo rezim2
If tim2=3 Then GoTo rezim3
If tim2=4 Then GoTo rezim4
If tim2=5 Then GoTo rezim5
'If tim2=6 Then GoTo rezim6
'If tim2=7 Then GoTo rezim7
'If tim2=8 Then GoTo rezim8
'If tim2=9 Then GoTo rezim9
'If tim2=10 Then GoTo rezim10
GoTo vipolrezim
'==========================================================================================
'1-режим -сильно грязное белое белье ,предварительная стирка при 45 градусов,стирка при 90-165минут
'2-режим ------------------------------------------------------------------- стирка при 90-145минут
'3-режим ,стирка 60 градусов 130минут
'4-режим стирка 40 градусов 90 минут
'5-режим 60 100 минут
'6-режим 30 60
'7 -режим 30 30
'===================================================================================================
rezim1:
GoSub termul
GoSub termul
PORTC.6=1'заблокировать дверь
time1=60'время стирки в секундах
time2=30 'количество раз сделать процедуру
skordvig=45'скорость двигателя
PORTC.4=1'включить светодиод режима
If rez=0 Then GoTo zalivvodi
Return
'---------------------------------------------------------------------------------------------
rezim2:
GoSub termul
GoSub termul
PORTC.6=1'заблокировать дверь
time1=40'время стирки в секундах
time2=20 'количество раз сделать процедуру
skordvig=30
PORTC.4=1'включить светодиод режима
If rez=0 Then GoTo zalivvodi
Return
rezim3:
GoSub termul
GoSub termul
PORTC.6=1'заблокировать дверь
time1=20'время стирки в секундах
time2=20 'количество раз сделать процедуру
skordvig=25
PORTC.4=1'включить светодиод режима
If rez=0 Then GoTo zalivvodi
Return
rezim4:
GoSub termul
GoSub termul
PORTC.6=1'заблокировать дверь
time1=15'время стирки в секундах
time2=20 'количество раз сделать процедуру
skordvig=15
PORTC.4=1'включить светодиод режима
If rez=0 Then GoTo zalivvodi
Return
rezim5:
GoSub termul
DelayMS 1000
GoSub termul
PORTC.6=1'заблокировать дверь
time1=10'время стирки в секундах
time2=20 'количество раз сделать процедуру
skordvig=10
PORTC.4=1'включить светодиод режима
If rez=0 Then GoTo zalivvodi
Return
rezim6:
rezim7:
rezim8:
rezim9:
rezim10:
'====================================================================== ====================
zalivvodi:'процедура залива воды
rez=tim2
rez1=r2
rez2=1
GoSub writeeeprom
DelayMS 1000
If r2=0 Then GoSub klapanvodivkl
If r2=1 Then GoSub klapanvodivkl2
If r2=2 Then GoSub klapanvodivkl
lcdout $fe,1
If PORTA.0=1 Then Print At 1 ,1,$A4,$61,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3," ",Dec tim3
If PORTA.0=1 Then tim3=tim3+1
If tim3>59 Then GoTo netzalivvodi'если по истечении 3-минут нет уровня воды уходим на процедуру тамер времини ожидания для повтора
If PORTA.0=0 Then
If r2=0 Then GoSub klapanvodiotkl
If r2=1 Then GoSub klapanvodiotkl2
If r2=2 Then GoSub klapanvodiotkl
GoTo baraban1
EndIf
GoTo zalivvodi
netzalivvodi: 'процедура ждем время 5-минут и отправляемся на новую попытку залить воды
DelayMS 1000
tim4=tim4+1
If r2=0 Then GoSub klapanvodiotkl
If r2=1 Then GoSub klapanvodiotkl2
If r2=2 Then GoSub klapanvodiotkl
GoSub oshibka_uroven_vodi
Print At 2 ,1,$A3,$E0,$45,$4D,$20,$42,$4F,$E0,$A9,$20," ",Dec tim4
If tim4=300 Then
tim3=0
tim4=0
GoTo zalivvodi
EndIf
GoTo netzalivvodi
Добавлено (05.10.2010, 04.37.27)
---------------------------------------------
baraban1:'процедура предварительная стирка,полоскание с доливом воды
rez=tim2
rez1=r2
rez2=2
GoSub writeeeprom
DelayMS 1000
tim5=tim5+1
r3=r3+1
lcdout $fe,1
If r2=0 Then
Print At 1 ,1,$A8,$70,$65,$E3,$B3,$61,$70,$B8,$BF,$65,$BB,$C4,$BD,$61,$C7
Print At 2 ,1,$63,$BF,$B8,$70,$BA,$61,"-1=",Dec r3," ",Sign,Dec temperature 'Придварительная стирка 1
EndIf
If r2=1 Then
Print At 1 ,1,$A8,$70,$65,$E3,$B3,$61,$70,$B8,$BF,$65,$BB,$C4,$BD,$61,$C7
Print At 2 ,1,$63,$BF,$B8,$70,$BA,$61,"-2=",Dec r3," ",Sign,Dec temperature 'Прндварительная стирка 2
EndIf
If r2=2 Then
Print At 1 ,1,$A8,$70,$65,$E3,$B3,$61,$70,$B8,$BF,$65,$BB,$C4,$BD,$6F,$65
Print At 2 ,1,$BE,$6F,$BB,$6F,$63,$BA,$61,$BD,$B8,$65,"-1=",Dec r3 'Предварительное полоскание 1
EndIf
If r2=3 Then
Print At 1 ,1,$A8,$70,$65,$E3,$B3,$61,$70,$B8,$BF,$65,$BB,$C4,$BD,$6F,$65
Print At 2 ,1,$BE,$6F,$BB,$6F,$63,$BA,$61,$BD,$B8,$65,"-2=",Dec r3 'Предварительное полоскание 2
EndIf
If tim5=1 Then GoSub primdvig
If tim5=time1 Then GoSub reversdvig
If PORTA.0=1 Then PORTC.0=1'если датчик уровня воды не включен включить клапан заливы воды клапан воды
If PORTA.0=0 Then PORTC.0=0 'если датчик уровня воды включен значит уровень воды в норме отключить клапан залива воды
If r2=0 Or r2=1 And tim5=1 And PORTA.0=0 Then PORTC.7=1'включение тены
GoSub termul
If temperature>(tm /2) And Sign="+" Then PORTC.7=0 'отключение тены по температуре
If r2=2 Or r2=3 Then PORTC.7=0
If tim5=(time1*2) Then
tim6=tim6+1
If tim6=time2 Then 'tim6 время предварительной стирки,полоскания
tim6=0
tim5=0
r3=0
GoSub stopdvig 'остановка двигателя
If PORTA.0=1 Then
GoSub oshibka_uroven_vodi
GoSub zalivvodi
EndIf
If r2=0 Then GoTo ctirka1
If r2=1 Then GoTo ctirka1
If r2=2 Then GoTo poloskanie
If r2=3 Then GoTo poloskanie
EndIf
tim5=0
EndIf
GoTo baraban1
ctirka1: 'основная стирка 1
rez=tim2
rez1=r2
rez2=3
GoSub writeeeprom
DelayMS 1000
tim8=tim8+1
lcdout $fe,1
If r2=0 Then Print At 1 ,1,$63,$BF,$B8,$70,$BA,$61,"-1=",Dec r4," ",Sign,Dec temperature
If r2=1 Then Print At 1 ,1,$63,$BF,$B8,$70,$BA,$61,"-2=",Dec r4," ",Sign,Dec temperature
If tim8=1 Then GoSub primdvig
If tim8=time1 Then GoSub reversdvig
If r2=0 Or r2=1 And tim5=1 And PORTA.0=0 Then PORTC.7=1'включение тены
GoSub termul
If temperature>tm And Sign="+" Then PORTC.7=0 'отключение тены по температуре
If r2=2 Or r2=3 Then PORTC.7=0
r4=r4+1
If tim8=(time1*2) Then
tim9=tim9+1
If tim9=time2 Then 'если вышло время закончить стирку и уйти на слив воды
tim9=0
tim8=0
r4=0
GoSub stopdvig 'остановка двигателя
GoTo slivvodi 'слив воды
EndIf
tim8=0
EndIf
GoTo ctirka1
slivvodi: ' процедура слива воды
rez=tim2
rez1=r2
rez2=4
GoSub writeeeprom
PORTC.7=0
DelayMS 1000
tim10=tim10+1
lcdout $fe,1
If r2=0 Then
Print At 1 ,1,$63,$BF,$B8,$70,$BA,$61,"-1"
Print At 2 ,1,$43,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3,"=",Dec tim10 'Стирка 1
EndIf
If r2=1 Then
Print At 1 ,1,$63,$BF,$B8,$70,$BA,$61,"-2"
Print At 2 ,1,$43,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3,"=",Dec tim10 'Стирка 2
EndIf
If r2=2 Then
Print At 1 ,1,$A8,$6F,$BB,$6F,$63,$BA,$61,$BD,$B8,$65,"-1"
Print At 2 ,1,$63,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3,"=",Dec tim10 'Полоскание 1
EndIf
If r2=3 Then
Print At 1 ,1,$A8,$6F,$BB,$6F,$63,$BA,$61,$BD,$B8,$65,"-2"
Print At 2 ,1,$63,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3,"=",Dec tim10 'Полоскание 2
EndIf
If tim10=1 Then
GoSub primdvig
PORTC.5=1'включить насос
DelayMS 1000
EndIf
'---------------увелечение скорости барабана------------------
If tim10=10 Then PORTD=15
If tim10=20 Then PORTD=30
If tim10=30 Then PORTD=50
If tim10=40 Then PORTD=100
'-------------------уменьшение скорости барабана----------------
If tim10=60 Then PORTD=50
If tim10=70 Then PORTD=30
If tim10=80 Then PORTD=15
If tim10=90 Then PORTD=10
'---------------------------------------------------------------
If tim10=120 Then
GoSub stopdvig
r2=r2+1
tim10=0
PORTC.5=0'выключить насос
If r2=1 Then GoTo zalivvodi
If r2=2 Then GoTo zalivvodi
If r2=3 Then GoTo zalivvodi
If r2=4 Then GoTo otzim
EndIf
GoTo slivvodi
Добавлено (05.10.2010, 04.39.02)
---------------------------------------------
slivvodi: ' процедура слива воды
rez=tim2
rez1=r2
rez2=4
GoSub writeeeprom
PORTC.7=0
DelayMS 1000
tim10=tim10+1
lcdout $fe,1
If r2=0 Then
Print At 1 ,1,$63,$BF,$B8,$70,$BA,$61,"-1"
Print At 2 ,1,$43,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3,"=",Dec tim10 'Стирка 1
EndIf
If r2=1 Then
Print At 1 ,1,$63,$BF,$B8,$70,$BA,$61,"-2"
Print At 2 ,1,$43,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3,"=",Dec tim10 'Стирка 2
EndIf
If r2=2 Then
Print At 1 ,1,$A8,$6F,$BB,$6F,$63,$BA,$61,$BD,$B8,$65,"-1"
Print At 2 ,1,$63,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3,"=",Dec tim10 'Полоскание 1
EndIf
If r2=3 Then
Print At 1 ,1,$A8,$6F,$BB,$6F,$63,$BA,$61,$BD,$B8,$65,"-2"
Print At 2 ,1,$63,$BB,$B8,$B3,$20,$B3,$6F,$E3,$C3,"=",Dec tim10 'Полоскание 2
EndIf
If tim10=1 Then
GoSub primdvig
PORTC.5=1'включить насос
DelayMS 1000
EndIf
'---------------увелечение скорости барабана------------------
If tim10=10 Then PORTD=15
If tim10=20 Then PORTD=30
If tim10=30 Then PORTD=50
If tim10=40 Then PORTD=100
'-------------------уменьшение скорости барабана----------------
If tim10=60 Then PORTD=50
If tim10=70 Then PORTD=30
If tim10=80 Then PORTD=15
If tim10=90 Then PORTD=10
'---------------------------------------------------------------
If tim10=120 Then
GoSub stopdvig
r2=r2+1
tim10=0
PORTC.5=0'выключить насос
If r2=1 Then GoTo zalivvodi
If r2=2 Then GoTo zalivvodi
If r2=3 Then GoTo zalivvodi
If r2=4 Then GoTo otzim
EndIf
GoTo slivvodi
poloskanie:'процедура полоскания
rez=tim2
rez1=r2
rez2=5
GoSub writeeeprom
lcdout $fe,1
If r2=2 Then Print At 1 ,1,$A8,$6F,$BB,$6F,$63,$BA,$61,$BD,$B8,$65,"-1=",Dec r5 'Полоскание 1
If r2=3 Then Print At 1 ,1,$A8,$6F,$BB,$6F,$63,$BA,$61,$BD,$B8,$65,"-2=",Dec r5 'Полоскание 2
DelayMS 1000
tim11=tim11+1
r5=r5+1
skordvig=25;скорость двигателя
If tim11=1 Then GoSub primdvig
If tim11=time1 Then GoSub reversdvig
If tim11=(time1*2) Then
tim12=tim12+1
GoSub stopdvig
If tim12=time2 Then
r5=0
tim11=0
tim12=0
GoTo slivvodi'если вышло время 5-минут уйти на слив воды
EndIf
tim11=0
EndIf
GoTo poloskanie
otzim: ;процедура отжима
rez=tim2
rez1=r2
rez2=6
GoSub writeeeprom
DelayMS 1000
lcdout $fe,1
Print At 1 ,1,$4F,$BF,$B6,$B8,$BC," ",Dec r6
tim13=tim13+1
r6=r6+1
If tim13=1 Then
skordvig=0;скорость двигателя
GoSub primdvig
PORTC.5=1'включить насос
EndIf
If tim13=1 Then PORTD=10
If tim13=5 Then PORTD=15
If tim13=10 Then PORTD=25
If tim13=15 Then PORTD=35
If tim13=20 Then PORTD=45
If tim13=30 Then PORTD=50
If tim13=60 Then PORTD=100
If PORTA.3=1 Then
If tim13=90 Then PORTD=120
If tim13=120 Then PORTD=160
If tim13=140 Then PORTD=180
If tim13=160 Then PORTD=200
EndIf
If PORTA.3=1 Then
If tim13=240 Then PORTD=180
If tim13=260 Then PORTD=160
If tim13=280 Then PORTD=140
If tim13=300 Then PORTD=120
If tim13=320 Then PORTD=100
If tim13=340 Then PORTD=50
If tim13=360 Then PORTD=25
If tim13=380 Then PORTD=10
Else
If tim13=80 Then PORTD=80
If tim13=100 Then PORTD=60
If tim13=120 Then PORTD=40
If tim13=140 Then PORTD=30
If tim13=160 Then PORTD=20
If tim13=180 Then PORTD=10
EndIf
If PORTA.3=1 Then
ttt=440
Else
ttt=210
EndIf
If tim13=ttt Then
tim13=5
tim14=tim14+1
If tim14=tim2 Then
tim14=0
tim13=0
GoSub stopdvig
PORTC=0
rez=0
rez1=0
rez2=0
GoSub writeeeprom
GoTo konecrezima
EndIf
EndIf
GoTo otzim
konecrezima:
Clear
PORTC.4=0
lcdout $fe,1
Print At 1 ,1,$43,$BF,$B8,$70,$BA,$61,$20,$B7,$61,$BA,$6F,$BD,$C0,$65,$BD,$61
Print At 2 ,1,$BE,$6F,$BB,$BD,$6F,$63,$BF,$C4,$C6
DelayMS 500
PORTC.4=1
DelayMS 500
GoTo konecrezima
'======================Вывод на дисплей данных ошибок=======================================
oshibka_uroven_vodi:
Print At 1 ,1,$4F,$AC,$A5,$A0,$4B,$41,$20,$48,$45,$54,$20,$42,$4F,$E0,$AE
Return
'============================================================================================
'====================Вывод температуры на LCD=======================================
temperatura:
'lcdout $FE,$40,$0C,$12,$12,$0C,$00,$00,$00,$00 ' записать в ОЗУ LCD символ с кодом 0 - градус
lcdout $fe,1
lcdout 1,$48,$41,$20,$A9,$A7,$A5,$E1,$45,$3A,$20,Sign, Dec temperature
'lcdout $fe,$C0
'lcdout 1,$E0,$42,$A5,$A1,$41,$54,$45,$A7,$62,$3A,Sign1, Dec temperature1
Return
'*********************************************************************************
' * измерение температуры на улице *
'*********************************************************************************
termul:
GoSub init1820 ' Init the DS1820
command = $cc ' Issue Skip ROM command
GoSub write1820
command = $44 ' Start temperature conversion
GoSub write1820
DelayUS 10 ' Wait 2 seconds for conversion to complete
GoSub init1820 ' Do another init
command = $cc ' Issue Skip ROM command
GoSub write1820
command = $be ' Read the temperature
GoSub write1820
DelayMS 10
GoSub read1820
GoSub Temp_calc ' Йдемо рахувати температуру
Return
Temp_calc: 'Процедура перетворення температури
'******************************************************************************************************
If Temp_read.11 = 1 Then 'Температура мінусова
Sign = "-"
Temp_read = ~Temp_read + 1
Else
Sign = "+"
EndIf
temperature = (Temp_read & $0FF0) >> 4
Return
'=======================================================================
' Обробка Температури
'=======================================================================
' Initialize DS1820 and check for presence
init1820:
Low dq ' Set the data pin low to init
DelayUS 500 ' Wait > 480us
Input dq ' Release data pin (set to input for high)
DelayUS 100 ' Wait > 60us
If dq = 1 Then
DelayMS 500
Return ' Try again
EndIf
DelayUS 400 ' Wait for end of presence pulse
Return
' Write "command" byte to the DS1820
write1820:
For I = 1 To 8 ' 8 bits to a byte
If command.0 = 0 Then
GoSub write0 ' Write a 0 bit
Else
GoSub write1 ' Write a 1 bit
EndIf
command = command >> 1 ' Shift to next bit
Next I
Return
' Write a 0 bit to the DS1820
write0:
Low dq
DelayUS 60 ' Low for > 60us for 0
Input dq ' Release data pin (set to input for high)
Return
' Write a 1 bit to the DS1820
write1:
Low dq ' Low for < 15us for 1
@ nop ' Delay 1us at 4MHz
Input dq ' Release data pin (set to input for high)
DelayUS 60 ' Use up rest of time slot
Return
' Read temperature from the DS1820
read1820:
For I = 1 To 16 ' 16 bits to a word
Temp_read = Temp_read >> 1 ' Shift down bits
GoSub readbit ' Get the bit to the top of temp
Next I
Return
' Read a bit from the DS1820
readbit:
Temp_read.15 = 1 ' Preset read bit to 1
Low dq ' Start the time slot
@ nop ' Delay 1us at 4MHz
Input dq ' Release data pin (set to input for high)
If dq = 0 Then
Temp_read.15 = 0 ' Set bit to 0
EndIf
DelayUS 60 ' Wait out rest of time slot
Return
'===================================================================================================
End