Bascom


Termometr mierzący temperaturę otoczenia w stopniach Celcjusza.
Program praktyczny i poglądowy, mówiący o tym, jak w prosty sposób przekonwertować napięcie na częstotliwość i ten parametr odczytać przy pomocy procesora.


Kwarc zastosowano przyszłościowo, jeśli nie będziesz rozbudowywał tego programu, możesz z niego zrezygnować.




'TermometrLM35iCzas2.bas

'Pomiar temp. LM35 i przetwornik U/f.

'Procesor sprawdza częstotliwość f, gdzie 200Hz=20 oC.

'Przycisk w Pin1, to Reset.

'Po włączeniu procesora, na Lcd widoczny jest pomiar temperatury (XX.X).

'W Odmierz_1sek ustawiamy temp. max. po przekroczeniu, której będzie alarm dźwiękowy i załączony Portc.3.

'Również, w Odmierz_1sek ustawiamy temp. min. po przekroczeniu, której będzie alarm dźwiękowy i załączony Portc.2.

'Jeśli to ma być np. 30oC. wpisujemy 300, jeśli 15.5oC, to wpisujemy 155.

'Procesor Atmega8.

'Opracował Henryk Wydmuch.

'Fusebit A997 ustawiony na generator wewnętrzny 0100.

'Schemat: TermometrLM35iCzas2.png

'Pamięć zajęta w 29%.

 

$regfile = "m8def.dat"                                      'Dyrektyway dla kompilatora.

 $crystal = 8000000                                         'Zastosujemy oscylator wewnętrzny 8MHz.

 Config Lcd = 16 * 2

 Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0

 

 

  Enable Interrupts                                         'Odblokuj przerwania.

 

 Config Timer0 = Timer , Prescale = 8                       'Timer0 jako Timer z podziałem przez osiem.

 Config Timer1 = Counter , Edge = Falling                   'Timer1 jako licznik działający od zbocza opadającego.

 

 

 Config Pinc.2 = Output                                     'Konfiguruj Portc.2 jako wyjście.

   Set Portc.2                                              'Dołącz rezystor podciągający.

 Config Pinc.3 = Output                                     'Port wykonawczy.

   Set Portc.3                                              'Ustaw poziom wysoki.

 Config Pind.5 = Input                                      'Konfiguruj Portd.5 jako wejście.

   Set Portd.5                                              'Dołącz rezystor podciągający.

 Config Pinc.5 = Output                                     'Konfigurujemy Portc.5 dla głośnika.

   Portc.5 = 1                                              'Ustaw 1 w Portc.5.

 

 

  Deflcdchar 0 , 15 , 9 , 9 , 15 , 32 , 32 , 32 , 32        'Tu konstruujemy stopień Celcjusza (Ctrl+L).

 

 On Timer0 Odmierz_1s                                       'Podprogram dla Timera0 o nazwie Odmierz_1s.

 

 Dim Liczba_przerwan_tim0 As Word                           'Rezerwujemy dwa bajty w pamięci dla zmiennej Liczba_przerwan_tim0. Tu załadujemy liczbę przerwań Timera0.

 Dim Lczba_przep_tim1 As Byte                               'Rezewujemy jeden bajt dla zmiennej Liczba_przep_tim1. Tu załadujemy liczbę przerwań Timera1.

 Dim Flaga_aktual_lcd As Bit                                'Rezerwujemy jeden bit na aktualizację wyświetlacza Lcd.

 Dim Wynik_pomiaru As Long                                  'Rezerwujemy cztery bajty dla zmiennej Wynik_pomiaru. Tu znajdzie się wynik pomiaru.

 Dim F As Single                                            'Przeznaczamy 4 bajty dla zmiennej F, która będzie przechowywać temp. z przecinkiem..

 Enable Timer0                                              'Odblokowujemy przerwanie Timera0.

 Enable Timer1                                              'Odblokowujemy przerwanie Timera1.

 

 Stop Timer0                                                'Zatrzymujemy Timer0.

 Stop Timer1                                                'Zatrzymujemy Timer1.

 

 Timer1 = 0                                                 'Zerujemy Timer1.

 Wynik_pomiaru = 0                                          'Zerujemy zmienną Wynik_pomiaru.

 Liczba_przerwan_tim0 = 0                                   'Zerujemy zmienną zawierającą liczbę przerwań Timera0.

 Lczba_przep_tim1 = 0                                       'Zerujemy zmienną zawierającą liczbę przerwań Timera1.

 Cls                                                        'Czyść.

 Start Timer1                                               '

 Start Timer0                                               '

 

 Do                                                         'Pierwsza pętla, obsługująca zegar i termometr.

  If Flaga_aktual_lcd = 1 Then                              'Jeśli flaga aktualizacji Lcd włączona (po każdej sekundzie), to...

  Flaga_aktual_lcd = 0                                      'Zeruj flagę.

  Cls                                                       'Czyść LCD.

  If Wynik_pomiaru > 0 Then                                 'Jeśli wynik pomiaru będzie większy od 0...

  F = Wynik_pomiaru / 10                                    ' Wynik_pomiaru podziel przez 10 i ten wynik załaduj do F.

  Lcd F                                                     'Wyświetl zawartość zmiennej F.

  Locate 1 , 5                                              'Natomiast, od piątego miejsca...

  Lcd "            "                                        'Wyświetl puste miejsce.

  Locate 2 , 2                                              'Druga linia Lcd, na drugi miejscu...

  Lcd " Temperatura"                                        'Napisz komunikat.

  Cursor Off                                                'Wyłącz kursor.

  Start Timer1                                              '

  Start Timer0                                              '

  End If                                                    'Koniec warunków.

  End If                                                    '

 

 Loop                                                       'Powtórz pętlę.

 End                                                        'Wróć do pierwszej pętli.

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 

 Odmierz_1s:                                                'Podprogram dla Timera0 (do wyznaczania 1sek).

  Timer0 = Timer0 + 6                                       'Do Timera0 dodaj sześć i zapamiętaj jako Timer0 (zliczy 250).

  Incr Liczba_przerwan_tim0                                 'Liczbę przerwań Timera0 powiększ o jeden.

  If Liczba_przerwan_tim0 = 4000 Then                       'Jeśli liczba przerwań Timera0 jest równa 4000 (bo 4000*250us=1sek), to...

  Liczba_przerwan_tim0 = 0                                  'Wyzeruj zmienną.

  Wynik_pomiaru = 65536 * Lczba_przep_tim1                  'Zmienną Liczba_przep_tim1 pomnóż przez 65536, a wynik wstaw do zmiennej Wynik_pomiaru.

  Wynik_pomiaru = Wynik_pomiaru + Timer1                    'Wynik powyższego działania dodaj do aktualnej zawartości Timera1 i ten wynik wpisz do zmiennej Wynik_pomiaru.

  Flaga_aktual_lcd = 1                                      'Załącz flagę aktualizacji Lcd.

  Timer1 = 0                                                'Zeruj Timer1.

  Lczba_przep_tim1 = 0                                      'Zeruj zmienną.

  If Wynik_pomiaru => 245 Then                              'Jeśli z przetwiornika U/f otrzymamy 245Hz lub więcej, to...

  Goto Alarm_wysoki                                         'Skocz do podprogramu.                                                      'W przeciwnym razie.

 Else

  If Wynik_pomiaru =< 185 Then                              'Jeśli temperayura spadnie poniżej 18.5oC, to...

  Goto Alarm_niski                                          'Skocz do podprogramu.

  Wynik_pomiaru = 0                                         'Zeruj zmienną.

  F = 0                                                     'Zeruj F.

  End If                                                    'Koniec warunku.

  End If                                                    'Koniec uwarunkowania.

  End If                                                    '

 Return

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

 'Jeśli pojawi się alarm, można go skasować przy pomocy RESET.

 Alarm_wysoki:                                              'Podprogram (wywołuje alarm, gdy temp. przekroczy założoną).

 Do                                                         'Następna pętla.

  Cls                                                       'Czyść.

  Locate 1 , 5                                              'W pierwszej linii Lcd, na piątym miejscu...

  Lcd "ALARM!"                                              'Pokaż komunikat.

  Locate 2 , 1                                              'W drugiej linii Lcd, na pierwszym miejscu...

  Lcd "Czujnik1 24.5" ; Chr(0) ; "C"                        'Pokaż komunikat.

  Reset Portc.3                                             'Załącz Portc.3.

  Sound Portc.5 , 400 , 350                                 'Sygnał Dźwiękowy.

  Waitms 50                                                 'Krótka przerwa.

  Sound Portc.5 , 400 , 350                                 'Sygnał Dźwiękowy.(400-czas, 450-ton, większa cyfra=niższy ton).

  Waitms 800                                                'Krótka przerwa.

  Loop

  End                                                       'Koniec tej pętli.

  Return                                                    'Wróć do programu (do Odmierz_1s).

