MCS-51 utasításkészlete 1/2 Vissza

 

A 8051-es mikrokontroller utasításkészlete 

A 8051-es mikrokontroller család továbbfejlesztett tagjai (pl. 8052/32, 80515/535, 80517/537, 80C552 stb.) felülről kompatibilisek a 8051/31 alaptípussal. Ez azt jelenti, hogy az alapegységek mindegyik változatban azonosak, az eltérések a bővített funkciókban találhatók. Utasításkészlete viszont a család minden tagjának azonos. Ebből fakad, hogy az alaptípus felépítésének, programozásának alapos ismerete a további változatok alkalmazására is - kevés bővítő ismeret megszerzése után - képessé teszi a felhasználót. 

A bit- és bájtszervezésű működés 

A 8051-es mikrokontroller utasításkészlete nagyon hasonlít a 8080 típusú mikroprocesszor utasításaihoz. Lényeges eltérés azonban, hogy a 8051-et elsősorban különböző vezérlési feladatokhoz fejlesztették ki. A mikrokontrollert olyan utasításokkal látták el, amelyekkel nagyon egyszerűen lehet bitműveleteket végezni. Ezt szolgálja a bitcímzés és a bitekre is értelmezett logikai műveletek (boole utasítások). A hagyományos mikroprocesszorokhoz hasonlítva még egy lényeges eltérésre kell felhívni a figyelmet. A mikroprocesszorok főleg bájt szervezésű számításokat végeznek. A vezérlési feladatoknál ritkábban van erre szükség. Többségében egyes kapcsolók állapotát kell lekérdezni, és reléket ki-, bekapcsolását vezérelni. Az ilyen jellegű működés bitszervezést igényel. Vissza

Futási idő 

Egy program futási idejének pontos meghatározásához ismerni kell azt, hogy az egyes utasítások feldolgozása hány gépi ciklus alatt történik. A 8051mikrokontroller utasításainak a végrehajtása - a MUL és DIV aritmetikai utasítások kivételével - egy-, vagy két gépi ciklus befejeződik. Az említett mindkét utasítás végrehajtásához négy gépi ciklus szükséges. Egy műveleti ciklus 12 oszcillátor-periódus hosszú. Az órajel frekvenciájának ismeretében a program végrehajtásához szükséges idő - a futási idő - a következők szerint számolható ki:

Az program összes utasításaihoz tartozó ciklusok összegét szorozni kell a quartz periódusidejének 12-szeresével .

A 8051 utasításai - a végrehajtási ciklusszám alapján - az alábbiak szerint oszlanak meg:

ˇ 63 egy-ciklusú,

ˇ 46 két-ciklusú és

ˇ 2 négy-ciklusú. 

Címzési módok Vissza

A címzésről általában 

A 8051-nél az alábbi öt különböző címzési mód alkalmazható:

ˇ regisztercímzés,

ˇ direkt címzés,

ˇ indirekt címzés,

ˇ közvetlen címzés,

ˇ indirekt regisztercímzés.

A mikrokontroller különböző memóriaterületekkel kommunikál. A fizikailag, vagy logikailag elkülönített területek más-más címzési móddal érhetőek el.

A 8051 öt féle címzési módja alapvetően két nagy csoportot alkot, mégpedig a direkt és az indirekt címzésűeket.

A direkt címzésnél az utasítás része a megfelelő tároló-cella címe (hexadecimális szám). Az indirekt címzésnél a tároló-cella címét egy regiszterben vagy egy másik tároló-cellában van. Az utasítás ez utóbbiak címét tartalmazza.

Az indirekt címzés kissé nehézkesebb, mivel a programozónak először arról kell gondoskodnia, hogy a szükséges cím a megfelelő tároló-egységbe kerüljön. Ugyanakkor rugalmasabb programozást tesz lehetővé. Az indirekt címzés egy másik lehetősége az un. adatmutató, vagyis a Data-Pointer használata. Az adatmutatóba egy 16 bites szám írható, amely 64 Kbájt kapacitású adatmemória címzését teszi lehetővé. Az adott értékhez relatív címzés is megoldható.

