'Praca dyplomowa ' BASCOM College ' (EdW 2001.01 str. 20) ' Temat : "Termometr z Dallas DS1820" ' wersja 1.1 (20.03.2001) ' Compiler : BASCOM 8051 LIBRARY V 2.06 ' Used ROM : &H7A3 1955 (dec) > Ok ' Poprawki do ver. 1.0: ' - poprawiony błąd odczytu temp > 41,5 st.C (bo Waitms działa tylko dla wartości 1-255) ' - optymalizacja kodu (skrócenie): ' - przerzucenie polecenia 1Wreset do podprocedury skróciło program o 15 bajtów ' - drobna poprawka procedury wyświetlania temperatury (Wysw_temp) 'Części składowe: ' TEST BOARD AVT-2500 z AT89C2051 i LCD, ' DS1820 na magistrali 1WIRE 'Autor : ' Artur Schwartz ' artursch@rumia.edu.pl ' (058) 671-52-30 ' Konfiguracja sprzętowa : 1WIRE, LCD ' 1 Wire: ' P 1.0 ' LCD: ' RS - P1.2 ' EN - P1.3 ' DB4 - P1.4 ' DB5 - P1.5 ' DB6 - P1.6 ' DB7 - P1.7 ' 1 Wire commands: ' 1. Read ROM - 33h ' 2. Match ROM - 55h ' 3. Search ROM - F0h ' 4. Skip ROM - CCh ' 5. Alarm Search - ECh ' Convert T - 44h ' Read Scratchpad - BEh ' WriteScratchpad - 4Eh ' Copy Scratchpad - 48h ' Recall E2 - B8h ' Read Power Supl - B4h ' Konfiguracja programowa : Config 1wire = P1.0 ' wskazanie kompilatorowi do którego pinu podłączamy magistralę Config Lcd = 16 * 1a 'wyświetlacz LCD Deflcdchar 0 , 238 , 234 , 238 , 224 , 224 , 224 , 224 , 224 'definicja symbolu "stopień" ' Zmienne Dim Is_device As Bit 'zmienna wskazująca czy na magistrali jest urządzenie Dim Number(8) As Byte 'tu przechowamy serial number urządzenia Dim T(2) As Byte 'tu przechowamy odczytaną wartość z DS1820 Dim X As Byte Dim R As Byte Dim Temp As Single 'wartość temperatury po przekształceniach Dim Str_temp As String * 5 'string do wyświetlenia temperatury ' Stałe Const R_rom = &H33 '1. Read ROM - 33h Const Con_t = &H44 'Convert T - 44h Const M_rom = &H55 '2. Match ROM - 55h Const R_src = &HBE 'Read Scratchpad - BEh ' Komunikaty Const Kom_1 = "Termometr 1.1" 'Komunikat powitalny Const Kom_2 = "Temp. :" Const Minus = "-" Const Celcj = "C" 'symbol stopni CELCJUSZA Const Err_1 = "Error: " 'komunikat błędu - np. przerwa na 1WIRE Const Err_2 = "No Device !" 'komunikat błędu - brak urządzenia 'Deklaracje procedur Declare Sub Read_numbers 'Odczytaj SerialNumber urządzenia Declare Sub Pomiar_temp 'Dokonaj pomiaru temperatury Declare Sub Match_rom 'Wywołaj urządzenie na magistrali Declare Sub Wysw_temp 'Konwertuj/wyświetl odczytaną wartość Declare Sub 1w_reset ' Początek programu Cls Is_device = 1 'Na początek zakładamy, że urządzenie jest na magistrali Cursor Off Lcd Kom_1 'Powitanie Wait 1 Cls Cursor Off Lcd Kom_2 Do 'początek pętli programowej 1w_reset 'inicjacja magistrali 1WIRE If Err = 1 Then 'jeżeli żaden układ nie odpowiedział 'na wezwanie to: Is_device = 0 ' brak urządzenia Cls ' wyczyść wyświetlacz Lcd Err_1 ; Err_2 ' wyświetl komunkikat Waitms 250 ' zaczekaj 250 ms Else Call Read_numbers 'przeczytaj serial układu 1WIRE Call Pomiar_temp 'Odczytaj temperaturę Call Wysw_temp 'Wyświetl odczytaną wartość na LCD End If Loop ' Koniec programu 'Procedury Sub Read_numbers 'Odczytaj/zapamiętaj SerialNumber urządzenia If Is_device = 0 Then 'jeśli był poprzednio wyświetlony błąd Cls Lcd Kom_2 ' wyczyść teksty i już nie rób "czyszczenia" Is_device = 1 ' wyświetlacza następnym razem End If 1wwrite R_rom 'żądanie podania przez odnaleziony 'układ jego numeru seryjnego For R = 1 To 8 Number(r) = 1wread() 'odczytaj z magistrali 1WIRE kolejne 'bajty numeru układu i zapamiętaj Next R End Sub Sub Pomiar_temp 'Dokonaj pomiaru temperatury 1w_reset 'inicjacja magistrali 1WIRE Call Match_rom 'Wybierz konkretne urządzenie 1wwrite Con_t 'Convert T Waitms 250 'Idle DS1820 Waitms 250 'Idle DS1820 (w sumie 500 ms) 1w_reset 'inicjacja magistrali 1WIRE Call Match_rom 'Wybierz konkretne urządzenie 1wwrite R_src 'żądanie odczytania temperatury T(1) = 1wread() 'odczytaj z magistrali 1WIRE 1 bajt T(2) = 1wread() 'odczytaj z magistrali 1WIRE 2 bajt 1w_reset 'inicjacja magistrali 1WIRE End Sub Sub Match_rom 'Wywołaj urządzenie na magistrali 1wwrite M_rom 'Żądanie "Match ROM" For R = 1 To 8 1wwrite Number(r) ' dla urządzenia o SerialNum. If Err = 1 Then 'jeżeli Błąd Is_device = 0 ' ustaw Brak_Urządzenia Cls ' wyczyść wyświetlacz Lcd Err_1 ; R ' wyświetl komunkikat Wait 1 ' chwilkę zaczekaj/wyświetlaj End If Next R End Sub Sub Wysw_temp 'Konwertuj/wyświetl odczytaną wartość Locate 2 , 2 If T(2) = 0 Then 'Temperatury dodatnie Temp = T(1) / 2 ' oblicz temperaturę Else 'Temperatury ujemne X = 256 - T(1) ' oblicz temperaturę Temp = X / 2 ' oblicz temperaturę Lcd Minus ' znak "minus" dla ujemnych End If Str_temp = Fusing(temp , ###.&) ' przekształć do string Lcd Str_temp ; Chr(0) ; Celcj ; " " 'Wyświetl temperaturę End Sub Sub 1w_reset ' dla skrócenia kodu 1wreset End Sub