Intel 8051

**Intel MCS-51** (mida tuntakse tavaliselt **Intel 8051** nime all) on Harvardi arhitektuuriga ühekiibi mikrokontrollerite seeria, mille töötas välja Intel 1980. aastatel. Kuigi Intel tänapäeval neid mikrokontrollereid ei tooda, on nendega ühilduvad mikrokontrollerid kasutusel teiste tootjate kiipides. Lisaks füüsilistele kiipidele pakuvad mitmed firmad MSC-51-l põhinevaid rakenduskiipe (ASIC) ja intellektuaalomandiga funktsiooniplokke (IP core), mida saab kasutada loogikamassiivides (nt FPGA-des).

## Tehnilised omadused
MCS-51-l põhinevate mikrokontrolleriseeriate peamised tehnilised omadused: 
* 8-bitiline CISC käsustikuga mikroprotsessor
* vähemalt 128 baiti sisemist muutmälu (RAM) 
* välise muutmälu (RAM) ja püsimälu (ROM) ühendamise võimalus
* Kahesuunaline asünkroonne jadavärat (Full-Duplex-UART)
* 5 katkestussignaali (IRQ)
* 2 katkestusprioriteeti
* 2 16-bitilist sisseehitatud taimerit/loendurit

## Käsustik
Intel MCS-51 käsustik pole binaarkujul masinkoodina ühilduv Intel 8080/8085 ega Z80 mikroprotsessoritega, kuid käskude mnemokoodid on sarnased firma Intel teiste mikroprotsessorite käskude mnemokoodidega.

### Käskude mnemokoodide selgitus
Aritmeetikakäsud:
*ADD – Liitmine akuregistriga – **Add** Accumulator
*ADDC – Liitmine akuregistriga koos ülekandega – Add Accumulator With Carry
*SUBB – Lahutada akuregistrist jättes tulemuse akuregistrisse – **Subtract** From Accumulator With Borrow
*INC – Suurendada registris olevat väärtust – **Increment** Register
*DEC – Kahanda registri sisu ühe võrra – **Decrement** Register
*MUL – Korrutada akuregistris olev arv registris B paikneva väärtusega – **Multiply** Accumulator by B
*DIV – Jagada akuregistris olev arv registris B paikneva väärtusega – **Divide** Accumulator by B
*CPL – Asendada registri sisu vastava pöördkoodiga – **Complement** Register
*DA – Kümnendkorrektsioon – Decimal Adjust

Loogikatehete käsud:
*ANL – NING tehe bitikaupa – Bitwise **AND**
*ORL – Bitikaupa VÕI tehe – Bitwise **OR**
*XRL – Bitikaupa Välistav-VÕI tehe – Bitwise **Exclusive OR**

Bitinihutamise käsud:
*RL – Akuregistri sisu nihutamine vasakule – **Rotate** Accumulator **Left**
*RLC – Akuregistri sisu nihutamine vasakule koos ülekandelipuga – Rotate Accumulator Left Through Carry
*RR – Akuregistri sisu nihutamine paremale – **Rotate** Accumulator **Right**
*RRC – Akuregistri sisu nihutamine paremale koos ülekandelipuga – Rotate Accumulator Right Through Carry

Andmete kopeerimise käsud:
*MOV – Andmete kopeerimine – **Move** Memory
*MOVC – Andmete kopeerimine programmimälus – Move Code Memory
*MOVX – Andmete kopeerimine laiendatud mälus – Move Extended Memory
*POP – Väärtuse tagasilugemine pinumälust – Pop Value From Stack
*PUSH – Väärtuse paigutamine pinumällu – Push Value Onto Stack
*CLR – Nullida registri sisu – **Clear** Register
*SETB – Biti seadmine 1'ks – Set Bit
*SWAP – Vahetada akuregistri näksid (neli esimest ja neli viimast bitti) – Swap Accumulator Nibbles
*XCH – Vahetada baidid registrites – **Exchange** Bytes
*XCHD – Vahetada neli bitti akuregistrist (nt. kümnend- või kuueteistkümnendarv) sisemise mäluregistriga – Exchange Digits

Siirdekäsud:
*JMP – Minna tingimusteta etteantud aadressile – **Jump** to Address
*AJMP – Siirdumine absoluutaadressile – Absolute Jump
*LJMP – Minna tingimusteta etteantud täispikale aadressile – Long Jump
*SJMP – Minna tingimusteta etteantud lähiaadressile – Short Jump
*CJNE – Võrrelda ja siirduda etteantud aadressile kui pole võrdne – Compare and Jump if **Not Equal**
*DJNZ – Kahandada registrit ja minna etteantud aadressile kui registri sisu kahandamise järel pole null – Decrement Register and Jump if **Not Zero**
*JB – Minna etteantud aadressile kui vastav bitt on 1 – Jump if Bit Set
*JBC – Minna etteantud aadressile kui vastav bitt on 1 ja seejärel bitt nullida – Jump if Bit Set and Clear Bit
*JC – Minna etteantud aadressile kui ülekandelipp "Carry" on 1 – Jump if **Carry** Set
*JNB – Minna etteantud aadressile kui vastav bitt on 0 – Jump if Bit Not Set
*JNC – Minna etteantud aadressile kui ülekandelipp "Carry" on 0 – Jump if Carry Not Set
*JNZ – Minna etteantud aadressile kui akuregistri sisu pole null – Jump if Accumulator Not Zero
*JZ – Minna etteantud aadressile kui akuregistri sisu on null – Jump if Accumulator **Zero**
*RETI – Katkestustöötlusrutiinist väljumine – **Return** From Interrupt
*NOP – Üks käsk tegevuseta edasi – **No Operation**

Alamprogrammikäsud:
*ACALL – Alamprogrammi väljakutsumine absoluutaadressiga – Absolute **Call**
*LCALL – Alamprogrammi väljakutsumine täispika aadressiga – Long **Call**
*RET – Alamprogrammist väljumine – **Return** From Subroutine

### Operandide tähised tabelis
Andmed:
* A – kiire protsessori sisemine register ehk "Aku"
* R0, R1, R2, R3, R4, R5, R6 ja R7 – protsessori registrid
* C – ülekande tunnus ehk ülekandelipp (*carry flag*)
* bitt – otseadresseeritav bitt sisemises põhi-muutmälus RAM või eriregistris SFR
* @Ri0 – sisemise muutmäluploki 0 kaudne aadress, märgi "@" järgi antakse aadressi sisaldava registri tähis R0 kuni R7
* @Ri1 – sisemise muutmäluploki 1 kaudne aadress, märgi "@" järgi antakse aadressi sisaldava registri tähis R0 kuni R7
* #andmed – 8 bitiline konstant, mis antakse käsukoodi järel
* #andmed16 – 16 bitiline konstant, mis antakse käsukoodi järel 
* direct – 128 sisemist mälupesa ja eriotstarbelised registrid SFR
* @DPTR – andmeviit (*data pointer*)

Programmimälu:
* aadr11 – 11 bitiline programmimälu aadress
* aadr16 – 16 bitiline programmimälu aadress
* suht – 8-bitiline suhteline aadress programmimälus (aadress on vahemikus −128 kuni +127)

## Viited