A relatív címzés a strukturált programozást teszi könnyebbé. Sok esetben előnyös ez a módszer. 

Regiszter címzés Vissza

Az aktuális bank R0 és R7 regiszterei címzésre is használhatóak. Segítségükkel a belső RAM egyes memória elemei - így az A,B a CY és DPTR is - közötti kommunikáció megvalósítható. Az utasításkód három legalacsonyabb helyiértékű bitje határozza meg az aktuális regisztert. 

Direkt címzés 

A direkt címzésnél az utasítás része az elérendő memória címe. A cím az utasítás műveleti kódja utáni hexadecimális szám.

Például: MOV A,32H alakú utasítás a 32H című belső memória tartalmát az Akkumulátor-ba (A) viszi.

A speciális funkció-regiszterek (SFR-k) csak a direkt címzéssel érhetők el. Az SFR regisztereken kívül a belső RAM alsó 128 bájtja is címezhető direkt módon.

Indirekt címzés 

Az indirekt címzésnél nem az utasítás, hanem - az aktuális regiszterbank - R0,vagy R1 regisztere tartalmazza az elérendő memóriacella címét. A 8 bites tartalommal 256 bájt széles RAM terület címezhető. E terület lehet a belső, vagy a külső RAM-ban is. Természetesen a 8051 típusnál a belső RAM csak 128 bájtos.

Az indirekt címzésre példa a MOVX A,@Ri utasítás, amely az akkumulátorba viszi a külső RAM egy cellájának tartalmát. A cella címe az Ri regiszterben van. A magasabb helyiértékű 8 címbit ezalatt nem változik meg. Az utasítás segítségével relatív címzést is meg tudunk valósítani. Először a P2 SFR-be kell beírni a cím magasabb bájtját, s az Ri-be pedig az alacsonyabb bájtot.

Az indirekt címzésű egy bájtosak. Segítségükkel a teljes 64 Kbájtnyi külső RAM egy kisebb területe érhető el. A teljes memóriaterület címzése a DPTR adat-mutató regiszterrel történhet (@DPTR).

Mivel a verem-terület kisebb 256 bájtnál, akkor a PUSH és POP utasításoknál is indirekt a címzés. A címe itt a verem-mutatóban (SP) van. Ezen az alapon a verem-terület is a RAM tetszőleges területére helyezhető. A programozónak kell biztosítani a magasabb helyiértékű 8 címbit megfelelő beállítását. 

Közvetlen címzés Vissza

A közvetlen címzésnél az adat, amellyel műveletet akarunk végezni nem valamelyik RAM egyik cellájában, hanem az utasításban van. Ez azt jelenti, hogy az értéket - az utasítás részeként - a programmemóriába (ROM, vagy EPROM) kell beírni.

Például: a MOV A,#23H utasítás 23 hexadecimális értéket ír az akkumulátorba. A közvetlen címzést leggyakrabban a matematikai, vagy a fizikai képleteket megoldó programoknál használjuk. 

Indirekt regiszter címzés 

Az indirekt-regisztercímzésnél a tényleges fizikai címet két regiszter tartalmának az összege adja. A cím tehát egy bázis-, és egy eltolási (offset) címrészből áll. A bázis cím vagy az adatmutatóban (DPTR), vagy a programszámlálóban (PC) van. E címhez adja hozzá egy belső regiszter (pl. @A) tartalmát. 

A különböző utasításfajták 

A 8051-nek 111 különböző utasítása van. Ezek a következő négy csoportba sorolhatók:

  - adatátviteli utasítások,

  - aritmetikai utasítások,

  - logikai, ill. bit műveleti utasítások,

  - vezérlő utasítások

Adatátviteli utasítások Vissza

Az adatátvíteli - az un. MOV - utasítások regiszter vagy RAM cella tartalmát viszi át másikba. A PUSH és POP utasítások is a MOV csoportba tartoznak.

Ez az utasítástípus három csoportra bontható. 

Az általános adatátvíteli utasítások

 A csoportot az alábbi utasítások alkotják:

