Ćwiczenie nr 1
Cel ćwiczenia:
Celem ćwiczenia jest zapoznanie się z możliwościami sterowania urządzeniami sprzężonymi bezpośrednio z portami mikrokontrolera.
Wiadomości wstępne:
- mikrokontroler 8051 dla użytkownika ma dostępny cały port P1 oraz 6 linii portu P3 (każdy port ma po 8 linii), z
pośród czterech portów;
- do linii 7 portu P1 podłączona jest dioda LED (gdy bit 7 portu P1 = 1 dioda nie świeci, gdy bit 7 portu P1 = 0 , wtedy dioda LED świeci);
- do linii 5 portu P1 podłączony jest generatorek piezoelektryczny (buzzer) jego uruchamianie następuje w taki sam sposób jak dioda LED, czyli: jeśli bit 5 portu P1 = 1 BUZZER nie generuje dźwięku, a gdy bit 5 portu P1 = 0 następuje wygenerowanie dźwięku;
- przycisk RESET po naciśnięciu ustawia wszystkie bity na wyjściach portów P1 i P3 w stan logiczny wysoki
( logiczne 1 );
Podstawowe komendy:
LJMP etykieta - long jump - długi skok - następstwem tej komendy jest „przeskoczenie” do dowolnej części programu, którego linia zaczyna się od: „ etykieta: ”
CLR bit lub bajt - clear - wyzeruj (ustaw na „0” ) bit lub cały bajt (np: CLR P1.7 - wyzerowanie bitu 7 portu P1- dioda LED powinna świecić)
SETB bit lub bajt - set - ustaw (ustaw na „1”) bit lub cały bajt (np: SETB P1.7 - ustawienie bitu 7 portu P1- dioda LED powinna NIE świecić)
MOV <D> ,<S> - move - przepisz - przekazanie danych pomiędzy źródłem (Source), a miejscem przeznaczenia (Destination) (np: MOV A,#10 - wpisanie do Akumulatora liczby dziesiętnej „10”)
LCALL podprogram - subroutine call - wywołanie podprogramu umieszczonego w pamięci mikrokontrolera
(np: LCALL DELAY_100MS - wstrzymanie pracy mikrokontrolera na 100 ms, aby uzyskać np: jedną sek. przerwy należy wcześniej użyć komendy: MOV A,#10 - wpisanie do akumulatora liczby 10, co da 1 sek. przerwy (10*100ms)
CPL bit lub bajt - complement - zaneguj bit lub bajt - rozkaz ten powoduje negację bitu lub bajtu, np: z „1” na „0” i odwrotnie. Działanie podobne do bramki NOT.
Ponadto używane są etykiety START, STOP, LOOP- pętla.
PRZYKŁAD 1.1
LJMP START
ORG 100H ;początek programu w pamięci - używane w każdym programie
START:
CLR P1.7 ;zeruj linię 7 w porcie P1
;czyli zapal diodę TEST
STOP: ;nie wykonuj innych działań
LJMP STOP ;- pozostań w pętli STOP
Przykład 1.1 zapala diodę TEST, poprzez wyzerowanie bitu 7 portu P1 (CLR P1.7).
PRZYKŁAD 1.2
LED EQU P1.7 ;nadanie etykiety bitowi 7 portu P1 „LED” dzięki temu zamiast
;używać „P1.7” można operować nazwą(etykietą), która bardziej
;obrazuje sterowane urządzenie
LJMP START
ORG 100H
START:
CLR LED ;zeruj linię LED (zamiast CLR P1.7)
;czyli zapal diodę TEST
STOP: ;nie wykonuj innych działań
LJMP STOP ;- pozostań w pętli STOP
Działanie takie samo jak w przykładzie 1.1.
PRZYKŁAD 1.3
LED EQU P1.7
LJMP START
ORG 100H
START:
LOOP: ;pętla mrugania diody TEST
CLR LED ;zeruj linię - zapal diodę TEST
SETB LED ;ustaw linię - zgaś diodę TEST
LJMP LOOP ;powtórz, skok do LOOP:
Wywołanie programu powoduje zaświecanie i gaszenie z dużą częstotliwością diody LED (port P1.7), co jest postrzegane przez zmysły człowieka jako słabe żarzenie się diody LED.
PRZYKŁAD 1.4
LED EQU P1.7
LJMP START
ORG 100H
START:
LOOP: ;Pętla mrugania diody TEST
CLR LED ;zeruj linię -zapal diodę
MOV A,#10 ;akumulator=10
LCALL DELAY_100MS ;podprogram z EPROM-u - opóźnienie 100ms*10
SETB LED ;ustaw linię -zgaś diodę
MOV A,#10 ;czekaj czas 10*100ms=1s
LCALL DELAY_100MS
LJMP LOOP ;powtórz
W tym przykładzie dla zauważenia efektu „pulsowania” diody LED zostało wprowadzone opóźnienie czasowe - podprogram DELAY_100MS. Przed wywołaniem podprogramu DELAY_100MS należy załadować do akumulatora „A” pewną liczbę, która będzie mnożnikiem 100ms. Używa się do tego rozkazu MOV (przenieś). MOV A,#10 - tym poleceniem ładujemy do akumulatora liczbę 10, wywołanie bezpośrednio pod tą komendą podprogramu DELAY_100MS spowoduje odczekanie 10 * 100 ms = 1s. Podprogram wywoływany jest poleceniem LCALL. Działanie programu jest „zapętlone” (LJMP LOOP;LOOP), co powoduje, że dioda zapala się na czas 1 sekundy, a potem gaśnie na jedną sekundę, po czym całość powtarza się, aż do zresetowania mikrokontrolera.
PRZYKŁAD 1.5
LED EQU P1.7
LJMP START
ORG 100H
START:
LOOP: ;Pętla mrugania diody
CPL LED ;neguj linię - zeruj/ustaw (1->0, 0->1) zapal/zgaś diodę
MOV A,#10 ;czekaj czas 10*100ms=1s
LCALL DELAY_100MS ;podprogram z EPROMu
LJMP LOOP ;powtórz
Jest to uproszczenie programu z przykładu 1.4. Poleceniem CLP negujemy dany bit (bajt). Po uruchomieniu mikrokontrolera bit 7 portu P1 = 1; komenda CLP neguje go na „0” - dioda LED świeci, jej świecenie jest „podtrzymywane” przez DELAY_100MS, następnie polecenie CLP neguje bit 7 P1 z „0” na „1”. Całość się powtarza.
Przykład ten ukazuje w jaki inny sposób można ustawiać stany poszczególnych bitów, a przy tym zdecydowanie skracając program.
PRZYKŁAD 1.6
LED EQU P1.7 ;Dioda TEST podłączona do P1.7
BUZZER EQU P1.5 ;Brzęczyk podłączony do P1.5
;Stan 0 włącza brzęczyk
LJMP START
ORG 100H
START:
LOOP: ;Pętla mrugania diody i sterowania brzęczyka
CPL LED ;zapal/zgaś diodę TEST
CPL BUZZER ;włącz/wyłącz brzęczyk
MOV A,#10 ;czekaj czas 10*100ms=1s
LCALL DELAY_100MS ;podprogram z EPROM-u
LJMP LOOP ;powtórz
W przykładzie tym wykorzystuje się kolejne urządzenie dołączone do linii 5 portu P1 - „BUZZER” -generatorek piezoelektryczny. Program powoduje jednoczesne zaświecenie diody LED i generowanie przez buzzer dźwięku przez ok. 1 sekundę, a następnie jednoczesne wygaszenie i wyłączenie diody i generatorka na czas ok. 1 sekundy. Całość jest zapętlona.
PRZYKŁAD 1.7
LED EQU P1.7
BUZZER EQU P1.5
LJMP START
ORG 100H
START:
CLR LED ;(„O” na P1.7)zapal diodę TEST !!!, ale na bardzo krótko
LOOP: ;Pętla sterowania diody i brzęczyka
CPL LED ;zapal/zgaś diodę TEST
CPL BUZZER ;włącz/wyłącz brzęczyk
MOV A,#10 ;czekaj czas 10*100ms=1s
LCALL DELAY_100MS ;podprogram z EPROM-u
LJMP LOOP ;powtórz
Przykład 1.7 umożliwia naprzemienne działanie diody LED oraz brzęczka - buzzer. Zostało to uzyskane przez wyzerowanie, przed pętlą LOOP, bitu 7 P1 (zaświecenie diody LED). Pozostała część programu odbywa się w pętli , z tym że na przemian jest negowany port diody LED i BUZZERA oraz wprowadzone opóźnienie (DELAY_100MS), powoduje to (od początku programu) gaszenie diody i generowanie tonu przez buzzer-a w jednej chwili przez 1 sek. Następnie, skok do miejsca LOOP i odwrócenie stanów na portach - dioda świeci, a buzzer milczy -1 sek.
Odbywa się to aż do momentu naciśnięcia RESET-u.
WNIOSKI:
W nietypowych zastosowaniach mikrokontroler 8051 może służyć do włączania i wyłączania diody LED lub/i BUZZERA.