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 Report

Transcript 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..0a11 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 A0 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)