MOV egy bitet, vagy bájtot visz át regiszterből regiszterbe, vagy RAM-ba, illetve fordítva.

PUSH inkrementálja a verem-mutató (SP) tartalmát majd a vonatkozó adatot az SP által címzett memóriába írja.

POP az SP által címzett memória tartalmát átírja a vonatkozó helyre, majd dekrementálja az SP tartalmát.

A MOV utasítások a címzett helyről az adatot átmásolják a cél helyre, de közben a forrás tartalmát nem változtatják meg. 

Akkumulátor-utasítások 

Ezeknél az utasításoknál az ACC-regiszter a célja, vagy a forrása az adatátvitelnek. Az akkumulátor önmaga lehet a cél is és a forrás is.

XCH (exchange) az akkumulátor és a címzett memória tartalmát cseréli fel.

XCHD hasonló az XCH utasításhoz, de csak az akkumulátor és a címzett memória tartalmának az alsó négy bitjét cseréli meg.

MOVX a külső adatmemória és az akkumulátor között végez adatátvitelt.

MOVC programtárolóból visz egy bájtot az akkumulátorba. A címzésnél a DPTR-ben, vagy PC-ben van a báziscím.

 Vissza

Data-Pointer utasítás

MOV DPTR, # a megadott 16 bites állandóval tölti fel a Data-Pointer DPH és DPL regisztereit. 

Aritmetikai utasítások 

A 8051 mikrokontroller matematikai műveletei korlátozottak. Csupán 8 bites előjeles számokkal lehet műveleteket végezni. Az Overflow-flag (OV) segíti a felhasználót az előjeles számok összeadásánál és kivonásánál. A 8051 aritmetikai utasításai hasonlítanak a 8080 és a 8085 mikroprocesszorok azonos utasításaihoz. 

Összeadó utasítások 

ADD a címzett memória és az akkumulátor tartalmát adja össze. Az eredmény az akkumulátorba kerül.

ADDC mint az ADD utasítás, de még a CY flag értékét is az eredményhez adja.

DA a BCD számok összeadásakor végez korrekciót.

INC az adott memória tartalmát inkrementálja (1-el növeli). 

Kivonó utasítások 

DEC az INC utasítás ellentettje. Az adott memória tartalmát dekrementálja (1-el csökkenti).

SUBB az akkumulátor tartalmából levonja az adott bájtot. Ha a CY=1, akkor az eredményből még 1-t levon. A művelet eredménye az akkumulátorba kerül.

Szorzó és osztó utasítások 

A B regisztert (az SFR-ben) kizárólag csak ezeknél az utasításoknál használja a kontroller.

MUL két előjel nélküli 8 bites számot szoroz össze. A szorzandókat az ACC és a B regiszterekbe kell vinni. A szorzat két bájtos lesz. Az eredmény alacsonyabb helyiértékű bájtja az ACC-be, míg a magasabb helyiértékű pedig a B-be kerül. A 256-nál nagyobb eredménynél az OV 1-be íródik.

DIV az ACC tartalmát osztja a B tartalmával. Előjelet nem vesz figyelembe! Az osztás egészrészét az ACC fogja tartalmazni. A maradék kerül a B regiszterbe. Ha a hányados 0, akkor az OV flag 1-be íródik. 

Logikai és Boole-utasítások Vissza

A logikai utasítások formailag nagyon hasonlóak a mikroprocesszorok azonos jellegű utasításaihoz. E csoport viszont - az aritmetikai műveletekkel ellentétben - sokkal bővebb alkalmazási lehetőséget nyújt. A 8051-es mikrokontrollert elsődlegesen vezérlésekhez fejlesztették és ezért mind bitekkel, mind pedig bájtokkal tud logikai műveleteket végrehajtani. 

ANL logikai ÉS művelet az operendusok azonos helyiértékű bitjei között. Az eredmény az első operandus helyére íródik, míg a második nem változik meg.

CLR törli a direkt címzett bitet, vagy az akkumulátort.

ORL az ANL-hez hasonlóan végez logikai VAGY műveletet.

RL az akkumulátor tartalmát egy hellyel balra forgatja.

