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.
Download ReportTranscript 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.
Slide 1
Mikrokontrolery MCS51
Slide 2
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
Slide 3
Wykład 1
1/38
Architektura MCS51
Przestrzenie adresowe
Tryby adresowania
Lista rozkazów
Slide 4
Historia
rodzina MCS48:
8048/49/50
8020/21/22
6MHz
8085
2/38
rodzina MCS51:
8051/52
12MHz
rodzina
MCS96
rodziny
MCS151
MCS251
Slide 5
Architektura MCS51
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ń.
3/38
Slide 6
Architektura MCS51
4/38
Struktura blokowa układu 8051
Vcc
GND
rej. adr.
RAM
P0.7 ... P0.0
128B
SRAM
P2.7 ... P2.0
rej. P0
4kB
ROM
rej. P2
rejestr adresu
programu
rej. B
Acc
SFR
TMP1
TMP2
ALU
PSW
PSEN
ALE
EA
RST
RR & DR
układ
sterowania
IP
IE
SP
PCON SCON SBUF
TH0
TL0 TCON
TH1
TL1 TMOD
system przerwań, port
SIO, 2 timery/liczniki
PC
inkrementer
rej. DPTR
rej. P1
rej. P3
gen.
taktu
XTAL1 XTAL2
PC
P1.7 ... P1.0
P3.7 ... P3.0
Slide 7
Architektura MCS51
5/38
Struktura blokowa układu 8052
Vcc
GND
rej. adr.
RAM
P0.7 ... P0.0
256B
SRAM
rej. B
rej. P0
TMP2
ALU
PSW
RR & DR
układ
sterowania
8kB
ROM
rej. P2
rejestr adresu
programu
SFR
Acc
TMP1
PSEN
ALE
EA
RST
P2.7 ... P2.0
IP
IE
SP
PCON SCON SBUF
TH0
TL0 TCON
TH1
TL1 TMOD
TH2
TL2 T2CON
RCAP2H RCAP2L
system przerwań, port
SIO, 3 timery/liczniki
PC
inkrementer
rej. DPTR
rej. P1
rej. P3
gen.
taktu
XTAL1 XTAL2
PC
P1.7 ... P1.0
P3.7 ... P3.0
Slide 8
Architektura MCS51
Standardowe obudowy układów 8051/52
6/38
Slide 9
Architektura MCS51
7/38
Przestrzenie adresowe układów MCS51
0FFh
0FFFFh
0FFFFh
opcjonalny
RAM
80h
7Fh
ROM
zewnętrzny
EA=0
ROMMAX
ROM zewn.
SFR
RAM
zewnętrzny
RAM
EA=1
ROM wewn.
0000h
0000h
adres startowy programu = 0000h
adresy = k*8+3 - wektory przerwań
RAM
wewnętrzny
30h
7Fh
78h 2Fh
bity bezpośr.
adresowalne
07h
00h 20h
bank 3
18h
bank 2
10h
bank 1
08h
bank 0
00h
Slide 10
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:
00h:
01h:
02h:
03h:
04h:
05h:
06h:
07h:
bank00
R0
R1
R2
R3
R4
R5
R6
R7
08h:
09h:
0Ah:
0Bh:
0Ch:
0Dh:
0Eh:
0Fh:
bank01
R0
R1
R2
R3
R4
R5
R6
R7
10h:
11h:
12h:
13h:
14h:
15h:
16h:
17h:
bank10
R0
R1
R2
R3
R4
R5
R6
R7
18h:
19h:
1Ah:
1Bh:
1Ch:
1Dh:
1Eh:
1Fh:
bank11
R0
R1
R2
R3
R4
R5
R6
R7
Numer aktualnie aktywnego banku rejestrów wskazują bity RS1, RS0 w PSW.
Typowym zastosowaniem banków rejestrów jest obsługa przerwań.
Slide 11
Architektura MCS51 - bity bezpośrednio adresowalne
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).
9/38
Slide 12
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;
IP
nazwa
rejestru
...
bit nie
zaimplementowany
-
PT2 BD
PS BC
kursywa dodatkowy obiekt
w 8052
nazwa
bitu
...
B8h
adres bitu
bezpośrednio
adresowalnego
adres rejestru
w bloku SFR
Slide 13
Architektura MCS51 - SFR
11/38
B
B.7 F7
B.6 F6
B.5 F5
B.4 F4
B.3 F3
B.2 F2
B.1 F1
B.0 F0 F0h
A
A.7 E7
A.6 E6
A.5 E5
A.4 E4
A.3 E3
A.2 E2
A.1 E1
A.0 E0 E0h
PSW
CY D7 AC
D6
F0
D5
RS1 D4 RS0 D3 OV
D2
-
D1
P
D0
D0h
TH2
TL2
RCAP2H
RCAP2L
CDh
CCh
CBh
CAh
T2CON
TF2 CF EXF2CE RCLKCD TCLKCC EXEN2CB TR2 CA C/T2 C9 CP/RL2C8 C8h
IP
P3
IE
P2
-
BF
-
BE
PT2 BD
PS BC PT1 BB PX1 BA PT0 B9 PX0 B8 B8h
P3.7 B7 P3.6 B6 P3.5 B5 P3.4 B4 P3.3 B3 P3.2 B2 P3.1 B1 P3.0 B0 B0h
EA AF
-
AE
ET2 AD
ES AC ET1 AB EX1 AA ET0 A9 EX0 A8 A8h
P2.7 A7 P2.6 A6 P2.5 A5 P2.4 A4 P2.3 A3 P2.2 A2 P2.1 A1 P2.0 A0 A0h
Slide 14
Architektura MCS51 - SFR
SBUF
SCON
SM0 9F SM1 9E SM2 9D REN 9C TB8 9B RB8 9A
12/38
TI
99
RI
98
99h
98h
P1
P1.7 97 P1.6 96 P1.5 95 P1.4 94 P1.3 93 P1.2 92 P1.1 91 P1.0 90 90h
TH1
TH0
TL1
TL0
8Dh
8Ch
8Bh
8Ah
TMOD GATE
C/T
M1
M0
GATE
C/T
TCON TF1 8F TR1 8E TF0 8D TR0 8C IE1 8B IT1 8A
PCON SMOD
GF1
GF0
DPH
DPL
SP
P0
M1
IE0 89
PD
M0
IT0
IDL
88
P0.7 87 P0.6 86 P0.5 85 P0.4 84 P0.3 83 P0.2 82 P0.1 81 P0.0 80
89h
88h
87h
83h
82h
81h
80h
Slide 15
Architektura MCS51 - SFR - PSW
PSW
CY D7 AC
D6
F0
D5
RS1 D4 RS0 D3 OV
13/38
D2
-
D1
P
D0
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
aktywny bank
0
1
2
11
3
Brak flagi zera! Rozkazy skoków warunkowych JZ, JNZ bezpośrednio testują
stan akumulatora.
Slide 16
Architektura MCS51 - SFR - A, B
A
A.7 E7
A.6 E6
A.5 E5
A.4 E4
14/38
A.3 E3
A.2 E2
A.1 E1
A.0 E0 E0h
Wykorzystywany w większości operacji ALU.
Jego bity są bezpośrednio adresowalne.
Pośredniczy przy odwołaniach do zewnętrznej pamięci danych.
B
B.7 F7
B.6 F6
B.5 F5
B.4 F4
B.3 F3
B.2 F2
B.1 F1
B.0 F0 F0h
Pomocniczy rejestr roboczy.
Wykorzystywany przy rozkazach mnożenia i dzielenia pojedynczych bajtów.
Jego bity są bezpośrednio adresowalne.
Slide 17
Architektura MCS51 - SFR - SP i stos
15/38
SP
81h
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.
RAM
2Bh
A:
2Bh
11h
SP:
59h
58h
5Ah:
59h:
58h:
57h:
x
2Bh
x
0Dh
34h
PUSH
POP
stos
stos
B:
B
A
Slide 18
Funkcjonowanie MCS51 - tryby adresowania
16/38
Tryby adresowania operandów - bajtów
• natychmiastowy
kod rozkazu
mov
• rejestrowy
• bezpośredni
r6,#130
kod rozkazu
mov
operand
Rx:
operand
a,r6
RAM
wewn.
kod rozkazu
inc
20h
adres
Slide 19
Funkcjonowanie MCS51 - tryby adresowania
• rejestrowy pośredni
R0/R1:
adres8b
kod rozkazu
mov
movx
RAM
zewn
adres16b
movx
RAM
wewn/zewn
b,@r0
@r1,a
DPTR:
kod rozkazu
17/38
a,@dptr
Slide 20
Funkcjonowanie MCS51 - tryby adresowania
18/38
• adresowanie indeksowo-względne
PC/DPTR:
baza
ROM
kod rozkazu
A:
movc
movc
d
a,@a+dptr
a,@a+pc
Tryb adresowania operandów - bitów
• bezpośredni
kod rozkazu
mov
c,20h
RAM
wewn.
adres
Slide 21
Funkcjonowanie MCS51 - tryby adresowania
19/38
Dostępność trybów adresowania
0FFh
0FFFFh
0FFFFh
opcjonalny
RAM
80h
7Fh
ROM
zewnętrzny
EA=0
ROMMAX
ROM zewn.
SFR
RAM
zewnętrzny
(XRAM)
RAM
EA=1
ROM wewn.
0000h
0000h
RAM
wewnętrzny
rejestrowy pośredni z DPTR
rejestrowy pośredni RAMw
rejestrowy pośredni z R0/R1
bezpośredni RAM
indeksowo-względny
rejestrowy
bezpośredni-bitów
30h
7Fh
78h 2Fh
bity bezpośr.
adresowalne
07h
00h 20h
bank 3
18h
bank 2
10h
bank 1
08h
bank 0
00h
Slide 22
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
CY
x
d8=dana natychmiastowa 1B
A = 29
00011101
R 0 = 71
przed
add
0
01100100
A = 100
po
AC
P
OV
01000111
x
0
x
01000111
1
1
0
a,r0
Slide 23
Lista rozkazów MCS51
ADDC A,Rr
A:=A+Rr+CY
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
0
R1 = 30
01100100
p rzed
ad d c
0
21/38
10000010
A = -1 2 6
po
00011110
AC P OV
1
1
0
Rr, dir, Rj, d8 – jak dla ADD
CY
A = 100
1
01100100
p rzed
ad d c
a,r1
00011110
R1 = 30
1
0
1
0
10000011
A = -1 2 5
po
00011110
AC P OV
1
1
0
1
1
1
a,r1
00011110
Slide 24
Lista rozkazów MCS51
SUBB A,Rr
A:=A-Rr-CY
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
1
10000011
subb
1
22/38
przed
AC
P
OV
1
1
1
Rr, dir, Rj, d8 – jak dla ADD
CY
0
a,#-10 ; (-125)-(-10)-1
10001100
A = -116
po
1
1
0
0
A = 125
AC
P
OV
1
0
1
1
0
01111101
przed
subb
; (125)-(15)-0
a,#15
01101110
A = 110
po
1
Slide 25
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
DIV
A:=A/B, B:=A mod B
AB
CY
A = 100
x
01100100
iloczyn bez znaku
B = 30
przed
AC
P
OV
00011110
x
1
x
00001011
0
0
1
m ul ab
0
10111000
B A = 3000
po
Slide 26
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
10000011
anl
P
OV CY
x
1
x
x
x
0
x
x
a,#0Fh ;
00000011
A = 03h
przed
AC
po
Slide 27
Lista rozkazów MCS51
25/38
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
A = 83h
10000011
o rl
przed
AC
P
OV CY
x
1
x
x
x
0
x
x
a,#23h ;
10100011
A = 0A 3h
po
Slide 28
Lista rozkazów MCS51
26/38
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
A = 83h
10000011
xrl
P
OV CY
x
1
x
x
x
1
x
x
a,#0Fh ;
10001100
A = 8C h
przed
AC
po
Slide 29
Lista rozkazów MCS51
27/38
;zadanie: generacja fal prostokątnych w przeciwfazach na liniach P1.0 i P1.1
mov
powt1: xrl
cykle
masz.
P1,#0FEh
rozkazy
P1,#03h
XRL
SJMP
XRL
SJMP
XRL
SJMP
P1.1
sjmp
powt1
mov
P1,#0FEh
P1.0
cykle
masz.
powt2: cpl
P1.0
cpl
P1.1
P1.1
sjmp
powt2
P1.0
rozkazy CPLCPL SJMP CPLCPL SJMP CPLCPL SJMP
CLR
A
A:=0
CPL
A
A:=not A
Slide 30
Lista rozkazów MCS51
28/38
3. Rozkazy obrotów
RL
A
RLC A
RR
CY
A
RRC A
SWAP A
CY
A7..4 A3..0
7
A
0
7
A
0
7
A
0
7
A
0
7 6 5 4 3 2 1 0
Slide 31
Lista rozkazów MCS51
29/38
4. Rozkazy operacji bitowych
CLR
C
CY:=0
CLR
bit
bit:=0
CPL
C
CY:= ~CY
CPL
bit
bit:= ~bit
bit - bit bezpośrednio adresowalny
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
Slide 32
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
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]
d8=dana natychmiastowa 1B
dird,dirs = dir
Slide 33
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
m ov r1,#85h
m ov B ,@ r1
RAM w
86h:
85h:
m ov r0,#86h
m ov @ r0,A
A
B
7D h:
m ov T L0,79h
T L0
m ov 79h,7D h
m ov 78h,S B U F
79h:
78h:
SBUF
Slide 34
Lista rozkazów MCS51
MOV
DPTR,#d16
32/38
DPTR d16
d16=dana natychmiastowa 2B
MOVC A,@A+DPTR A ROM[DPTR+A]
MOVC A,@A+PC
A ROM[DPTR+A]
ROM
201h:
203h:
206h:
207h:
208h:
A
20Ah:
2)
1)
210h:
212h:
74
02
90
02
10
93
83
71
00
0A
:
:
10
11
02
mov
a,#2
mov
dptr,#dane
movc a,@a+dptr ;1)
movc a,@a+pc ;2)
ajmp 300h
db
org
dane: db
10
210h
16,17,2
Slide 35
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
mov r0,#80h
mov p2,#0
movx @r0,a
XRAM
0080h:
mov dptr,#80h
movx a,@dptr
A
A
mov dptr,#1090h
movx @dptr,a
1090h:
mov r1,#90h
mov p2,#10h
movx a,@r1
Slide 36
Lista rozkazów MCS51
34/38
XCH
A,Rr
A Rr
XCH
A,dir
A RAM[dir]
XCH
A,@Rj
A RAMw[Rj]
m o v r1,#40h
xchd a,@ r1
xch a,r3
A
R3
RAM w
40h:
A
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
Slide 37
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
JMP
@A+DPTR PC:=DPTR+A, A=0..255
a16-adres pełny
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
JMP
@A+DPTR
....
jmptab: AJMP proc0
AJMP proc1
....
AJMP prock
....
;DPTR tablica z adresami skoków
Slide 38
Lista rozkazów MCS51
36/38
SJMP r8
PC:=PC+r8
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
DJNZ arg,r8
r8:= -128..127
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
arg := arg-1
arg = Rr, dir
if arg 0 then PC:=PC+r8
Slide 39
Lista rozkazów MCS51
37/38
7. Rozkazy wywołań procedur i powrotów
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ń
Slide 40
Lista rozkazów MCS51
38/38
8. Wpływ rozkazów na PSW
typ ro zk azu
CY AC OV
z
z
z
ADD
ADDC
A ,...
A ,...
z
z
z
SU BB
A ,...
z
z
z
MUL
D IV
DA
RRC
R LC
C JN E
C LR
C PL
SETB
ANL
ORL
MOV
AB
AB
A
A
A
a rg 1 ,a rg 2
C
C
C
C ,...
C ,...
C ,...
0
0
z
z
z
0
z
1
z
z
z
z
z
P
k o m entarz
z k ażd y ro zk az trak tujący P S W jak o b ajt p am ięci lub b ity b ezp . ad reso w alne
z k ażd y ro zk az zm ieniający stan A
z C Y - p rzy d o d aw aniu N B sygnalizuje nad m iar
O V - ustaw iania gd y jest p rzeniesienie z b itu 7 a nie m a z b itu 6 lub
o d w ro tnie, zero w ana w p o zo sta łych p rzyp ad k ach,
p rzy d o d aw aniu U 2 sygnalizuje nad m iar
z C Y - w ym agana p o życzk a d la b itu 7
O V - ustaw iana gd y jest p o życzk a d la b itu 7 a nie m a d la b itu 6 lub
o d w ro tnie, zero w ana w p o zo sta łych p rzyp ad k ach,
p rzy o d ejm o w aniu U 2 sygnalizuje nad m iar
z O V - ustaw iana gd y ilo czyn > 2 5 5
z O V - ustaw iana gd y d zielenie p rzez 0
z
z
C Y := 1 gd y a rg 1 < a rg 2
C Y := 0
C Y := no t C Y
C Y := 1
zgo d nie z w ynik iem o p eracji
zgo d nie z w ynik iem o p eracji
zgo d nie z w ynik iem o p eracji
Slide 41
MCS51 - przykłady programowania
; 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: 3
TOASCII: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 znaku
TA2:
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 znaku
TA4:
MOV
@R1,A
;znak do bufora
INC
R1
;nastepna pozycja w buforze
POP
B
;odtworzenie rej. B
RET
1/9
Slide 42
MCS51 - przykłady programowania
; 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: 4
DELAY: PUSH ACC
;przechowanie A i B na stosie
PUSH B
DELAY1: 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
2/9
Slide 43
MCS51 - przykłady programowania
; 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: 2
DELAY: 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
3/9
Slide 44
MCS51 - przykłady programowania
; 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
4/9
Slide 45
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: 3
TOBCD: 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
Slide 46
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: 3
DODBCD: 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
Slide 47
MCS51 - przykłady programowania
7/9
; 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,TL0
RDOK:
Przypadek „bezpieczny”:
Przypadek „krytyczny”:
stan licznika T0:
wykonany rozkaz:
stan licznika T0:
wykonany rozkaz:
8877h
MOV R1,TH0
88FFh
MOV R1,TH0
8878h
8900h
MOV R0,TL0
wartość w R1R0=8878h
MOV R0,TL0
! błędna wartość w R1R0=8800h
Slide 48
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:
2
HEXDISP: INC
A
;dodanie przesunięcia tablicy kodów
;względem rozkazu RET
MOVC A,@A+PC ;pobranie kodu wyświetlacza
RET
KODY:
DEFB 00111111b,00000110b,01011011b,01001111b
DEFB 01100110b,01101101b,01111101b,00000111b
DEFB 01111111b,01101111b,00000001b,01000000b
DEFB 00001000b,01010000b,01111001b,01110001b
Slide 49
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:
2
HEXDISP: MOV DPTR,#KODY
;DPTR->tablica kodów
MOVC A,@A+DPTR ;pobranie kodu wyświetlacza
RET
KODY:
DEFB 00111111b,00000110b,01011011b,01001111b
DEFB 01100110b,01101101b,01111101b,00000111b
DEFB 01111111b,01101111b,00000001b,01000000b
DEFB 00001000b,01010000b,01111001b,01110001b
Wada:
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)
Mikrokontrolery MCS51
Slide 2
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
Slide 3
Wykład 1
1/38
Architektura MCS51
Przestrzenie adresowe
Tryby adresowania
Lista rozkazów
Slide 4
Historia
rodzina MCS48:
8048/49/50
8020/21/22
6MHz
8085
2/38
rodzina MCS51:
8051/52
12MHz
rodzina
MCS96
rodziny
MCS151
MCS251
Slide 5
Architektura MCS51
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ń.
3/38
Slide 6
Architektura MCS51
4/38
Struktura blokowa układu 8051
Vcc
GND
rej. adr.
RAM
P0.7 ... P0.0
128B
SRAM
P2.7 ... P2.0
rej. P0
4kB
ROM
rej. P2
rejestr adresu
programu
rej. B
Acc
SFR
TMP1
TMP2
ALU
PSW
PSEN
ALE
EA
RST
RR & DR
układ
sterowania
IP
IE
SP
PCON SCON SBUF
TH0
TL0 TCON
TH1
TL1 TMOD
system przerwań, port
SIO, 2 timery/liczniki
PC
inkrementer
rej. DPTR
rej. P1
rej. P3
gen.
taktu
XTAL1 XTAL2
PC
P1.7 ... P1.0
P3.7 ... P3.0
Slide 7
Architektura MCS51
5/38
Struktura blokowa układu 8052
Vcc
GND
rej. adr.
RAM
P0.7 ... P0.0
256B
SRAM
rej. B
rej. P0
TMP2
ALU
PSW
RR & DR
układ
sterowania
8kB
ROM
rej. P2
rejestr adresu
programu
SFR
Acc
TMP1
PSEN
ALE
EA
RST
P2.7 ... P2.0
IP
IE
SP
PCON SCON SBUF
TH0
TL0 TCON
TH1
TL1 TMOD
TH2
TL2 T2CON
RCAP2H RCAP2L
system przerwań, port
SIO, 3 timery/liczniki
PC
inkrementer
rej. DPTR
rej. P1
rej. P3
gen.
taktu
XTAL1 XTAL2
PC
P1.7 ... P1.0
P3.7 ... P3.0
Slide 8
Architektura MCS51
Standardowe obudowy układów 8051/52
6/38
Slide 9
Architektura MCS51
7/38
Przestrzenie adresowe układów MCS51
0FFh
0FFFFh
0FFFFh
opcjonalny
RAM
80h
7Fh
ROM
zewnętrzny
EA=0
ROMMAX
ROM zewn.
SFR
RAM
zewnętrzny
RAM
EA=1
ROM wewn.
0000h
0000h
adres startowy programu = 0000h
adresy = k*8+3 - wektory przerwań
RAM
wewnętrzny
30h
7Fh
78h 2Fh
bity bezpośr.
adresowalne
07h
00h 20h
bank 3
18h
bank 2
10h
bank 1
08h
bank 0
00h
Slide 10
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:
00h:
01h:
02h:
03h:
04h:
05h:
06h:
07h:
bank00
R0
R1
R2
R3
R4
R5
R6
R7
08h:
09h:
0Ah:
0Bh:
0Ch:
0Dh:
0Eh:
0Fh:
bank01
R0
R1
R2
R3
R4
R5
R6
R7
10h:
11h:
12h:
13h:
14h:
15h:
16h:
17h:
bank10
R0
R1
R2
R3
R4
R5
R6
R7
18h:
19h:
1Ah:
1Bh:
1Ch:
1Dh:
1Eh:
1Fh:
bank11
R0
R1
R2
R3
R4
R5
R6
R7
Numer aktualnie aktywnego banku rejestrów wskazują bity RS1, RS0 w PSW.
Typowym zastosowaniem banków rejestrów jest obsługa przerwań.
Slide 11
Architektura MCS51 - bity bezpośrednio adresowalne
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).
9/38
Slide 12
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;
IP
nazwa
rejestru
...
bit nie
zaimplementowany
-
PT2 BD
PS BC
kursywa dodatkowy obiekt
w 8052
nazwa
bitu
...
B8h
adres bitu
bezpośrednio
adresowalnego
adres rejestru
w bloku SFR
Slide 13
Architektura MCS51 - SFR
11/38
B
B.7 F7
B.6 F6
B.5 F5
B.4 F4
B.3 F3
B.2 F2
B.1 F1
B.0 F0 F0h
A
A.7 E7
A.6 E6
A.5 E5
A.4 E4
A.3 E3
A.2 E2
A.1 E1
A.0 E0 E0h
PSW
CY D7 AC
D6
F0
D5
RS1 D4 RS0 D3 OV
D2
-
D1
P
D0
D0h
TH2
TL2
RCAP2H
RCAP2L
CDh
CCh
CBh
CAh
T2CON
TF2 CF EXF2CE RCLKCD TCLKCC EXEN2CB TR2 CA C/T2 C9 CP/RL2C8 C8h
IP
P3
IE
P2
-
BF
-
BE
PT2 BD
PS BC PT1 BB PX1 BA PT0 B9 PX0 B8 B8h
P3.7 B7 P3.6 B6 P3.5 B5 P3.4 B4 P3.3 B3 P3.2 B2 P3.1 B1 P3.0 B0 B0h
EA AF
-
AE
ET2 AD
ES AC ET1 AB EX1 AA ET0 A9 EX0 A8 A8h
P2.7 A7 P2.6 A6 P2.5 A5 P2.4 A4 P2.3 A3 P2.2 A2 P2.1 A1 P2.0 A0 A0h
Slide 14
Architektura MCS51 - SFR
SBUF
SCON
SM0 9F SM1 9E SM2 9D REN 9C TB8 9B RB8 9A
12/38
TI
99
RI
98
99h
98h
P1
P1.7 97 P1.6 96 P1.5 95 P1.4 94 P1.3 93 P1.2 92 P1.1 91 P1.0 90 90h
TH1
TH0
TL1
TL0
8Dh
8Ch
8Bh
8Ah
TMOD GATE
C/T
M1
M0
GATE
C/T
TCON TF1 8F TR1 8E TF0 8D TR0 8C IE1 8B IT1 8A
PCON SMOD
GF1
GF0
DPH
DPL
SP
P0
M1
IE0 89
PD
M0
IT0
IDL
88
P0.7 87 P0.6 86 P0.5 85 P0.4 84 P0.3 83 P0.2 82 P0.1 81 P0.0 80
89h
88h
87h
83h
82h
81h
80h
Slide 15
Architektura MCS51 - SFR - PSW
PSW
CY D7 AC
D6
F0
D5
RS1 D4 RS0 D3 OV
13/38
D2
-
D1
P
D0
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
aktywny bank
0
1
2
11
3
Brak flagi zera! Rozkazy skoków warunkowych JZ, JNZ bezpośrednio testują
stan akumulatora.
Slide 16
Architektura MCS51 - SFR - A, B
A
A.7 E7
A.6 E6
A.5 E5
A.4 E4
14/38
A.3 E3
A.2 E2
A.1 E1
A.0 E0 E0h
Wykorzystywany w większości operacji ALU.
Jego bity są bezpośrednio adresowalne.
Pośredniczy przy odwołaniach do zewnętrznej pamięci danych.
B
B.7 F7
B.6 F6
B.5 F5
B.4 F4
B.3 F3
B.2 F2
B.1 F1
B.0 F0 F0h
Pomocniczy rejestr roboczy.
Wykorzystywany przy rozkazach mnożenia i dzielenia pojedynczych bajtów.
Jego bity są bezpośrednio adresowalne.
Slide 17
Architektura MCS51 - SFR - SP i stos
15/38
SP
81h
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.
RAM
2Bh
A:
2Bh
11h
SP:
59h
58h
5Ah:
59h:
58h:
57h:
x
2Bh
x
0Dh
34h
PUSH
POP
stos
stos
B:
B
A
Slide 18
Funkcjonowanie MCS51 - tryby adresowania
16/38
Tryby adresowania operandów - bajtów
• natychmiastowy
kod rozkazu
mov
• rejestrowy
• bezpośredni
r6,#130
kod rozkazu
mov
operand
Rx:
operand
a,r6
RAM
wewn.
kod rozkazu
inc
20h
adres
Slide 19
Funkcjonowanie MCS51 - tryby adresowania
• rejestrowy pośredni
R0/R1:
adres8b
kod rozkazu
mov
movx
RAM
zewn
adres16b
movx
RAM
wewn/zewn
b,@r0
@r1,a
DPTR:
kod rozkazu
17/38
a,@dptr
Slide 20
Funkcjonowanie MCS51 - tryby adresowania
18/38
• adresowanie indeksowo-względne
PC/DPTR:
baza
ROM
kod rozkazu
A:
movc
movc
d
a,@a+dptr
a,@a+pc
Tryb adresowania operandów - bitów
• bezpośredni
kod rozkazu
mov
c,20h
RAM
wewn.
adres
Slide 21
Funkcjonowanie MCS51 - tryby adresowania
19/38
Dostępność trybów adresowania
0FFh
0FFFFh
0FFFFh
opcjonalny
RAM
80h
7Fh
ROM
zewnętrzny
EA=0
ROMMAX
ROM zewn.
SFR
RAM
zewnętrzny
(XRAM)
RAM
EA=1
ROM wewn.
0000h
0000h
RAM
wewnętrzny
rejestrowy pośredni z DPTR
rejestrowy pośredni RAMw
rejestrowy pośredni z R0/R1
bezpośredni RAM
indeksowo-względny
rejestrowy
bezpośredni-bitów
30h
7Fh
78h 2Fh
bity bezpośr.
adresowalne
07h
00h 20h
bank 3
18h
bank 2
10h
bank 1
08h
bank 0
00h
Slide 22
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
CY
x
d8=dana natychmiastowa 1B
A = 29
00011101
R 0 = 71
przed
add
0
01100100
A = 100
po
AC
P
OV
01000111
x
0
x
01000111
1
1
0
a,r0
Slide 23
Lista rozkazów MCS51
ADDC A,Rr
A:=A+Rr+CY
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
0
R1 = 30
01100100
p rzed
ad d c
0
21/38
10000010
A = -1 2 6
po
00011110
AC P OV
1
1
0
Rr, dir, Rj, d8 – jak dla ADD
CY
A = 100
1
01100100
p rzed
ad d c
a,r1
00011110
R1 = 30
1
0
1
0
10000011
A = -1 2 5
po
00011110
AC P OV
1
1
0
1
1
1
a,r1
00011110
Slide 24
Lista rozkazów MCS51
SUBB A,Rr
A:=A-Rr-CY
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
1
10000011
subb
1
22/38
przed
AC
P
OV
1
1
1
Rr, dir, Rj, d8 – jak dla ADD
CY
0
a,#-10 ; (-125)-(-10)-1
10001100
A = -116
po
1
1
0
0
A = 125
AC
P
OV
1
0
1
1
0
01111101
przed
subb
; (125)-(15)-0
a,#15
01101110
A = 110
po
1
Slide 25
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
DIV
A:=A/B, B:=A mod B
AB
CY
A = 100
x
01100100
iloczyn bez znaku
B = 30
przed
AC
P
OV
00011110
x
1
x
00001011
0
0
1
m ul ab
0
10111000
B A = 3000
po
Slide 26
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
10000011
anl
P
OV CY
x
1
x
x
x
0
x
x
a,#0Fh ;
00000011
A = 03h
przed
AC
po
Slide 27
Lista rozkazów MCS51
25/38
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
A = 83h
10000011
o rl
przed
AC
P
OV CY
x
1
x
x
x
0
x
x
a,#23h ;
10100011
A = 0A 3h
po
Slide 28
Lista rozkazów MCS51
26/38
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
A = 83h
10000011
xrl
P
OV CY
x
1
x
x
x
1
x
x
a,#0Fh ;
10001100
A = 8C h
przed
AC
po
Slide 29
Lista rozkazów MCS51
27/38
;zadanie: generacja fal prostokątnych w przeciwfazach na liniach P1.0 i P1.1
mov
powt1: xrl
cykle
masz.
P1,#0FEh
rozkazy
P1,#03h
XRL
SJMP
XRL
SJMP
XRL
SJMP
P1.1
sjmp
powt1
mov
P1,#0FEh
P1.0
cykle
masz.
powt2: cpl
P1.0
cpl
P1.1
P1.1
sjmp
powt2
P1.0
rozkazy CPLCPL SJMP CPLCPL SJMP CPLCPL SJMP
CLR
A
A:=0
CPL
A
A:=not A
Slide 30
Lista rozkazów MCS51
28/38
3. Rozkazy obrotów
RL
A
RLC A
RR
CY
A
RRC A
SWAP A
CY
A7..4 A3..0
7
A
0
7
A
0
7
A
0
7
A
0
7 6 5 4 3 2 1 0
Slide 31
Lista rozkazów MCS51
29/38
4. Rozkazy operacji bitowych
CLR
C
CY:=0
CLR
bit
bit:=0
CPL
C
CY:= ~CY
CPL
bit
bit:= ~bit
bit - bit bezpośrednio adresowalny
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
Slide 32
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
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]
d8=dana natychmiastowa 1B
dird,dirs = dir
Slide 33
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
m ov r1,#85h
m ov B ,@ r1
RAM w
86h:
85h:
m ov r0,#86h
m ov @ r0,A
A
B
7D h:
m ov T L0,79h
T L0
m ov 79h,7D h
m ov 78h,S B U F
79h:
78h:
SBUF
Slide 34
Lista rozkazów MCS51
MOV
DPTR,#d16
32/38
DPTR d16
d16=dana natychmiastowa 2B
MOVC A,@A+DPTR A ROM[DPTR+A]
MOVC A,@A+PC
A ROM[DPTR+A]
ROM
201h:
203h:
206h:
207h:
208h:
A
20Ah:
2)
1)
210h:
212h:
74
02
90
02
10
93
83
71
00
0A
:
:
10
11
02
mov
a,#2
mov
dptr,#dane
movc a,@a+dptr ;1)
movc a,@a+pc ;2)
ajmp 300h
db
org
dane: db
10
210h
16,17,2
Slide 35
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
mov r0,#80h
mov p2,#0
movx @r0,a
XRAM
0080h:
mov dptr,#80h
movx a,@dptr
A
A
mov dptr,#1090h
movx @dptr,a
1090h:
mov r1,#90h
mov p2,#10h
movx a,@r1
Slide 36
Lista rozkazów MCS51
34/38
XCH
A,Rr
A Rr
XCH
A,dir
A RAM[dir]
XCH
A,@Rj
A RAMw[Rj]
m o v r1,#40h
xchd a,@ r1
xch a,r3
A
R3
RAM w
40h:
A
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
Slide 37
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
JMP
@A+DPTR PC:=DPTR+A, A=0..255
a16-adres pełny
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
JMP
@A+DPTR
....
jmptab: AJMP proc0
AJMP proc1
....
AJMP prock
....
;DPTR tablica z adresami skoków
Slide 38
Lista rozkazów MCS51
36/38
SJMP r8
PC:=PC+r8
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
DJNZ arg,r8
r8:= -128..127
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
arg := arg-1
arg = Rr, dir
if arg 0 then PC:=PC+r8
Slide 39
Lista rozkazów MCS51
37/38
7. Rozkazy wywołań procedur i powrotów
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ń
Slide 40
Lista rozkazów MCS51
38/38
8. Wpływ rozkazów na PSW
typ ro zk azu
CY AC OV
z
z
z
ADD
ADDC
A ,...
A ,...
z
z
z
SU BB
A ,...
z
z
z
MUL
D IV
DA
RRC
R LC
C JN E
C LR
C PL
SETB
ANL
ORL
MOV
AB
AB
A
A
A
a rg 1 ,a rg 2
C
C
C
C ,...
C ,...
C ,...
0
0
z
z
z
0
z
1
z
z
z
z
z
P
k o m entarz
z k ażd y ro zk az trak tujący P S W jak o b ajt p am ięci lub b ity b ezp . ad reso w alne
z k ażd y ro zk az zm ieniający stan A
z C Y - p rzy d o d aw aniu N B sygnalizuje nad m iar
O V - ustaw iania gd y jest p rzeniesienie z b itu 7 a nie m a z b itu 6 lub
o d w ro tnie, zero w ana w p o zo sta łych p rzyp ad k ach,
p rzy d o d aw aniu U 2 sygnalizuje nad m iar
z C Y - w ym agana p o życzk a d la b itu 7
O V - ustaw iana gd y jest p o życzk a d la b itu 7 a nie m a d la b itu 6 lub
o d w ro tnie, zero w ana w p o zo sta łych p rzyp ad k ach,
p rzy o d ejm o w aniu U 2 sygnalizuje nad m iar
z O V - ustaw iana gd y ilo czyn > 2 5 5
z O V - ustaw iana gd y d zielenie p rzez 0
z
z
C Y := 1 gd y a rg 1 < a rg 2
C Y := 0
C Y := no t C Y
C Y := 1
zgo d nie z w ynik iem o p eracji
zgo d nie z w ynik iem o p eracji
zgo d nie z w ynik iem o p eracji
Slide 41
MCS51 - przykłady programowania
; 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: 3
TOASCII: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 znaku
TA2:
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 znaku
TA4:
MOV
@R1,A
;znak do bufora
INC
R1
;nastepna pozycja w buforze
POP
B
;odtworzenie rej. B
RET
1/9
Slide 42
MCS51 - przykłady programowania
; 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: 4
DELAY: PUSH ACC
;przechowanie A i B na stosie
PUSH B
DELAY1: 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
2/9
Slide 43
MCS51 - przykłady programowania
; 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: 2
DELAY: 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
3/9
Slide 44
MCS51 - przykłady programowania
; 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
4/9
Slide 45
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: 3
TOBCD: 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
Slide 46
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: 3
DODBCD: 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
Slide 47
MCS51 - przykłady programowania
7/9
; 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,TL0
RDOK:
Przypadek „bezpieczny”:
Przypadek „krytyczny”:
stan licznika T0:
wykonany rozkaz:
stan licznika T0:
wykonany rozkaz:
8877h
MOV R1,TH0
88FFh
MOV R1,TH0
8878h
8900h
MOV R0,TL0
wartość w R1R0=8878h
MOV R0,TL0
! błędna wartość w R1R0=8800h
Slide 48
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:
2
HEXDISP: INC
A
;dodanie przesunięcia tablicy kodów
;względem rozkazu RET
MOVC A,@A+PC ;pobranie kodu wyświetlacza
RET
KODY:
DEFB 00111111b,00000110b,01011011b,01001111b
DEFB 01100110b,01101101b,01111101b,00000111b
DEFB 01111111b,01101111b,00000001b,01000000b
DEFB 00001000b,01010000b,01111001b,01110001b
Slide 49
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:
2
HEXDISP: MOV DPTR,#KODY
;DPTR->tablica kodów
MOVC A,@A+DPTR ;pobranie kodu wyświetlacza
RET
KODY:
DEFB 00111111b,00000110b,01011011b,01001111b
DEFB 01100110b,01101101b,01111101b,00000111b
DEFB 01111111b,01101111b,00000001b,01000000b
DEFB 00001000b,01010000b,01111001b,01110001b
Wada:
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)