Gdańsk, 15.12.2003 r.
Marcin Tobiasz
Krzysztof Warnke
Automatyka i Robotyka
semestr dziewiąty
Laboratorium
Komputerowych Systemów Automatyki
Stanowisko laboratoryjne do badania
współpracy mikrokontrolera serii 8051
z komputerem PC
1. Wstęp
Nasze zadanie laboratoryjne polegało na opracowaniu trzech sposobów kodowania tekstu. Tekst wejściowy wprowadzany zostaje przy pomocy klawiatury komputera PC, wynik - tekst zakodowany - zostaje wyświetlony w oknie terminala. Cała procedura kodowania, czyli zamiany tekstu wejściowego na wyjściowy ciąg znaków, odbywa się w mikrokontrolerze. Komputer komunikuje się z zewnętrznym układem mikroprocesora za pomocą portu szeregowego.
2. Opis działania programu
Kodowanie w programie polega na modyfikacji ostatnich bitów każdego znaku w kodowanym tekście. Aby uprościć zadanie zastosowany algorytm jest symetryczny, tzn. za pomocą tej samej procedury można zaszyfrować jak i później odtworzyć wybrany ciąg znaków. Jednym z takich algorytmów jest stosowana w naszym programie suma symetryczna (modulo 2). Wybór liczby kodującej jest dokonywany przez użytkownika według poniższej kombinacji:
Sposób kodowania: kod_h: kod_b:
1 07 0000 0111
2 06 0000 0110
3 0E 0000 1110
12 01 0000 0001
13 09 0000 1001
23 08 0000 1000
123 0F 0000 1111
Liczby zostały dobrane w ten sposób, aby nie udało się wyskoczyć poza zakres znaków możliwych do bezpośredniego wprowadzenia z klawiatury, gdyż na tym etapie możliwe jest jedynie szyfrowanie pojedynczych wyrazów wprowadzanych przez użytkownika za pośrednictwem konsoli.
Działanie programu polega na:
wczytaniu całego tekstu - znaki wczytywane z klawiatury PC'ta ładowane są do zadeklarowanego uprzednio obszaru pamięci mikrokontrolera; również w pamięci znajduje się zmienna zawierająca liczbę wprowadzonych znaków;
wyborze liczby kodującej;
zakodowanie i wyświetlenie tekstu - na każdym znaku przeprowadzana jest operacja modulo2 z liczbą kodującą; w ten sposób zmodyfikowany znak zostaje wyświetlony na ekranie,
Do poprawnego odkodowania znaków wymagana jest znajomość sposobu, którym został on zakodowany.
3. Wnioski
Procesor doskonale radzi sobie z tak prostymi procedurami, jedyne, z czym mieliśmy problemy, to komunikacja PC - mikrokontroler. Zdarzało się bowiem, że procesor przestawał reagować na komendy wydawane z konsoli komputera, lub zawieszał swą pracę podczas wczytywania programu do pamięci.
Co do działania programu, należałoby go usprawnić dodając obsługę kursora, klawiszy DEL i BACKSPACE pozwalających na podstawową edycję wpisanego tekstu, w obecnej fazie bowiem, tekst wpisany jest tekstem ostatecznym. Oczywiście w praktyce nigdy nie szyfruje się pojedynczych wyrazów, lecz całe dokumenty. W takim przypadku, gdy użytkownik nie musi widzieć tekstu zaszyfrowanego (program taki sam wczytywałby plik) można przenieść zaszyfrowane znaki poza zakres znaków bezpośrednio wprowadzanych z klawiatury, co znacznie utrudniłoby odkodowywanie ręczne.
Sposób kodowania jest sposobem dosyć prymitywnym, lecz odczytanie informacji bez znajomości liczby kodującej nastręczyłoby pewnych trudności. Z łatwością można jednak zmodyfikować program i uruchomić na dowolnym innym procesorze.
4. Listing programu
Listing kodu źródłowego programu napisanego w języku ASSEMBLER dla procesora Intel 8051.
;Laboratorum KSA
;Krzysztof Warnke & Marcin Tobiasz
;automatyka i robotyka
;semestr 9
wczyt equ 07Fh ;obsluga czytania z klawiatury
wypis equ 07Dh ;obsluga wyswietlania znaku
linia equ 095h ;dodatkowa linia
nasztxt equ 0A0h ;adres poczatkowy bufora tekstu
ile equ 030h ;zmienna licznika znakow
kod equ 040h ;zmienna kodu
org 08000h ;adres poczatkowy
ljmp start
start: mov dptr, #txt1 ;zapamietanie adresu tekstu
lcall wypisz ;wywolanie procedury wypisujacej
lcall linia ;dodatkowa linia
mov R0, #ile ;zerowanie licznika
mov @R0, #0
mov R0, #nasztxt ;zapamietanie adresu bufora
czytajlp: lcall wczyt ;czytanie z klawiatury
lcall wypis ;wyswietlanie w konsoli
mov @R0, A ;zapis wczytanego znaku
inc R0 ;zwieksz adres ufora
inc ile ;zwieksz licznik
cjne A, #13, czytajlp;if nie wcisnieto 'enter' dalej
lcall linia
mov dptr, #txt2 ;zapamietanie adresu tekstu
lcall wypisz ;wywolanie procedury wypisujacej
lcall linia ;dodatkowa linia
wybork: mov R0, #kod ;budowanie algorytmu kodowania
mov @R0, #0 ;zeruj zmienne
mov A, 0
mov R1, #3 ;licznik petli
wyborlp: lcall wczyt ;czytaj znak z klawiatury
lcall wypis ;wyswietl znak
clr c ;czysc znacznik zera
mov R4, A ;tymczasowa pamiec znaku
subb A, #31h ;czy wcisnieto '1'
jz jeden
subb A, #1h ;czy wcisnieto '2'
jz dwa
subb A, #1h ;czy wcisnieto '3'
jz trzy
mov A, R4 ;odtworzenie zawartosci
cjne A, #13, wyborlp ;if nie wcisnieto 'enter' dalej
sjmp koncwbr
wybrnxt: dec R1 ;poprawnie wybrano jeden sposob
mov A, R1
jz koncwbr ;sprawdz czy juz wybrano trzy
sjmp wyborlp jesli nie - wbieraj dalej
koncwbr: lcall linia ;dodatkowa linia
lcall linia ;dodatkowa linia
sjmp koduj
jeden: mov R0, #kod ;pierwszy sposob
mov A, @R0 ;wczytaj kod
xrl A, #07h ;modyfikuj kod
mov @R0, A ;zapamietaj kod
sjmp wybrnxt
dwa: mov R0, #kod ;drugi algorytm
mov A, @R0 ;wczytaj kod
xrl A, #06h ;modyfikuj kod
mov @R0, A ;zapamietaj kod
sjmp wybrnxt
trzy: mov R0, #kod ;trzeci algorytm
mov A, @R0 ;wczytaj kod
xrl A, #0Eh ;modyfikuj kod
mov @R0, A ;zapamietaj kod
sjmp wybrnxt
koduj: mov R0, #nasztxt ;adres poczatku bufora
mov R3, ile ;zawartosc licznika
mov R1, #kod ;sposob kodowania
kodujlp: mov A, @R0 ;czytaj pierwszy znak
xrl A, @R1 ;kodowanie
mov @R0, A ;zapamietanie
lcall wypis ;wypisanie zakodowanego
inc R0 ;zwieksz adres bufora tekstu
djnz R3, kodujlp ;zmniejsz i skocz jesli nie zero
lcall linia ;dodatkowa linia
ljmp start
wypisz: clr A ;procedura wypisujaca tekst
movc A, @A+dptr ;wczytaj znak
jz endpisz ;jezeli to zero - zakoncz
lcall wypis ;wypisz znak
inc dptr ;zwieksz adres
sjmp wypisz ;dalej
endpisz: ret ;powrot
txt1: db 13, 10, 'Program kodujacy/dekodujacy zadany tekst', 13
db 13, 10, 'Wpisz tekst: ', 13, 10, 0
txt2: db 13, 10, 'wybierz sposob kodowania', 13
db 13, 10, 'dozwolone sposoby to 1 2 lub 3', 13,
db 13, 10, 'lub ich kombinacja', 13, 10, 0
end