RLC az akkumulátor tartalmát a CY közbeiktatásával forgatja egy hellyel balra.

RR az akkumulátor tartalmát egy hellyel jobbra forgatja.

RRC az akkumulátor tartalmát a CY közbeiktatásával forgatja egy hellyel jobbra.

Az RLC és RRC utasításoknál a CY az akkumulátor kilencedik bitjének tekinthető.

SETB a direkt címzett bitet 1-be írja.

SWAP felcseréli az akkumulátor felső- és alsó négy bitjét.

XRL az EXKLUSIV-VAGY művelet két operandus azonos helyiértékű bitjei között. Az eredmény - az ANL és ORL műveletekhez hasonlóan - az első operandus helyére kerül.

Az ANL, ORL műveletek egyes bitek között is alkalmazhatóak. A hagyományos diszkrét logikai hálózatok kiválthatók a 8051 bázisú rendszerrel (például a különböző tárolt programú vezérlések). 

Vezérlő utasítások Vissza

A vezérlő utasítások alkalmazhatók a programokon belüli különböző ugrások végre-hajtására. Ilyen lehet egy szubrutin hívása, vagy egy feltételtől függő programelágazás. A vezérlő utasítások az alábbi három osztályba sorolhatók:

ˇ feltétel nélküli CALL és JUMP,

ˇ feltételes JUMP,

ˇ megszakítások.

Ezen utasítások közös jellemzője, hogy a programszámláló tartalmát változtatják meg. A PC határozza meg, hogy a kontroller mely címről hív be utasítást. Ennek megváltoztatásával vezérelhető egy programelágazás.

A JUMP és a CALL utasítások megtörik a program tiszta sorrendi (lineáris) lefutását.

 A JUMP-ok (esetleg egy meghatározott feltételtől függően) a program meghatározott helyére történő ugrást vezérlik. A program végrehajtása e helyről fog folytatódni.

A CALL utasítás egy szubrutint hiv. A rutin feldolgozása egy RET utasításig tart. A RET hatására a főprogram - a CALL utasítást követő helyről - fut tovább. Ugyanaz a szubrutin a főprogram tetszőleges helyéről és többször is hívható. Elsődlegesen a különböző összetettebb matematikai műveletekhez használjuk a szubrutinokat.

A megszakítási elágazás, hasonlóan a CALL-hoz egy szubrutin hívását jelenti. Lényeges eltérés az hogy ezt az ugrást egy hardveresemény váltja ki. A szubrutin hívása a meg-szakítás után azonnal megtörténik. 

Feltétel nélküli CALL és JUMP Vissza

A feltétel nélküli ugrás, mint ahogyan a nevében is benne van, nem függvénye valamilyen eredménynek. Az ugrás minden esetben bekövetkezik, amikor a program egy ilyen utasításhoz ér. Szigorúan véve a RETURN utasítás is e csoportba tartozik. A CALL végrehajtása előtt a fő-program következő utasításának címe a verem-be íródik. Ezután a Verem-pointer értéke kétszer inkrementálódik (16 bites cím kerül be a verem-be). A RET utasítás hatására ez a cím visszaíródik a PC-be. Végül az SP tartalma kettővel csökken. 

ACALL két bájtos szubrutin hívó utasítás.2 K-bájtos szegmensen belüli programugrást hajt végre. Az ACALL-hoz 11 bites cím tartozik. A PC-ben lévő legnagyobb helyiértékű öt bit érvényes marad (együtt adják a 16 bites címet). Az ACALL hívásakor a PC tartalma inkrementálódik. Ha az ACALL egy 256-bájtos szegmens utolsó két bájtja, akkor a PC inkrementálása miatt az a következő szegmensbe kerül.

LCALL három bájtos szubrutinhívó utasítás. Hasonló az ACALL-hoz, de alkalmas a teljes 64-Kbájton belüli tetszőleges című rutin hívására.

AJMP/LJMP lényegében az ACALL és LCALL utasításokhoz hasonlóan használhatók.

SJMP egy rendkívüli ugrás utasítás. A SHORT JUMP használatával csak 256 bájtos területen belüli ugrás oldható meg.

