ZADANIE 1
Celem zadania była obserwacja w trybie krokowym działania programu sterującego jasnością świecenia żarówki.
Program źródłowy |
A |
P1 |
Ż |
W |
Komentarz |
START: LCALL INICJALIZACJA |
00 |
FF |
nś |
-- |
;ustawienia wstępne |
LCALL WYŚWIETL |
05 |
FF |
nś |
-- |
;wyświetla wstępną wartość opóźnień ;(opóźnienia w A) |
LOOP: JNP SIEC,$ |
05 |
FF |
nś |
5 |
;oczekiwanie na ”0” sieci |
LCALL DELAY_MS |
05 |
FF |
nś |
5 |
;odczekanie opóźnienia A*1ms |
CLR BRAMKA |
00 |
FF |
nś |
5 |
;załączenie tyrystora |
MOV A,#10 |
00 |
FB |
ś |
5 |
;10 do akumulatora |
DJNZ ACC,$ |
0A |
FB |
ś |
5 |
;zwłoka czasowa |
SETB BRAMKA |
00 |
FB |
ś |
5 |
;wyłączenie tyrystora |
LCALL KLAWIATURA |
00 |
FF |
nś |
5 |
;pobiera do A nową wartość opóźnienia |
SJMP LOOP |
05 |
FF |
nś |
5 |
;zamknięcie pętli programu |
ZADANIE 2
Celem zadania było przy wykorzystaniu programu tabela.hex odczytanie wartości funkcji odpowiadających argumentom nadawanym z klawiatury.
Program źródłowy |
D |
A |
R7 |
R6 |
kl |
LCD |
A |
R7 |
R6 |
kl |
LCD |
A |
R7 |
R6 |
kl |
LCD |
Komentarz |
START: LCALL INICJALIZACJA |
0000 |
00 |
00 |
00 |
-- |
-- |
-- |
00 |
00 |
-- |
-- |
-- |
00 |
00 |
-- |
-- |
;ustawienia ;wstępne |
LOOP: LCALL KLAWIATURA |
8001 |
01 |
00 |
00 |
1 |
1 FB6C |
02 |
00 |
00 |
2 |
2 F6DA |
03 |
00 |
00 |
3 |
3 F248 |
;czyta klaw. |
MOV DPTR,#TABELA |
8001 |
01 |
00 |
00 |
-- |
1 FB6C |
02 |
00 |
00 |
-- |
2 F6DA |
03 |
00 |
00 |
-- |
3 F248 |
;tabela ;funkcyjna |
PUSH ACC |
8001 |
01 |
00 |
00 |
-- |
1 FB6C |
02 |
00 |
00 |
-- |
2 F6DA |
03 |
00 |
00 |
-- |
3 F248 |
;przechowaj ; n r klawisza |
RL A |
8001 |
01 |
00 |
00 |
-- |
1 FB6C |
02 |
00 |
00 |
-- |
2 F6DA |
03 |
00 |
00 |
-- |
3 F248 |
;mnóż przez 2 |
PUSH ACC |
8001 |
02 |
00 |
00 |
-- |
1 FB6C |
04 |
00 |
00 |
-- |
2 F6DA |
06 |
00 |
00 |
-- |
3 F248 |
;przechowaj ;przesunięcie |
MOVC A,@A+DPTR |
8001 |
02 |
00 |
00 |
-- |
1 FB6C |
04 |
00 |
00 |
-- |
2 F6DA |
06 |
00 |
00 |
-- |
3 F248 |
;st bajt z tabeli |
MOV R7,A |
8001 |
FB |
FB |
00 |
-- |
1 FB6C |
F6 |
00 |
00 |
-- |
2 F6DA |
F2 |
F2 |
00 |
-- |
3 F248 |
;wynik do R7 |
POP ACC |
8001 |
FB |
FB |
00 |
-- |
1 FB6C |
F6 |
F6 |
00 |
-- |
2 F6DA |
F2 |
F2 |
00 |
-- |
3 F248 |
;odtwórz przes |
INC A |
8001 |
02 |
FB |
00 |
-- |
1 FB6C |
04 |
F6 |
00 |
-- |
2 F6DA |
06 |
F2 |
00 |
-- |
3 F248 |
;wskaż mł bajt |
MOVC A,@A+DPTR |
8001 |
03 |
FB |
00 |
-- |
1 FB6C |
05 |
F6 |
00 |
-- |
2 F6DA |
07 |
F2 |
00 |
-- |
3 F248 |
;pobierz ;młodszy bajt |
MOV R6,A |
8001 |
6C |
FB |
6C |
-- |
1 FB6C |
DA |
F6 |
DA |
-- |
2 F6DA |
48 |
F2 |
48 |
-- |
3 F248 |
;wynik do R6 |
POP ACC |
8001 |
6C |
FB |
6C |
-- |
1 FB6C |
DA |
F6 |
DA |
-- |
2 F6DA |
48 |
F2 |
48 |
-- |
3 F248 |
;odtwórz ;nr klawisza |
SJMP LOOP |
8001 |
01 |
FB |
6C |
-- |
1 FB6C |
02 |
F6 |
DA |
-- |
2 F6DA |
03 |
F2 |
48 |
-- |
3 F248 |
;pętla programu |
Tabela funkcyjna |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
0180 |
brak reakcji |
FB6C |
F6DA |
F248 |
EDB6 |
E924 |
E492 |
E000 |
ZADANIE 3
Celem zadania było takie uzupełnienie programu timer.asm by opóźnienie czasowe było realizowane przez timer 0.Obliczone wartości stanów początkowych timera miały zostać umieszczone w tabeli funkcyjnej.
;TITLE `ZAROWKA'
B0R2 EQU 2
B0R6 EQU 6
B0R7 EQU 7
SIEC EQU P3.4
BRAMKA EQU P1.2
T0_G EQU 0
T0_C EQU 0
T0_M EQU 1
TIM0 EQU T0_M.+T0_C*4+T0_G*8
T1_G EQU 0
T1_C EQU 0
T1_M EQU 0
TIM1 EQU T1_M.+T1_C*4+T1_G*8
TMOD_SET EQU TIM0 + TIM1*16
LJMP START
ORG 100H
START:
LCALL INICJALIZACJA
MOV TMOD, TMOD_SET
LOOP:
CLR TR0
CLR TF0
MOV TL0,R6
MOV TH0,R7
JNB SIEC,$
SETB TR0
JNB TF0,$
CLR BRAMKA
MOV A,#10
DJNZ ACC,$
SETB BRAMKA
LCALL KLAWIATURA
SJMP LOOP
INICJALIZACJA:
LCALL LCD_CLR
MOV R7,#0
MOV R6,#0
RET
KLAWIATURA:
LCALL LCD_CLR
LCALL WAIT_KEY
LCALL WRITE_DATA
INC A
MOV A,@A + PC
RET
TABELA:
0FCH, 018H ; 256-252 256-232
0F8H, 030H ; 256-248 256-208
0F4H, 048H ; 256-244 256-184
0F0H, 060H ; 256-240 256-160
0ECH, 078H ; 256-236 256-136
0E8H, 090H ; 256-232 256-112
0E4H, 0A8H ; 256-228 256-88
0E0H, 0C0H ; 256-224 256-64
RET
ZADANIE 4
Celem zadania było uzupełnienie programu siec.asm tak by po asemblacji mierzył on częstotliwość sieci.
Algorytm programu:
;TITLE `Pomiar częstotliwości'
SIEC EQU P3.4
BRAMKA EQU P1.2
T0_G EQU 0
T0_C EQU 1
T0_M EQU 1
TIM0 EQU T0_M.+T0_C*4+T0_G*8
T1_G EQU 0
T1_C EQU 0
T1_M EQU 1
TIM1 EQU T1_M.+T1_C*4+T1_G*8
TMOD_SET EQU TIM0 + TIM1*16
TH1_SET EQU 256-180
TL1_SET EQU 0
LJMP START
ORG 100H
START:
MOV TMOD,TMOD_SET ;ustawienie trybów pracy timerów
LOOP:
MOV R0,#20
MOV TL0,#0 ;zerowanie timera 0
MOV TH0,#0
JNB SIEC,$ ;czekaj na 0 sieci
SETB TR0
TIME:
MOV TH1,TH1_SET ;ustawienie wartości początkowych
MOV TL1,TL1_SET ;timera 1 odliczenie 50ms
CLR TF1 ;zerowanie flagi przepełnienia
SETB TR1 ;uruchomienie timera 1
LICZ:
JNB SIEC,TEST ;zliczanie przez timer 0 zdarzeń U=0
SETB TR0
RET
TEST:
JNB TF1,LICZ ;sprawdzanie ustawienia flagi
RET
DJNZ R0,TIME ;pętla odliczania czasu R0*50ms
CLR TR0 ;zatrzymanie timerów
CLR TR1
MOV A,TL0 ;zapisanie w ACC stanu timera 0
MOV B,#2 ;podzielenie stanu ACC przez 2
DIV AB ;wynik do akumulatora
LCALL WYSWIETL
CPL P1.7 ;zmiana stanu diody LED
SJMP LOOP ;zamknięcie pętli
WYSWIETL:
LCALL LCD_CLR ;wyczyścić wyświetlacz
MOV B,#10 ;zamiana liczby na postać dziesiętną
DIV AB ;przez wydzielenie dziesiątek
LCALL WRITE_HEX ;wypisanie wartości częstotliwości
MOV A,B
LCALL WRITE_HEX
MOV A,#' ` ;wyświetlenie napisu Hz
LCALL WRITE_DATA
MOV A,#'H`
LCALL WRITE_DATA
MOV A,#'z`
LCALL WRITE_DATA
RET