Bascom

Ten program pozwala zbudować urządzenie do załączania po wpisanym czasie. Przed upływem zaprogramowanego czasu pojawi się przerywany sygnał dźwiękowy.

'WlacznikZOpoznieniem.bas

 'Czasowy włącznik.

 'Można ustawić czas włączenia Portu.

 'Szybkość czasu i ilość kolejnych impulsów widać na Lcd.

 'Opis pod programem.

 'Opracował Henryk Wydmuch

 'Program zajmuje 14% pamięci.

 

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

$crystal = 10240000                                         'Informujemy kompilator o kwarcu 10.24MHz.

 

 Config Lcd = 16 * 2                                        'Konfiguracja Lcd.

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

 

 Config Timer0 = Timer , Prescale = 1                       'Timer0 jako licznik czasu.

 Config Timer1 = Counter , Edge = Rising

 

 Config Pind.6 = Output                                     'Port wyjściowy częstotliwości Timer0.

  Set Portd.6                                               'Ustaw poziom wysoki na wyjściu Portd.6.

 Config Pind.1 = Output                                     'Port wyjściowy częstotliwości.

  Set Portd.1                                               'Ustaw poziom wysoki.

 Config Pind.5 = Input                                      'Wejście do Timer1.

 Config Pind.2 = Input                                      'Port wejściowy przycisku.

  Set Portd.2                                               'Ustaw poziom wysoki.

 Config Pind.0 = Output                                     'Port wyjściowy.

  Set Portd.0                                                 'Ustaw poziom wysoki.

 

 Dim Zm As Word                                             'Zm, zmienna przerwań Timer0.

 Dim Odp As Single                                          'Odp, zmienna, która będzie zawierać odpowiedź o częstotliwości..

 Dim Wp As Word                                             'Wp, zmienna do której będzie wpisywana liczba do podziału.

 

 On Timer0 Licz                                             'Podprogram Timer0.

 

 Enable Interrupts                                          'Zezwalaj na wszystkie przerwania.

 Enable Timer0                                              'Odblokuj przerwania Timer0.

 Enable Timer1                                              'Odblokuj przerwania Timer1.

 Stop Timer0                                                '

 Cls                                                        '

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

Do                                                          'Pętla.

 Wp = 8000                                                  'Tutaj, do zmiennej Wp wpisujemy liczbę podziału.

 Home                                                       'Pokazuj w jednym miejscu.

 Odp = 20 / Wp                                              '20KHz podziel przez liczbę, którą wprowadziliśmy.

 Lcd Odp ;                                                  'Pokaż odpowiedź.

 Locate 1 , 6                                               '

 Lcd "   "                                                  '

 Lcd "KHz     "                                             '

 Odp = 0                                                    'Zeruj zmienną.

 

 Debounce Pind.2 , 0 , Skok , Gosub A                       'Przycisk w Portd.2. Skocz do podprogramu Skok. Wykonaj A:.

 A:

   Lowerline                                                'Druga linia Lcd.

 Lcd Counter1 ; "  Counter1" ;                              'Impulsy wpływające do Timer1.

 

 If Counter1 => 100 Then                                    'Jeśli w Timer1 jest 100 impulsów...

 Toggle Portd.1                                             'Przełącz Portd.1

 End If                                                     '

 

 If Counter1 => 120 Then                                    'Jeśli w Timer1 jest 120 impulsów...

 Reset Portd.0                                              'Włącz na stałe Portd.2.

 End If                                                     '

 

 If Counter1 => 122 Then                                    'Po 122 impulsie...

 Counter1 = 0                                               'Zeruj Timer1.

 Stop Timer0                                                '

 Set Portd.1                                                'Wyłącz Portd.1.

   Cls                                                      '

 End If                                                     '

 Loop                                                       'Powtórz pętlę.

End                                                         'Koniec pętli.

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

Licz:                                                       'Podprogram Timer0.

   Incr Zm                                                  'Po każdym przerwaniu powiększaj zmienną.

   If Zm = Wp Then                                          'Jeśli jest tyle przerwań, ile wpisaliśmy do Wp, to Toggle.

   Toggle Portd.6                                           'Zmień stan Portd.6.

   Zm = 0                                                   'Zeruj zmienną.

  End If                                                    'Koniec warunku.

Return                                                      'Wróć do programu.

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

 Skok:

 Start Timer0

Return

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

 

'Objaśnienie:

'Timer0 jest generatorem.

'Jedno przerwanie trwa 25uS (mikrosekund), jest to połowa okresu.

'Jeden okres trwa 50uS.

'Z iterfejsu Czasy.exe możemy zobaczyć, że 50uS to frekwencja 20KHz.

'Jeśli do Wp wpiszemy podział 1, to generator będzie oscylował z częstotliwością właśnie 20KHz.

'Każdą inną częstotliwość możemy otrzymać wpisując do Wp liczbę podziału.

'Przykład: Wp=18.  20KHz/18=1,11KHz.

'Po wpisaniu liczby 18, otrzymaliśmy częstotliwość generatora 1,11KHz.

'Jeśli do Wp wpiszemy 8000, to generator oscyluje z częstotliwością 2Hz.

'Wyjście generatora to Portd.6.

 

'Timer1 jest licznikiem impulsów.

'Wejście licznika, to Portd.5.

'Licznik zlicza impulsy generatora.

 

'W pętli Do można ustawić czas załączenia Portu.

'Tutaj: po 100 impulsach pojawi się miganie Led i przerywane piszczenie Buzera w Portd.1, minął czas ok. 55sek.

'Po dalszych 10sek. załączy się Portd.0 i tak pozostanie. Buzer milknie.

'Reasumując: przy Wp=8000 i nastawie w pętli Do, po naciśnięciu startu P1 odliczony zostanie czas 1min i 5sek.

'10sek. przed upływem czasu jest alarm.

 

'Koniec.