JMP @A+DPTR az ugrás címét a DPTR és az akkumulátor tartalmának összege adja. A 8 bites akkumulátor-tartalom egy lapot fog át. A DPTR a teljes 64 Kbájtos programmemória tetszőleges helyére mutathat.

RET az ACALL vagy az LCALL utasításokkal meghívott szubrutinból való visszatérést vezérli. Hatására a PC-be íródik a szubrutin hívást követő utasítás címe. 

Feltételes JUMP Vissza

Az előzőekkel ellentétben az ugrás csak akkor következik, ha meghatározott feltétel teljesül. A feltételes ugrás mindig relatív. Az éppen aktuális helytől számítottan 8 bites címtávolságon belül lehet a célhely. Ez azt jelenti, hogy a feltételes ugrásoknál az utasítás helyétől számítva -128, vagy +127 területen belül lehet a cél cím. 

A 8051-nek a következő feltételes ugróutasításai vannak:

JZ akkor következik az ugrás, ha az akkumulátor tartalma 0.

JNZ akkor következik az ugrás, ha az akkumulátor tartalma nem 0.

JC akkor következik az ugrás, ha a Carry-Flag 1.

JNC akkor következik az ugrás, ha a Carry-Flag 0.

JB akkor következik az ugrás, ha egy tetszőleges, direkt címzett bit 1.

JNB akkor következik az ugrás, ha egy tetszőleges, direkt címzett bit 0.

JBC akkor következik az ugrás, ha egy tetszőleges, direkt címzett bit 1.Utána törli a bitet.

CJNE összehasonlítja két regiszter tartalmát. Akkor következik az ugrás, ha a két tartalom nem egyforma. Amikor az elsőnek adott regiszter tartalma a kisebb, akkor a CY is 1-be íródik. Ellenkező esetben törlődik.

DJNZ először dekrementálja az adott címen lévő értéket. Majd ellenőrzi, hogy a csökkentett érték 0 vagy nem és az utóbbi esetben hajtja végre az előírt ugrást. 

A jelzőbiteket befolyásoló utasítások Vissza

A 8051 utasításai közül csak nagyon kevés változtatja a mikrokontroller flag-jeit.A táblázat foglalja össze, hogy az egyes flag-ekre melyik utasítás hat.Az X azt jelenti,hogy az adott flag-et az utasítás változtatja. A 0 ill. az 1 jelöli azt a konkrét értéket,amelyre a flag mindig beáll a művelet hatására.

 

Utasítás

CY

OV

AC

ADD

X

X

X

ADDC

X

X

X

SUBB

X

X

X

MUL

0

X

 

DIV

0

X

 

DA

X

 

 

RRC

X

 

 

RLC

X

 

 

SETB C

X

 

 

CLR C

X

 

 

CPL C

X

 

 

ANL C,bit

X

 

 

ANL C,/bit

X

 

 

ORL C,bit

X

 

 

ORL C,/bit

X

 

 

MOV C,bit

X

 

 

CJNE

X

 

 

  

READ-MODIFY-WRITE utasítások Vissza

A READ-MODIFY-WRITE utasítások egy port tartalmát kiolvassák, a kívánt értékre változtatják és azonnal visszaírják a port-latchbe. A READ-MODIFY-WRITE utasításokhoz mindig egy port címe tartozik.

Az csoportba a következő utasítások tartoznak:

 

Utasítás

Példa

ANL

ANL P2,A

ORL

ORL P1,A

XRL

XRL P1,A

JBC

JBC P2.2,re

CPL

CPL P1.1

INC

INC P1

DEC

DEC P1

DJNZ

DJNZ P1,rel

MOV

MOV P2.1,C

CLR

CLR P1.0

SETB

SETB P1.0

 

 A lista első utasításainál azonnal belátható, hogy azok READ-MODIFY-WRITE utasítások. Az utolsó háromnál első látásra kétséges. Ezekre is érvényes, hogy először a port kiolvasása, az érték módosítása és a visszaírás követik egymást.

 Vissza