KOMPUTEROWE SYSTEMY STEROWANIA
Projekt
Model banku
Grzegorz Barnik
Tomasz Pawłowski
AiR ISD
Cel projektu.
Zrealizować model banku (bankomatu) na zestawie uruchomieniowym dla mikrokontrolera MCS-51, oraz komputerem PC jako terminalem umożliwiającym dokonywanie operacji na rachunku bankowym: sprawdzenie stanu konta, wpłata i wypłata środków.
Realizacja.
Ze względu na dostępne narzędzia oraz możliwości sprzętu laboratoryjnego program realizujący postawione zadanie napisaliśmy w assemblerze, korzystając również z dodatkowych funkcji umożliwiających komunikację komputera PC (terminal) z zestawem uruchomieniowym mikrokontrolera.
Po uruchomieniu programu wyświetlany jest komunikat powitalny oraz dwie opcje do wybrania: 1.Logowanie, 2.Wyjście. Wybranie pierwszej opcji spowoduje pojawienie się napisu informującego o potrzebie wprowadzeniu numeru PIN. Wpisany PIN porównywany jest z numerami zapisanymi w pamięci i jeżeli jest zgodny z jednym z nich to wyświetlają się opcje dostępne dla konkretnego użytkownika (w tworzeniu modelu ograniczyliśmy się do dwóch użytkowników).
W tym momencie mamy możliwość sprawdzenia stanu konta oraz dokonać wpłat i wypłat. Zmienne zawierające stan konta podczas pracy systemu są przechowywana w rejestrach pomocniczych R1 i R2, co umożliwia aktualizację stanu konta zaraz po dokonanej operacji na rachunku.
Dodatkowe komentarze dotyczące programu w dołączonym listingu.
Wnioski.
Zrealizowanie zadania na dostępnym zestawie laboratoryjnym nie należało do najłatwiejszych. Lista rozkazów mikrokontrolera MCS-51 jest dosyć uboga w rozkazy skoków i porównań, co bardzo wpłynęło na długość kodu programu. W przypadku zwiększania liczby użytkowników banku na przeszkodzie mogłaby stanąć liczba rejestrów pomocniczych, których użyliśmy do operacji na rachunkach.
Listing programu.
locat equ 08000h
org locat
db 0a5h,0e5h,0e0h,0a5h
db 35,255,0,0
db 0,0,0,0
db 0,0,0,0
db 0,0,0,0
db 0,0,0,0
db 0,0,0,0
db 255,255,255,255
db 'Bank',0
org locat+64
;adresy funkcji
newline equ 95h
pcstr equ 92h
cin equ 7Fh
asc2hex equ 0B2h
wyswietl equ 3500h
ghex equ 87h
ghex16 equ 89h
pint16u equ 0A0h
pint8u equ 09Ah
phex16 equ 83h
ljmp naglowek
;zmienne
nag0: db ' BANK ' ,13,0
menu0: db 'Wybierz: ',13,0
menu1: db '1. Logowanie',13,0
menu2: db '2. Wyjscie',13,0
menubl: db 'Blad! Nie ma takiej opcji!',13,0
log0: db 'Podaj PIN:',13,0
opcje0: db '1. Wyplata',13,0
opcje1: db '2. Wplata',13,0
opcje2: db '3. Stan konta',13,0
opcje3: db '4. Wyjscie',13,0
pin01: db 10
pin02: db 23
osoba01: db 'Barnik Grzegorz',13,0
osoba02: db 'Pawlowski Tomasz',13,0
stan_konta01: db 12
stan_konta02: db 100
kwota: db 'Podaj kwote:',13,0
;strefy: db 3,3,1
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
naglowek:
lcall newline
mov dptr,#nag0
lcall pcstr
lcall newline
mov R1,#12 ;poczatkowy stan konta 01
mov R2,#100 ;poczatkowy stan konta 02
;koniec
menu:
lcall newline
mov dptr,#menu0
lcall pcstr
lcall newline
mov dptr,#menu1
lcall pcstr
mov dptr,#menu2
lcall pcstr
lcall cin ;czytanie klawiatury
lcall asc2hex
lcall wyswietl
cjne A,#2,menu_2 ;jak nie 2 to sprawdza dalej
ret ;jak 2 - wyjscie z programu
menu_2:
cjne A,#1,menu_b ;jak nie 1 to dalej (wyswietlenie bledu)
ljmp konto ;jak 1 - start
menu_b:
mov dptr,#menubl ;wyswietlenie wiadomosci o bledzie
lcall pcstr
ljmp menu ;ponowne wyswietlenie menu
;koniec menu glowne
konto:
lcall newline
mov dptr,#log0 ;napis 'podaj PIN'
lcall pcstr
lcall ghex ;wpisanie PIN
lcall wyswietl
cjne A,#16,skok01 ;sprawdzanie PIN, jesli nie rowny to sprawdzamy innego usera
;--------------------------pierwsza osoba-------------------------------------
lcall newline ;wypisanie osoby
mov dptr,#osoba01
lcall pcstr
opcje01:
lcall newline
mov dptr,#opcje0
lcall pcstr
mov dptr,#opcje1
lcall pcstr
mov dptr,#opcje2
lcall pcstr
mov dptr,#opcje3
lcall pcstr
lcall cin ;czytanie klawiatury
lcall asc2hex
cjne A,#4,menu1_4 ;jak nie 4 to dalej
ljmp menu ;jak 4 to wyjscie
menu1_4: ;stan konta
cjne A,#3,menu1_3 ;jak nie 3 to dalej
lcall newline
mov A,R1
lcall pint8u
lcall newline
ljmp opcje01
skok01:
ljmp nast_pin
menu1_3: ;wplata
cjne A,#2,menu1_2 ;jak nie 2 to sprawdza dalej
lcall newline
mov dptr,#kwota
lcall pcstr
lcall ghex ;dodanie do konta
lcall newline
mov R0,A
mov A,R1
add A,R0
mov R1,A
lcall pint8u
ljmp opcje01
menu1_2: ;wyplata
cjne A,#1,menu1_b
lcall newline
mov dptr,#kwota
lcall pcstr
lcall ghex ;odejmowanie
lcall newline
mov R0,A
mov A,R1
subb A,R0
mov R1,A
lcall pint8u
ljmp opcje01
menu1_b:
mov dptr,#menubl ;wyswietlenie wiadomosci o bledzie
lcall pcstr
ljmp opcje01
;---------------------------druga osoba-------------------------------------
nast_pin:
cjne A,#35,skok02
lcall newline
mov dptr,#osoba02
lcall pcstr
opcje02:
lcall newline
mov dptr,#opcje0
lcall pcstr
mov dptr,#opcje1
lcall pcstr
mov dptr,#opcje2
lcall pcstr
mov dptr,#opcje3
lcall pcstr
lcall cin ;czytanie klawiatury
lcall asc2hex
lcall wyswietl
cjne A,#4,menu2_4 ;jak nie 4 to dalej
ljmp menu ;jak 4 to wyjscie
menu2_4: ;stan konta
cjne A,#3,menu2_3 ;jak nie 3 to dalej
lcall newline
mov A,R2
lcall pint8u
ljmp opcje02
skok02:
ljmp dalej
menu2_3: ;wplata
cjne A,#2,menu2_2 ;jak nie 2 to sprawdza dalej
lcall newline
mov dptr,#kwota
lcall pcstr
lcall ghex ;dodawanie
lcall newline
mov R0,A
mov A,R2
add A,R0
mov R2,A
lcall pint8u
ljmp opcje02
menu2_2: ;wyplata
cjne A,#1,menu2_b
lcall newline
mov dptr,#kwota
lcall pcstr
lcall ghex ;odejmowanie
lcall newline
mov R0,A
mov A,R2
subb A,R0
mov R2,A
lcall pint8u
ljmp opcje02
menu2_b:
mov dptr,#menubl ;wyswietlenie wiadomosci o bledzie
lcall pcstr
ljmp opcje02
dalej:
ljmp konto
end