Upload
idana
View
59
Download
2
Embed Size (px)
DESCRIPTION
Mikrokontrolery MCS51. Literatura . - PowerPoint PPT Presentation
Citation preview
Mikrokontrolery MCS51
Literatura
H.Małysiak - Mikrokomputery jednoukładowe serii MCS48, MCS51, MCS96 (PKJS Gliwice 1992)
T.Prokop - Wybrane mikrokomputery jednomodułowe firmy INTEL (Wydawnictwa PW 1991)
P.i P.Gałka - Podstawy programowania mikrokontrolera 8051 (Mikom 1995)
T.Starecki - Mikrokontrolery jednoukładowe rodziny 51 (NOZOMI 1996)
T.Starecki - mikrokontrolery 8051 w praktyce (BTC 2004)
J.Janiczek, A.Stępień - Mikrokontrolery (WCKP 1999)
J.Janiczek, A.Stępień - Laboratorium systemów mikroprocesorowych. cz I i II (WCKP, 1996)
J.Doliński - Mikrokomputer jednoukładowy 8051. (Wyd. PLJ 1993)
J.M.Sibigtroth - Zrozumieć małe mikrokontrolery (BTC 2003)
R.Pełka - Mikrokontrolery, architektura, programowanie, zastosowania (WKŁ 1999)
L.Grodzki - materiały do przedmiotu - pliki *.pdf dostępne na stronie www przedmiotu
Wykład 1 1/38
Architektura MCS51
Przestrzenie adresowe
Tryby adresowania
Lista rozkazów
Historia 2/38
1980
1990
rodzina MCS48:8048/49/508020/21/22
6MHz
1983
rodzina MCS51:8051/5212MHz
1976
8085rodzina MCS96
rodziny MCS151 MCS251
Architektura MCS51 3/38
Układ 8051 z serii MCS51 charakteryzuje się następującymi cechami: ośmiobitową jednostką CPU; wbudowanym procesorem operacji bitowych; szeroką gamą 255 instrukcji, w tym rozkazów szybkiego mnożenia
i dzielenia liczb 1-bajtowych; wbudowanym obwodem zegara systemu; obecnością 32 linii we/wy; wbudowaną wewnętrzną pamięcią RAM o pojemności 128 bajtów; wbudowaną wewnętrzną pamięcią ROM (8051) albo EPROM (8751)
o pojemności 4kB; przestrzenią adresową 64kB dla zewnętrznej pamięci RAM; przestrzenią adresową 64kB dla zewnętrznej pamięci ROM (EPROM); wbudowanymi dwoma 16-bitowymi timerami; wbudowanym dwukierunkowym portem transmisji szeregowej; priorytetowym, wektorowym systemem przerwań.
Architektura MCS51 4/38
Struktura blokowa układu 8051
128B SRAM rej. P2
rej. adr. RAM
PC inkrementer
PC
rej. DPTR
gen.taktu
RR & DR układ
sterowania
XTAL1 XTAL2
PSENALE
EARST
Acc
PSW
TMP1 TMP2
ALU
rej. B
rej. P1
PCON SCON SBUFTCONTH0 TL0
TH1 TL1 TMOD
IP IE SP
system przerwań, port SIO, 2 timery/liczniki
rej. P0
rej. P3
4kBROM
rejestr adresu programu
P1.7 ... P1.0 P3.7 ... P3.0
P0.7 ... P0.0 P2.7 ... P2.0Vcc GND
SFR
Architektura MCS51 5/38
Struktura blokowa układu 8052
256B SRAM
rej. P2rej. adr. RAM
PC inkrementer
PC
rej. DPTR
gen.taktu
RR & DR układ
sterowania
XTAL1 XTAL2
PSENALE
EARST
Acc
PSW
TMP1 TMP2
ALU
rej. B
rej. P1
PCON SCON SBUFTCONTH0 TL0
TH1 TL1 TMOD
IP IE SP
system przerwań, port SIO, 3 timery/liczniki
rej. P0
rej. P3
8kBROM
rejestr adresu programu
P1.7 ... P1.0 P3.7 ... P3.0
P0.7 ... P0.0 P2.7 ... P2.0Vcc GND
SFR
TH2 TL2 T2CONRCAP2H RCAP2L
Architektura MCS51 6/38
Standardowe obudowy układów 8051/52
Architektura MCS51 7/38
Przestrzenie adresowe układów MCS51
0FFFFh
RAM zewnętrzny
0000h
RAM wewnętrzny
ROM zewn. ROM wewn.
0000h
0FFFFh
ROM zewnętrzny
ROMMAXEA=0 EA=1
0FFh
80h
bank 000h
bank 108h
bank 210h
bank 318h
7Fh 78h bity bezpośr. adresowalne
07h 00h
2Fh
20h
RAM
7Fh
30h
opcjonalny RAM SFR
adres startowy programu = 0000h
adresy = k*8+3 - wektory przerwań
Architektura MCS51 - rejestry robocze 8/38
Banki rejestrów roboczych
Komórki wewnętrznego RAM z obszaru 00h..1Fh mogą być używane jako 4 banki rejestrów roboczych:
R000h: R101h: R202h: R303h: R404h: R505h: R606h: R707h:
bank00R008h: R109h: R20Ah: R30Bh: R40Ch: R50Dh: R60Eh: R70Fh:
bank01R010h: R111h: R212h: R313h: R414h: R515h: R616h: R717h:
bank10R018h: R119h: R21Ah: R31Bh: R41Ch: R51Dh: R61Eh: R71Fh:
bank11
Numer aktualnie aktywnego banku rejestrów wskazują bity RS1, RS0 w PSW.
Typowym zastosowaniem banków rejestrów jest obsługa przerwań.
Architektura MCS51 - bity bezpośrednio adresowalne 9/38
Bity bezpośrednio adresowalne
Są to bity fragmentu wewnętrznego RAM i wybranych rejestrów SFR.
Są bezpośrednio dostępne dla rozkazów operacji bitowych.
Pełnią funkcję 1-bitowych rejestrów logicznych.
Bity komórek RAM z obszaru 20h..2Fh mają adresy bezpośrednie od 0..127
(00..7Fh), zgodnie ze wzorem:
adrbitu = (adrbajtu - 20h)*8 + pozycjawbajcie
W przypadku rejestrów SFR, bity bezpośrednio adresowalne mają rejestry
o adresie będącym wielokrotnością 8 (np. 80h, C8h).
Architektura MCS51 - SFR 10/38
SFR - blok rejestrów specjalnych:
• przestrzeń 128 adresów od 80h do 0FFh;
• zawiera rejestry umożliwiające: - dostęp do wbudowanych peryferii - sterowanie pracą mikrokontrolera - kontrolowanie systemu przerwań
• ekstensywne wykorzystanie adresów w standardzie (8051) pozwala na projektowanie licznych rozszerzeń jego struktury o różnorodne urządzenia zewnętrzne;
• rejestry zdefiniowane przez Intela dla 8051 jako standard, mają takie same adresy w SFR w innych układach rodziny MCS51;
... - PT2 BD PS BC ...IP B8h
bit niezaimplementowany
kursywa -dodatkowy obiekt
w 8052
adres bitu bezpośrednio
adresowalnego
adres rejestru w bloku SFR
nazwarejestru
nazwabitu
Architektura MCS51 - SFR 11/38
P2.7 A7 P2.6 A6 P2.5 A5 P2.4 A4 P2.3 A3 P2.2 A2 P2.1 A1 P2.0 A0P2 A0h
EA AF - AE ET2 AD ES AC ET1 AB EX1 AA ET0 A9 EX0 A8IE A8h
P3.7 B7 P3.6 B6 P3.5 B5 P3.4 B4 P3.3 B3 P3.2 B2 P3.1 B1 P3.0 B0P3 B0h
- BF - BE PT2 BD PS BC PT1 BB PX1 BA PT0 B9 PX0 B8IP B8h
TF2 CF EXF2CE RCLKCD TCLKCC EXEN2CB TR2 CA C/T2 C9 CP/RL2C8T2CON C8h
CAhRCAP2LCBhRCAP2HCChTL2CDhTH2
CY D7 AC D6 F0 D5 RS1 D4 RS0 D3 OV D2 - D1 P D0PSW D0h
A.7 E7 A.6 E6 A.5 E5 A.4 E4 A.3 E3 A.2 E2 A.1 E1 A.0 E0A E0h
B.7 F7 B.6 F6 B.5 F5 B.4 F4 B.3 F3 B.2 F2 B.1 F1 B.0 F0B F0h
Architektura MCS51 - SFR 12/38
P0.7 87 P0.6 86 P0.5 85 P0.4 84 P0.3 83 P0.2 82 P0.1 81 P0.0 80P0 80h81hSP82hDPL83hDPH
SMOD - - - GF1 GF0 PD IDLPCON 87h
TF1 8F TR1 8E TF0 8D TR0 8C IE1 8B IT1 8A IE0 89 IT0 88TCON 88hGATE C/T M1 M0 GATE C/T M1 M0TMOD 89h
8AhTL08BhTL18ChTH08DhTH1
P1.7 97 P1.6 96 P1.5 95 P1.4 94 P1.3 93 P1.2 92 P1.1 91 P1.0 90P1 90h
SM0 9F SM1 9E SM2 9D REN 9C TB8 9B RB8 9A TI 99 RI 98SCON 98h99hSBUF
Architektura MCS51 - SFR - PSW 13/38
CY D7 AC D6 F0 D5 RS1 D4 RS0 D3 OV D2 - D1 P D0PSW D0h
CY - flaga przeniesienia
AC - flaga przeniesienia połówkowego przy dodawaniu (między bitami 3 i 4)
F0 - flaga do wykorzystania w programie
OV - flaga nadmiaru po operacjach arytmetycznych
P - flaga parzystości liczby jedynek w akumulatorze A
RS1,RS0 - bity wyboru aktywnego banku rejestrów: RS1,RS0 = 00 01 10 11 aktywny bank 0 1 2 3
Brak flagi zera! Rozkazy skoków warunkowych JZ, JNZ bezpośrednio testują stan akumulatora.
Architektura MCS51 - SFR - A, B 14/38
Wykorzystywany w większości operacji ALU.Jego bity są bezpośrednio adresowalne.Pośredniczy przy odwołaniach do zewnętrznej pamięci danych.
A.7 E7 A.6 E6 A.5 E5 A.4 E4 A.3 E3 A.2 E2 A.1 E1 A.0 E0A E0h
B.7 F7 B.6 F6 B.5 F5 B.4 F4 B.3 F3 B.2 F2 B.1 F1 B.0 F0B F0h
Pomocniczy rejestr roboczy.Wykorzystywany przy rozkazach mnożenia i dzielenia pojedynczych bajtów.Jego bity są bezpośrednio adresowalne.
Architektura MCS51 - SFR - SP i stos 15/38
81hSP
Rejestr adresujący wierzchołek stosu programowego - wskazuje na ostatnio zapisany na stos bajt.
Po resecie przyjmuje wartość 07h !
Stos
Funkcjonuje tylko w wewnętrznym RAM (! ograniczony obszar).Zapis na stos powoduje przesuwanie się wierzchołka stosu w kierunku wyższych adresów, odczyt - odwrotnie.! Możliwe jest „zawinięcie” stosu modulo rozmiar wbudowanej wewn. RAM.
2BhB:
11hA:
58hSP:
x59h:0Dh58h:34h57h:
x5Ah:
RAM
stos
PUSH B
stos
59h
2BhPOP A
stos
58h
2Bh2Bh
Funkcjonowanie MCS51 - tryby adresowania 16/38
Tryby adresowania operandów - bajtów
• natychmiastowy kod rozkazu operand
mov r6,#130
• rejestrowy operand kod rozkazuRx:
mov a,r6
• bezpośredni kod rozkazu adres
RAMwewn.
inc 20h
Funkcjonowanie MCS51 - tryby adresowania 17/38
• rejestrowy pośredniRAM
wewn/zewn
adres8bkod rozkazu
R0/R1:
adres16bkod rozkazu
DPTR:RAMzewn
mov b,@r0movx @r1,a
movx a,@dptr
• adresowanie indeksowo-względne
PC/DPTR:
d
kod rozkazuROM
baza
A:
movc a,@a+dptrmovc a,@a+pc
Tryb adresowania operandów - bitów
• bezpośredni kod rozkazu
RAMwewn.
mov c,20h
adres
Funkcjonowanie MCS51 - tryby adresowania 18/38
ROM zewn. ROM wewn.
0000h
0FFFFh
ROM zewnętrzny
ROMMAXEA=0 EA=1
0FFh
80h
bank 000h
bank 108h
bank 210h
bank 318h
7Fh 78h bity bezpośr. adresowalne
07h 00h
2Fh
20h
RAM
7Fh
30h
opcjonalny RAM SFR
rejestrowy pośredni RAMw
bezpośredni RAM
rejestrowy
bezpośredni-bitów
rejestrowy pośredni z DPTR
rejestrowy pośredni z R0/R1
0FFFFh
RAM zewnętrzny(XRAM)
0000hRAM
wewnętrzny
indeksowo-względny
Dostępność trybów adresowania
Funkcjonowanie MCS51 - tryby adresowania 19/38
Lista rozkazów MCS51 20/38
1. Rozkazy arytmetyczne
ADD A,Rr A:=A+Rr Rr=R0,R1,R2,R3,R4,R5,R6,R7
ADD A,dir A:=A+RAM[dir] dir=adres bezpośredni RAM lub SFR
ADD A,@Rj A:=A+RAMw[Rj] Rj=R0,R1
ADD A,#d8 A:=A+d8 d8=dana natychmiastowa 1B
CY A = 29 R0 = 71 AC P OV
x 00011101 przed 01000111 x 0 x
add a,r0
0 01100100 po 01000111 1 1 0
A = 100
Lista rozkazów MCS51 21/38
ADDC A,Rr A:=A+Rr+CY Rr, dir, Rj, d8 – jak dla ADD
ADDC A,dir A:=A+RAM[dir]+CY
ADDC A,@Rj A:=A+RAMw[Rj]+CY
ADDC A,#d8 A:=A+d8+CY
CY A = 100 R1 = 30 AC P OV
0 01100100 przed 00011110 1 1 0
addc a,r1
0 10000010 po 00011110 1 0 1
A = -126
CY A = 100 R1 = 30 AC P OV
1 01100100 przed 00011110 1 1 0
addc a,r1
0 10000011 po 00011110 1 1 1
A = -125
Lista rozkazów MCS51 22/38
SUBB A,Rr A:=A-Rr-CY Rr, dir, Rj, d8 – jak dla ADD
SUBB A,dir A:=A-RAM[dir]-CY
SUBB A,@Rj A:=A-RAMw[Rj]-CY
SUBB A,#d8 A:=A-d8-CY
CY A = -125 AC P OV
1 10000011 przed 1 1 1
subb a,#-10 ; (-125)-(-10)-1
1 10001100 po 1 1 0
A = -116
CY A = 125 AC P OV
0 01111101 przed 1 0 1
subb a,#15 ; (125)-(15)-0
0 01101110 po 1 1 0
A = 110
Lista rozkazów MCS51 23/38
INC arg arg:=arg+1 arg=A,Rr,dir,@Rj
DEC arg arg:=arg-1
INC DPTR DPTR:=DPTR+1
DA A korekcja dziesiętna A (tylko po dodawaniu)
MUL AB BA:=A*B iloczyn bez znaku
DIV AB A:=A/B, B:=A mod B
CY A = 100 B = 30 AC P OV
x 01100100 przed 00011110 x 1 x
mul ab
0 10111000 po 00001011 0 0 1
BA = 3000
Lista rozkazów MCS51 24/38
2. Rozkazy logiczne
ANL A,Rr A:=A Rr Rr=R0,R1,R2,R3,R4,R5,R6,R7
ANL A,dir A:=A RAM[dir] dir=adres bezpośredni RAMw lub SFR
ANL A,@Rj A:=A RAMw[Rj] Rj=R0,R1
ANL A,#d8 A:=A d8 d8=dana natychmiastowa 1B
ANL dir,A RAM[dir]:= RAM[dir] A
ANL dir,#d8 RAM[dir]:= RAM[dir] d8
A = 83h AC P OV CY
10000011 przed x 1 x x
anl a,#0Fh ;
00000011 po x 0 x x
A = 03h
Lista rozkazów MCS51 25/38
A = 83h AC P OV CY
10000011 przed x 1 x x
orl a,#23h ;
10100011 po x 0 x x
A = 0A3h
ORL A,Rr A:=A Rr
ORL A,dir A:=A RAM[dir]
ORL A,@Rj A:=A RAMw[Rj]
ORL A,#d8 A:=A d8
ORL dir,A RAM[dir]:= RAM[dir] A
ORL dir,#d8 RAM[dir]:= RAM[dir] d8
Lista rozkazów MCS51 26/38
A = 83h AC P OV CY
10000011 przed x 1 x x
xrl a,#0Fh ;
10001100 po x 1 x x
A = 8Ch
XRL A,Rr A:=A Rr x y = /x y x /y
XRL A,dir A:=A RAM[dir]
XRL A,@Rj A:=A RAMw[Rj]
XRL A,#d8 A:=A d8
XRL dir,A RAM[dir]:= RAM[dir] A
XRL dir,#d8 RAM[dir]:= RAM[dir] d8
mov P1,#0FEh
powt1: xrl P1,#03h
sjmp powt1
mov P1,#0FEh
powt2: cpl P1.0
cpl P1.1
sjmp powt2
Lista rozkazów MCS51 27/38
CLR A A:=0
CPL A A:=not A
XRL SJMP XRL SJMP XRL SJMP
cyklemasz.
rozkazy
P1.1
P1.0
;zadanie: generacja fal prostokątnych w przeciwfazach na liniach P1.0 i P1.1
CPLCPL SJMP SJMP SJMP
cyklemasz.
rozkazy
P1.1
P1.0
CPLCPL CPLCPL
Lista rozkazów MCS51 28/38
3. Rozkazy obrotów
RL A
RLC A
RR A
RRC A
SWAP A A7..4 A3..0
7 A 0
CY 7 A 0
CY 7 A 0
7 6 5 4 3 2 1 0
7 A 0
Lista rozkazów MCS51 29/38
4. Rozkazy operacji bitowych
CLR C CY:=0
CLR bit bit:=0 bit - bit bezpośrednio adresowalny
CPL C CY:= ~CY
CPL bit bit:= ~bit
ANL C, bit CY:=CY bit
ANL C,/bit CY:=CY ~ bit
ORL C, bit CY:=CY bit
ORL C,/bit CY:=CY ~ bit
MOV C,bit CY bit
MOV bit,C bit CY
Lista rozkazów MCS51 30/38
5. Rozkazy przesłań
MOV A,Rr A Rr Rr=R0,R1,R2,R3,R4,R5,R6,R7
MOV A,dir A RAM[dir] dir= adres bezpośredni RAMw lub SFR
MOV A,@Rj A RAMw[Rj] Rj=R0,R1
MOV A,#d8 A d8 d8=dana natychmiastowa 1B
MOV Rr,A Rr A
MOV Rr,dir Rr RAM[dir]
MOV Rr,#d8 Rr d8
MOV dir,A RAM[dir] A
MOV dir,Rr RAM[dir] Rr
MOV dir,@Rj RAM[dir] RAMw[Rj]
MOV dir,#d8 RAM[dir] d8
MOV dird,dirs RAM[dird] RAM[dirs] dird,dirs = dir
Lista rozkazów MCS51 31/38
MOV @Rj,A RAMw[Rj] A
MOV @Rj,dir RAMw[Rj] RAM[dir]
MOV @Rj,#d8 RAMw[Rj] d8
SBUFTL0
A
mov r0,#86h mov @r0,A
86h:85h:
7Dh:
79h:78h:
mov r1,#85h mov B,@r1
B
mov 79h,7Dh
mov 78h,SBUF mov TL0,79h
RAMw
Lista rozkazów MCS51 32/38
MOV DPTR,#d16 DPTR d16 d16=dana natychmiastowa 2B
MOVC A,@A+DPTR A ROM[DPTR+A]
MOVC A,@A+PC A ROM[DPTR+A]
201h:
203h:
206h:207h:208h:
20Ah:
210h:
212h:
ROM
mov a,#2
mov dptr,#dane
movc a,@a+dptr ;1)
movc a,@a+pc ;2)
ajmp 300h
db 10
org 210hdane: db 16,17,2
A
7402900210938371000A::
101102
2)
1)
Lista rozkazów MCS51 33/38
MOVX A,@DPTR A XRAM[DPTR]
MOVX @DPTR,A XRAM[DPTR] A
MOVX A,@Rj A XRAM[P2Rj]
MOVX @Rj,A XRAM[P2Rj] A
XRAM
A
A 0080h:
1090h:
mov r0,#80h mov p2,#0 movx @r0,a
mov dptr,#1090h movx @dptr,a
mov dptr,#80h movx a,@dptr
mov r1,#90h mov p2,#10h movx a,@r1
Lista rozkazów MCS51 34/38
XCH A,Rr A Rr
XCH A,dir A RAM[dir]
XCH A,@Rj A RAMw[Rj]
XCHD A,@Rj A3..0 RAMw[Rj]3..0
PUSH dir SP:=SP+1, RAMw[SP] RAM[dir]
POP dir RAM[dir] RAMw[SP], SP:=SP-1
NOP instrukcja pusta
RAMw
A R3xch a,r3
A
mov r1,#40h xchd a,@r1 40h:
Lista rozkazów MCS51 35/38
6. Rozkazy skoków
AJMP a11 PC10..0a11 a11-adres wewn. bieżącej 2kB strony programu
LJMP a16 PC a16 a16-adres pełny
JMP @A+DPTR PC:=DPTR+A, A=0..255
przykład użycia rozkazu do realizacji skoku z przełącznikiem
zał: numer skoku (0..k) znajduje się w akumulatorze
....
RLA ;podwojenie wartości k
MOV DPTR,#jmptab ;DPTR tablica z adresami skoków
JMP @A+DPTR
....
jmptab: AJMP proc0
AJMP proc1
....
AJMP prock
....
Lista rozkazów MCS51 36/38
SJMP r8 PC:=PC+r8 r8:= -128..127
JZ r8 if A=0 then PC:=PC+r8
JNZ r8 if A0 then PC:=PC+r8
JC r8 if CY=1 then PC:=PC+r8
JNC r8 if CY=0 then PC:=PC+r8
JB bit,r8 if bit=1 then PC:=PC+r8
JNB bit,r8 if bit=0 then PC:=PC+r8
JBC bit,r8 if bit=1 then (PC:=PC+r8, bit:=0)
CJNE arg1,arg2,r8 if arg1 < arg2 then CY:=1 else CY:=0 możliwe pary: if arg1 arg2 then PC:=PC+r8 arg1 arg2 A dir A #d8 Rr #d8 @Rj #d8 DJNZ arg,r8 arg := arg-1 arg = Rr, dir if arg 0 then PC:=PC+r8
7. Rozkazy wywołań procedur i powrotów
Lista rozkazów MCS51 37/38
ACALL a11 SP:=SP+1, RAMw[SP] PCL, SP:=SP+1, RAMw[SP] PCH, PC10..0 a11 a11-adres wewn. bieżącej 2kB strony programu
LCALL a16 SP:=SP+1, RAMw[SP] PCL, SP:=SP+1, RAMw[SP] PCH, PC a16 a16-adres pełny
RET PCH RAMw[SP], SP:=SP-1, PCL RAMw[SP], SP:=SP-1
RETI PCH RAMw[SP], SP:=SP-1, PCL RAMw[SP], SP:=SP-1, odblokowanie aktualnego poziomu przerwań
typ rozkazu CY AC OV P komentarzz z z z każdy rozkaz traktujący PSW jako bajt pamięci lub bity bezp. adresowalne
z każdy rozkaz zmieniający stan AADD A,...ADDC A,...
z z z z CY - przy dodawaniu NB sygnalizuje nadmiarOV- ustawiania gdy jest przeniesienie z bitu 7 a nie ma z bitu 6 lubodwrotnie, zerowana w pozostałych przypadkach,przy dodawaniu U2 sygnalizuje nadmiar
SUBB A,... z z z z CY - wymagana pożyczka dla bitu 7OV - ustawiana gdy jest pożyczka dla bitu 7 a nie ma dla bitu 6 lubodwrotnie, zerowana w pozostałych przypadkach,przy odejmowaniu U2 sygnalizuje nadmiar
MUL AB 0 z z OV - ustawiana gdy iloczyn > 255DIV AB 0 z z OV - ustawiana gdy dzielenie przez 0DA A z zRRC ARLC A
z z
CJNE arg1,arg2 z CY:=1 gdy arg1 < arg2CLR C 0 CY:=0CPL C z CY:=not CYSETB C 1 CY:=1ANL C,... z zgodnie z wynikiem operacjiORL C,... z zgodnie z wynikiem operacjiMOV C,... z zgodnie z wynikiem operacji
8. Wpływ rozkazów na PSW
Lista rozkazów MCS51 38/38
MCS51 - przykłady programowania 1/9
; Procedura przekształcająca liczbę binarną z akumulatora na 2 znaki ASCII - cyfry hex ; parametry: A = liczba; R1 -> bufor na znaki;; wyniki: M(R1),M(R1+1) = 2 znaki ASCII hex;; zmiany: A, PSW, R1:=R1+2;; długość: 32B; ; czas trwania: 28-30c.m.; wykorzystanie stosu: 3TOASCII:PUSH B ;przechowanie rej. B na stosie MOV B,#16 DIV AB ;A:=A/16, B:=A mod 16 ORL A,#30H ;tworzenie znaku ASCII CJNE A,#3AH,TA1 ;dla starszej cyfry hex.TA1: JC TA2 ;skok przy znakach ‘0’..’9’ ADD A,#7 ;korekcja kodu znakuTA2: MOV @R1,A ;znak do bufora INC R1 ;nastepna pozycja w buforze MOV A,B ORL A,#30H ;tworzenie znaku ASCII CJNE A,#3AH,TA3 ;dla mlodszej cyfry hex.TA3: JC TA4 ;skok przy znakach ‘0’..’9’ ADD A,#7 ;korekcja kodu znakuTA4: MOV @R1,A ;znak do bufora INC R1 ;nastepna pozycja w buforze POP B ;odtworzenie rej. B RET
MCS51 - przykłady programowania 2/9
; Procedura realizująca programowo zadane opóźnienie.; parametry: R7 = stała opóźnienia;; wyniki: czas wykonania procedury zależny od R7;; zmiany: PSW, R7:=0;; długość: 12B;; czas trwania: 10+6*R7c.m. ; (wsp. 10 wynika z PUSH, POP i RET; wsp. 6 wynika z MUL i DJNZ).; wykorzystanie stosu: 4DELAY: PUSH ACC ;przechowanie A i B na stosie PUSH BDELAY1: MUL AB ;wlasciwa petla opozniajaca DJNZ R7,DELAY1 POP B ;odtworzenie stanu B i A POP ACC RET
Przykład wywołania (zużywającego 1+2 c.m.): MOV R7,#100 ;inicjacja licznika petli ACALL DELAY
MCS51 - przykłady programowania 3/9
; Procedura realizująca programowo zadane opóźnienie.; parametry: R7 = stała opóźnienia;; wyniki: czas wykonania procedury zależny od R7;; zmiany: PSW, R7:=0;; długość: 7B;; czas trwania: 2+6*R7c.m. ; (współczynnik 2 wynika z RET; współczynnik 6 wynika z 4xNOP i DJNZ).; wykorzystanie stosu: 2DELAY: NOP ;wlasciwa petla opozniajaca NOP NOP NOP DJNZ R7,DELAY RET
Przykład wywołania (zużywającego 1+2 c.m.): MOV R7,#100 ;inicjacja licznika petli ACALL DELAY
MCS51 - przykłady programowania 4/9
; Fragment programu realizujący skok z przełącznikiem.; Numer skoku do wykonania znajduje się w akumulatorze. ..... RL A ;zdwojenie wartosci MOV DPTR,#JMPTAB JMP @A+DPTR .....JMPTAB: AJMP PROC1 AJMP PROC2 .... AJMP PROCN
MCS51 - przykłady programowania 5/9; Procedura zamieniająca liczbę binarną z akumulatora ; na pojedyncze cyfry BCD we wskazanym buforze. ; parametry: A = liczba;; R0 -> bufor na znaki;; wyniki: M(R0),M(R0+1),M(R0+2) = 3 cyfry BCD;; zmiany: A, R0:=R0+2;; długość: 21B; ; czas trwania: 25c.m.; wykorzystanie stosu: 3TOBCD: PUSH B ;przechowanie rej. B na stosie MOV B,#100 DIV AB ;A=cyfra setek MOV @R0,A ;cyfra do bufora INC R0 MOV A,B MOV B,#10 DIV AB ;A=cyfra dziesiątek, B=cyfra jedności MOV @R0,A ;umieszczenie cyfr w buforze INC R0 MOV @R0,B POP B ;odtworzenie rej. B RET
MCS51 - przykłady programowania 6/9; Procedura dodająca 2-bajtowe liczby w kodzie BCD ; Młodsze bajty liczb umieszczane są na niższych adresach. ; parametry: R0 -> liczba1;; R1 -> liczba2;; wyniki: M(R0),M(R0+1) = liczba1+liczba2;; zmiany: PSW, R1:=R1+1, R0:=R0+1;; dlugosc: 16B; ; czas trwania: 17c.m.; wykorzystanie stosu: 3DODBCD: PUSH ACC ;przechowanie rej. A na stosie MOV A,@R0 ;A:=mlodszy bajt liczby1 ADD A,@R1 ;dodanie mlodszego bajtu liczby2 DA A ;korekcja dziesietna MOV @R0,A ;mlodszy bajt wyniku INC R0 ;nastepne bajty liczb INC R1 MOV A,@R0 ;A:=starszy bajt liczby1 ADDC A,@R1 ;dodanie starszego bajtu liczby2 DA A ;korekcja dziesietna MOV @R0,A ;starszy bajt wyniku POP ACC ;odtworzenie rej. A RET ;CY=1 oznacza przepelnienie
MCS51 - przykłady programowania 7/9
Przypadek „bezpieczny”:
stan licznika T0: wykonany rozkaz:
8877h MOV R1,TH0
8878h
MOV R0,TL0
wartość w R1R0=8878h
Przypadek „krytyczny”:
stan licznika T0: wykonany rozkaz:
88FFh MOV R1,TH0
8900h
MOV R0,TL0
! błędna wartość w R1R0=8800h
; Fragment programu realizujący „odczyt w locie” stanu jednego z liczników. ; Przy takim odczycie konieczne jest zabezpieczenie się przed zmianą ; stanu licznika pomiędzy odczytem jego młodszego i starszego bajtu. ; Służy temu rozkaz CJNE. ..... MOV R1,TH0 ;R1:=starszy bajt licznika MOV R0,TL0 ;R0:=mlodszy bajt licznika MOV A,TH0 ;ponowny odczyt TH0 XRL A,R1 ;czy taki sam TH0 JZ RDOK ;skok jesli tak MOV R1,TH0 ;ponowne odczyty jesli nie MOV R0,TL0RDOK:
MCS51 - przykłady programowania 8/9
; Procedura konwersji cyfry szesnastkowej na kod wyświetlacza 7-segmentowego. ; Poszczególne segmenty są przyporządkowane bitom od najstarszego następująco:; hgfedcba. ; parametry: A = cyfra hex.;; wyniki: A = kod segmentowy;; zmiany: - ;; długość: 19B (łącznie z tablicą kodów);; czas trwania: 5c.m.; wykorzystanie stosu: 2HEXDISP: INC A ;dodanie przesunięcia tablicy kodów ;względem rozkazu RET MOVC A,@A+PC ;pobranie kodu wyświetlacza RETKODY: DEFB 00111111b,00000110b,01011011b,01001111b DEFB 01100110b,01101101b,01111101b,00000111b DEFB 01111111b,01101111b,00000001b,01000000b DEFB 00001000b,01010000b,01111001b,01110001b
MCS51 - przykłady programowania 9/9
; Procedura konwersji cyfry szesnastkowej na kod wyświetlacza 7-segmentowego. ; Poszczególne segmenty są przyporządkowane bitom od najstarszego następująco:; hgfedcba. ; parametry: A = cyfra hex.;; wyniki: A = kod segmentowy;; zmiany: - ;; długość: 19B (łącznie z tablicą kodów);; czas trwania: 5c.m.; wykorzystanie stosu: 2HEXDISP: MOV DPTR,#KODY ;DPTR->tablica kodów MOVC A,@A+DPTR ;pobranie kodu wyświetlacza RETKODY: DEFB 00111111b,00000110b,01011011b,01001111b DEFB 01100110b,01101101b,01111101b,00000111b DEFB 01111111b,01101111b,00000001b,01000000b DEFB 00001000b,01010000b,01111001b,01110001bWada:zaangażowanie DPTR, który mógłby być wykorzystywany do czego innego(ewentualnie więc: zapis na stos na początku PUSH DPH, PUSH DPL i odczyt ze stosu przed RET: POP DPL, POP DPH)