'------------------------------------------------------------

 Alarm_niski:                                               'Podprogram za niskiej temperatury (poniżej 18.5oC).

 Do                                                         'Następna pętla.

  Cls                                                       'Czyść.

  Locate 1 , 5                                              'W pierwszej linii Lcd, na piątym miejscu...

  Lcd "ALARM!"                                              'Pokaż komunikat.

  Locate 2 , 1                                              'W drugiej linii Lcd, na pierwszym miejscu...

  Lcd "Czujnik1 18.5" ; Chr(0) ; "C"                        'Pokaż komunikat.

  Reset Portc.3                                             'Załącz Portc.3.

  Sound Portc.5 , 400 , 450                                 'Sygnał Dźwiękowy.

  Waitms 50                                                 'Krótka przerwa.

  Sound Portc.5 , 400 , 450                                 'Sygnał Dźwiękowy.

  Waitms 800

  Loop                                                      'Powtórz.

  End                                                       'Koniec tej pętli.

  Return                                                    'Wróć do programu (do Odmierz_1s).

 

  'Opis:

 'Termometr z czujnikiem LM35 mierzy temperaturę otoczenia. Na środkowym wyprowadzeniu tego czujnika

 'otrzymujemy napięcie liniowo odpowiadające temperaturze. Temperatura 22oC daje napięcie 220mV.

 'Napięcie to podane jest na przetwornik U/f, następnie otrzymujemy częstotliwość 220Hz.

 'Częstotliwość podana jest na wejście Portd.5 procesora. Tutaj impulsy zostaną policzone.

 'Procesor liczy ile impulsów otrzymuje w czasie 1sek. Liczba impulsów otrzymana w czasie 1sek.

 'zostaje podzielona przez 10, a wynik zapisany do zmiennej F typu Single (Wynik_pomiaru / 10 ).

 'Rezultat ze zmiennej F zostaje wyświetlony na Lcd jako temperatura.

 'Jeśli zależy nam na zaalarmowaniu o zbyt niskiej lub zbyt wysokiej temperaturze,

 'wpisujemy te temperatury do programu (If Wynik_pomiaru => 245 Then) lub (If Wynik_pomiaru =< 185 Then).

 '245, to temperatura 24.5oC po przekroczeniu której jest alarm, albo 185, to temperatura 18.5oC, dolna,

 'czyli jeśli spadnie poniżej - alarm. W czasie alarmów Lcd pokazuje jaki to alarm, od której temperatury.

 'Kasowanie alarmu odbywa się przy pomocy Reset.