49
Mikrokontrolery MCS51

Mikrokontrolery MCS51

  • Upload
    idana

  • View
    59

  • Download
    2

Embed Size (px)

DESCRIPTION

Mikrokontrolery MCS51. Literatura . - PowerPoint PPT Presentation

Citation preview

Page 1: Mikrokontrolery  MCS51

Mikrokontrolery MCS51

Page 2: 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

Page 3: Mikrokontrolery  MCS51

Wykład 1 1/38

Architektura MCS51

Przestrzenie adresowe

Tryby adresowania

Lista rozkazów

Page 4: Mikrokontrolery  MCS51

Historia 2/38

1980

1990

rodzina MCS48:8048/49/508020/21/22

6MHz

1983

rodzina MCS51:8051/5212MHz

1976

8085rodzina MCS96

rodziny MCS151 MCS251

Page 5: Mikrokontrolery  MCS51

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ń.

Page 6: Mikrokontrolery  MCS51

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

Page 7: Mikrokontrolery  MCS51

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

Page 8: Mikrokontrolery  MCS51

Architektura MCS51 6/38

Standardowe obudowy układów 8051/52

Page 9: Mikrokontrolery  MCS51

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ń

Page 10: Mikrokontrolery  MCS51

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ń.

Page 11: Mikrokontrolery  MCS51

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).

Page 12: Mikrokontrolery  MCS51

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

Page 13: Mikrokontrolery  MCS51

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

Page 14: Mikrokontrolery  MCS51

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

Page 15: Mikrokontrolery  MCS51

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.

Page 16: Mikrokontrolery  MCS51

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.

Page 17: Mikrokontrolery  MCS51

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

Page 18: Mikrokontrolery  MCS51

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

Page 19: Mikrokontrolery  MCS51

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

Page 20: Mikrokontrolery  MCS51

• 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

Page 21: Mikrokontrolery  MCS51

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

Page 22: Mikrokontrolery  MCS51

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

Page 23: Mikrokontrolery  MCS51

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

Page 24: Mikrokontrolery  MCS51

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

Page 25: Mikrokontrolery  MCS51

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

Page 26: Mikrokontrolery  MCS51

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

Page 27: Mikrokontrolery  MCS51

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

Page 28: Mikrokontrolery  MCS51

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

Page 29: Mikrokontrolery  MCS51

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

Page 30: Mikrokontrolery  MCS51

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

Page 31: Mikrokontrolery  MCS51

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

Page 32: Mikrokontrolery  MCS51

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

Page 33: Mikrokontrolery  MCS51

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

Page 34: Mikrokontrolery  MCS51

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)

Page 35: Mikrokontrolery  MCS51

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

Page 36: Mikrokontrolery  MCS51

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:

Page 37: Mikrokontrolery  MCS51

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

....

Page 38: Mikrokontrolery  MCS51

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

Page 39: Mikrokontrolery  MCS51

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ń

Page 40: Mikrokontrolery  MCS51

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

Page 41: Mikrokontrolery  MCS51

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

Page 42: Mikrokontrolery  MCS51

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

Page 43: Mikrokontrolery  MCS51

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

Page 44: Mikrokontrolery  MCS51

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

Page 45: Mikrokontrolery  MCS51

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

Page 46: Mikrokontrolery  MCS51

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

Page 47: Mikrokontrolery  MCS51

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:

Page 48: Mikrokontrolery  MCS51

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

Page 49: Mikrokontrolery  MCS51

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)