$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