$crystal
=
12000000
$regfile
=
"89c2051.dat"
Config
1wire =
P3.3
Declare
Sub
Temperature
Declare
Sub
Pobr_znaku
Declare
Sub
Ustawianie_temp_zad
Declare
Sub
Regulacja
Dim
T As
Integer
,
Tzad
As
Byte
,
Tzad_2
As
Byte
Dim
Odczyt(2)
As
Byte
Dim
T1
As
Single
Dim
Wysw1
As
Byte
,
Wysw2
As
Byte
,
Nr_wysw
As
Byte
Dim
Flaga
As
Bit
,
Licznik
As
Byte
,
Moc
As
Byte
,
Licznik_milisekund
As
Byte
Dim
Przejscie_przez_0
As
Bit
,
Znacznik_int0
As
Bit
Dim
Wyswietlacz
As
Byte
Config
Timer0
=
Timer
,
Mode
=
1 ,
Gate
=
Internal
Set
Tcon.0
Enable
Interrupts
Enable
Timer0
On
Timer0
T0_int
On
Int0 Detektor
Enable
Int0
Counter0
=
54535
Start
Timer0
Led2
Alias
P3.5
Led1
Alias
P3.7
'Switch1 Alias P3.3
Switch2
Alias
P3.4
Triak
Alias
P3.1
Led1 =
1 :
Led2 =
1 :
Nr_wysw
= 1
:
Triak =
1
P1 =
0 :
Switch2
= 1
:
Przejscie_przez_0
=
1
': Switch1 =
1
Tzad =
38 :
Wyswietlacz
=
1 :
Moc =
1 :
Znacznik_int0
=
1
Do
If
Switch2
= 0
Then
Call
Ustawianie_temp_zad
Call
Temperature
Call
Regulacja
Loop
Sub
Temperature
' actual
measuring
Gosub
Wait_intr
:
1wreset
'reset
Gosub
Wait_intr
:
1wwrite
&HCC
'jedna
kostka, więc wykorzystujemy rozkaz SKIP ROM
Gosub
Wait_intr
:
1wwrite
&H44
'dokonaj konwersji
Waitms
250 :
Waitms
250 :
Waitms
250
Gosub
Wait_intr
:
1wreset
'reset
Gosub
Wait_intr
:
1wwrite
&HCC
'rozkaz adresowy SKIP ROM
Gosub
Wait_intr
:
1wwrite
&HBE
'rozkaz funkcyjny - polecenie odczytu DS18x20
Gosub
Wait_intr
:
Odczyt(1)
=
1wread(2)
'odczytaj dwa pierwsze bajty
Gosub
Wait_intr
:
T =
Odczyt(2)
'przepisz starszy bajt do zmiennej typu Integer
Gosub
Wait_intr
:
Shift
T ,
Left
,
8
'przesuń ten bajt w lewo na wyższe pozycje
Gosub
Wait_intr
:
T =
T +
Odczyt(1)
'przepisz - dodaj młodszy bajt
Gosub
Wait_intr
:
T1 =
T *
0.0625
'wyraź
w stopniach Celsjusza, wynik wpisz do zmiennej (Single)
Gosub
Wait_intr
T =
T1
Wysw1 =
T \
10
'to co ma iść
na wyświetlacz (dziesiątki)
Wysw2 =
T
Mod
10
'jednosci
End
Sub
Sub
Pobr_znaku
'definicja
procedury Pobr_znaku
If
Nr_wysw
= 1
Then
P1 =
Lookup(wysw1
,
Kody7seg
)
'to
wpisanie do portu P1 wartość kodu z tablicy stałych Kody7seg
If
Nr_wysw
= 2
Then
P1 =
Lookup(wysw2
,
Kody7seg
)
'to
wpisanie do portu P1 wartość kodu z tablicy stałych Kody7seg
If
Tzad <=
T
Then
P1.0
=
0
'jeśli już
nagrzane dodaj kropkę
End
If
End
Sub
T0_int:
Stop
Timer0
Counter0
=
54535
Set
Led1 :
Set
Led2
Select
Case
Nr_wysw
Case
1 :
Call
Pobr_znaku
Reset
Led1
Case
2 :
Call
Pobr_znaku
Reset
Led2
End
Select
Incr
Nr_wysw
If
Nr_wysw
= 3
Then
Nr_wysw
= 1
If
Przejscie_przez_0
=
0
Then
'jeśli
zalączone liczenie czasu od int0
Incr
Licznik_milisekund
'licz
milisekundy
If
Licznik_milisekund
=
Moc
Then
Triak
=
0 :
Delay
:
Triak =
1
Licznik_milisekund
=
1
'zalącz
triaka i zresetuj licznik
Przejscie_przez_0
=
1
'wylącz
liczenie czasu od int0
End
If
End
If
If
Znacznik_int0
=
0
Then
Reset
Flaga :
Znacznik_int0
=
1
End
If
Start
Timer0
Return
Wait_intr:
Bitwait
Flaga ,
Reset
Set
Flaga
Return
Detektor:
Disable
Int0
Przejscie_przez_0
=
0 :
Znacznik_int0
=
0
'zacznij
liczyć czas i wylącz triaka
Enable
Int0
Return
Sub
Ustawianie_temp_zad
Triak =
1 :
Wysw1 =
10 :
Wysw2 =
10
'kreski na
wyświetlaczu
Wait
2
'będą
wyswietlane 2 sekundy
Tzad =
30
'wartość
początkowa
Wysw1 =
4 :
Wysw2 =
0
'wyświetlenie
"30" na wyświetlaczach
Do
If
Triak =
0
Then
Incr
Tzad
Wysw1
=
Tzad \
10 :
Wysw2 =
Tzad
Mod
10
'przeliczenie
na pojedyńczy wyswietlacz
If
Tzad =
80
Then
Tzad =
30
'max można
ustawić 80 stopni
Waitms
250
'dla knefelka
przerwa
End
If
If
Switch2
= 0
Then
Exit
Do
Loop
Wysw1 =
10 :
Wysw2 =
10
'wyswietlenie
kresek
Wait
1
End
Sub
Sub
Regulacja
If
Tzad >
T
Then
'jeśli
temp. wody jest mniejsza od temp. zadanej
Tzad_2
=
Tzad -
T
Select
Case
Tzad_2
Case
5 To
80 :
Moc =
2
'jeśli
różnica temp. jest duża to grzej mocno
Case
2 To
4 :
Moc =
4
'grzej
slabiej przy mniejszej różnicy
Case
1 :
Moc =
13
'a tu jeszcze
slabiej
Case
0 :
Moc =
0
'a tu w ogóle
nie grzej
End
Select
Else
Moc =
0
'nie grzej
End
If
End
Sub
Kody7seg:
'tablica stałych Kody7seg przechowująca kody wyświetlanych cyfr
'cyfra
0 1 2 3 4 5 6 7 8 9 -
Data
3 ,
159 ,
&B00100101
,
&B00001101
,
&B10011001
,
&B1001001
,
&B1000001
,
&B11111
,
&B1
,
&B1001
,
&B11111101