La designazione ufficiale di Intel per la famiglia 8051 di microcontrollori è MCS 51. La prima versione fu prodotta utilizzando tecnologia NMOS mentre le versioni successive, identificate da una lettera C nel loro nome (es., 80C51) usavano tecnologia CMOS ed erano quindi più efficienti dal punto di vista energetico dei loro predecessori NMOS. Ciò li rendeva particolarmente adatti per l'uso su dispositivi a batteria.
Architettura 8051
L'8051 possiede 60000 transistor. Il cuore dell'8051 è rappresentato dal bus principale cui sono collegati vari registri, quasi tutti destinati a lettura o scrittura, sotto il controllo del programma.
L'8051 è dotato di due memorie separate per codice e dati. La RAM dei dati è di soli 256 byte, mentre la memoria ROM del codice può raggiungere i 64 KB. Oltre al bus principale e ai registri, sul chip dell'8051 ci sono due timer a 16 bit che risultano indispensabili per le applicazioni in tempo reale. Sono presenti anche 4 porte I/O a 8 bit, che permettono all'8051 di controllare 32 dispositivi esterni come pulsanti, luci, sensori, attuatori e altro.
L'8051 è un processore sincrono in cui la maggior parte delle istruzioni, seppur non tutte, impiegano un solo ciclo macchina. Ogni ciclo macchina è suddiviso in dodici cicli di clock, e da sei stati. Ad ogni stato viene eseguita una precisa operazione che portano all'esecuzione dell'istruzione.
Applicazioni e funzioni importanti
Il chip dell'8051 integra le funzionalità seguenti:
Controllo del consumo (modalità di risparmio energetico)
Una caratteristica particolarmente utile dell'8051 è la possibilità di elaborare direttamente e in modo efficiente variabili booleane a un solo bit, nei registri e nella RAM. Questa caratteristica ha contribuito a consolidare la popolarità dell'8051 in applicazioni di controllo industriale. Un'altra caratteristica apprezzata è la presenza di quattro gruppi separati di registri di contesto, usati per ridurre drasticamente le latenze degli interrupt rispetto ai metodi tradizionali di immagazzinamento del contesto su stack.
Le porte seriali dell'8051 rendono semplice l'uso del chip come interfaccia di comunicazione. È infatti possibile configurare la modalità di connessione tra i pin esterni e i registri a scorrimento interni, collegandoli anche ai timer interni, ottenendo così il supporto di diverse modalità di comunicazione seriale, di tipo sia sincrono (SPI) che asincrono.
Le porte UART integrate, dalla gestione particolarmente semplice, sono in grado di comunicare secondo i protocolli seriali più diffusi, in particolare è supportata anche una modalità compatibile con il protocollo RS-485 per comunicazioni multipunto. Questa capacità di interfacciamento verso altri dispositivi rende l'8051 particolarmente adatto per applicazioni di tipo embedded.
La versione originale dell'8051 ha un ciclo macchina pari a 12 cicli di clock. Dato che la maggior parte delle istruzioni richiedono uno o due cicli macchina, usando un clock a 12 MHz l'8051 è in grado di eseguire in un secondo fino a un milione di istruzioni da un ciclo macchina e fino a cinquecentomila istruzioni da due cicli macchina. Le ultime versioni dell'8051 hanno ridotto drasticamente il numero di cicli di clock per ciclo macchina, fino ad arrivare a un ciclo macchina per ciclo di clock, come avviene nei modelli prodotti da SILabs, da alcuni Dallas e da qualche Atmel: a una frequenza di clock di 100 MHz la CPU risulta quindi particolarmente efficiente, altra caratteristica fondamentale per le applicazioni di tipo embedded. Grazie all'impiego di tecnologie FPGA, gli ultimi modelli di 8051 sono in grado di lavorare a una frequenza di clock pari a 200 MHz.
I più recenti modelli di microcontrollore basati su core 8051 hanno esteso anche le funzionalità integrate nel chip, aumentando il numero di sorgenti di interrupt, estendendo le funzionalità accessorie quali il numero di timer e contatori e integrando ulteriori funzioni ausiliarie: oscillatori interni, memorie non volatili programmabili (flash EPROM, EEPROM), ROM con bootloader per un avvio velocizzato, dispositivi avanzati di comunicazione seriale sincrona (I2C), gestori di interfaccia USB, modalità a basso consumo e a risparmio energetico, meccanismi di autodiagnostica eccetera.
Programmazione
Oltre alla programmazione in linguaggio assembly nativo, sono disponibili diversi compilatoriC, completi di estensioni per il controllo dell'allocazione delle variabili nei vari tipi di memoria e per l'accesso alle caratteristiche hardware specifiche dell'8051, come ad esempio i banchi di registri per le variabili a singolo bit. Sono inoltre disponibili compilatori e interpreti di altri linguaggi di alto livello come: Forth, BASIC, Pascal/Object Pascal, PL/M e Modula 2.
Instruction set
Istruzioni aritmetiche
Mnemonici
Descrizione
Bytes
Cicli
ADD A,Rn
Somma ad A il contenuto del registro Rn
1
1
ADD A,direct
Somma ad A il contenuto della posizione direct
2
1
ADD A,@Ri
Somma ad A il contenuto della posizione puntata da Ri
1
1
ADD A,#data
Somma ad A il dato immediato
2
1
ADDC A,Rn
Somma ad A il contenuto del registro Rn e il CY
1
1
ADDC A,direct
Somma ad A il contenuto della posizione direct e il CY
2
1
ADDC A,@Ri
Somma ad A il contenuto della posizione puntata da Ri e il CY
1
1
ADDC A,#data
Somma ad A il dato immediato e il CY
2
1
SUBB A,Rn
Sottrae da A il contenuto del registro Rn e il CY
1
1
SUBB A,direct
Sottrae da A il contenuto della posizione direct e il CY
2
1
SUBB A,@Ri
Sottrae da A il contenuto della posizione puntata da Ri e il CY
1
1
SUBB A,#data
Sottrae da A il dato immediato e il CY
2
1
INC A
Aumenta di 1 il contenuto di A
1
1
INC Rn
Aumenta di 1 il contenuto del registro Rn
1
1
INC direct
Aumenta di 1 il contenuto della posizione direct
2
1
INC @Ri
Aumenta di 1 il contenuto della posizione puntata da Ri
1
1
DEC A
Diminuisce di 1 il contenuto di A
1
1
DEC Rn
Diminuisce di 1 il contenuto del registro Rn
1
1
DEC direct
Diminuisce dI 1 il contenuto della posizione direct
2
1
DEC @Ri
Diminuisce di 1 il contenuto della posizione puntata da Ri
1
1
INC DPTR
Aumenta di 1 il contenuto del registro DPTR
1
2
MUL AB
Moltiplica il contenuto di A per quello di B; la parte bassa del risultato va in A e la parte alta va in B
1
4
DIV AB
Divide il contenuto di A per B; il quoziente va in A e il resto in B
1
4
DA A
Realizza l'aggiustamento decimale del contenuto di A. Utilizzando la rappresentazione in BCD le istruzioni ADD e ADDC debbono essere seguite da DA: ciò assicura che il risultato sia ancora in BCD
1
1
Operazioni Logiche
Mnemonici
Descrizione
Bytes
Cicli
ANL A,Rn
AND logico tra A e il contenuto del registro Rn
1
1
ANL A,direct
AND logico tra A e il contenuto della posizione direct
2
1
ANL A,@Ri
AND logico tra A e il contenuto della posizione puntata da Ri
1
1
ANL A,#data
AND logico tra A e il dato immediato
2
1
ANL direct,A
AND logico tra il contenuto della posizione direct e dell'ACC; il risultato rimane nella posizione direct
2
1
ANL direct,#data
AND logico tra il contenuto della posizione direct ed il dato; il risultato rimane nella posizione direct
3
2
ORL A,Rn
OR logico tra A e il contenuto del registro Rn
1
1
ORL A,direct
OR logico tra A e il contenuto della posizione direct
2
1
ORL A,@Ri
OR logico tra A e il contenuto della posizione puntata da Ri
1
1
ORL A,#data
OR logico tra A e il dato immediato
2
1
ORL direct,A
OR logico tra il contenuto della posizione direct e dell'ACC; il risultato rimane nella posizione direct
2
1
ORL direct,#data
OR logico tra il contenuto della posizione direct ed il dato immediato; il risultato rimane nella posizione direct
3
2
XRL A,Rn
EX-OR logico tra A e il contenuto del registro Rn
1
1
XRL A,direct
EX-OR logico tra A e il contenuto della posizione direct
2
1
XRL A,@Ri
EX-OR logico tra A e il contenuto della posizione puntata da Ri
1
1
XRL A,#data
EX-OR logico tra A e il dato immediato
2
1
XRL direct A
EX-OR logico tra il contenuto della posizione direct e A, il risultato rimane nella posizione direct
2
1
XRL direct,#data
EX-OR logico tra il contenuto della posizione direct e il dato, il risultato rimane nella posizione direct
3
2
CLR A
Azzera tutti i bit di A
1
1
CPL A
Complementa a 1 (ovvero inverte) tutti i bit di A
1
1
RL A
Ruota di un posto verso sinistra i bit di A
1
1
RLC A
Ruota di un posto verso sinistra i bit di A con riporto al CY
1
1
RR A
Ruota di un posto verso destra i bit di A
1
1
RRC A
Ruota di un posto verso destra i bit di A con riporto al CY
1
1
SWAP A
scambia i due nibble dell'accumulatore
1
1
Operazioni di Trasferimento Dati
Mnemonici
Descrizione
Bytes
Cicli
MOV A,Rn
Copia in A il contenuto del registro Rn
1
1
MOV A,direct
Copia in A il contenuto della posizione direct
2
1
MOV A,@Ri
Copia in A il contenuto della posizione puntata da Ri
1
1
MOV A,#data
Copia in A il dato immediato
2
1
MOV Rn,A
Copia nel registro Rn il contenuto di A
1
1
MOV Rn,direct
Copia nel registro Rn il contenuto della posizione direct
2
2
MOV Rn,#data
Copia nel registro Rn il dato immediato
2
1
MOV direct,A
Copia nella posizione direct il contenuto di A
2
1
MOV direct,Rn
Copia nella posizione direct il contenuto del registro Rn
2
2
MOV direct, direct
Copia nella posizione direct il contenuto della posizione direct
3
2
MOV direct,@Ri
Copia nella posizione direct il contenuto della posizione puntata da Ri
2
2
MOV direct,#data
Copia nella posizione direct il dato immediato
3
2
MOV @Ri,A
Copia nella posizione puntata da Ri il contenuto di A
1
1
MOV @Ri,direct
Copia nella posizione puntata da Ri il contenuto. della posizione direct
2
2
MOV @Ri,#data
Copia nella posizione puntata da Ri il dato immediato
2
1
MOV DPTR,#data16
Copia in DPTR un dato a 16 bit
2
1
MOVC A,@A+DPTR
Copia in A il contenuto della memoria programma di indirizzo DPTR + A
1
2
MOVC A,@A+PC
Copia in A il contenuto della memoria programma di indirizzo PC + A +1
1
2
MOVX A,@Ri
Copia in A il contenuto della memoria dati esterna puntata da Ri
1
2
MOVX A,@DPTR
Copia in A il contenuto della memoria dati esterna puntata da DPTR
1
2
MOVX @Ri,A
Copia nella posizione di memoria dati esterna puntata da Ri il contenuto di A
1
2
MOVX @DPTR,A
Copia nella posizione di memoria dati esterna puntata da DPTR il contenuto di A
1
2
PUSH direct
Copia nella posizione puntata da SP il contenuto della posizione direct e aumentalo Stack di una unità
2
2
POP direct
Copia nella posizione direct il contenuto della posizione puntata da SP e diminuisce lo Stack di una unità
2
2
XCH A,Rn
Scambia il contenuto di A con quello di Rn
1
1
XCH A,direct
Scambia il contenuto di A con quello della posizione direct
2
1
XCH A,@Ri
Scambia il contenuto di A con quello della posizione puntata da Ri
1
1
XCHD A,@Ri
Scambia il nibble meno significativo di A con il più significativo della posizione puntata da Ri
1
1
Istruzioni sui bit (Variabili Booleane) Operations
Mnemonici
Descrizione
Bytes
Cicli
CLR C
Azzera il flag CY
1
1
CLR bit
Azzera il bit dell'indirizzo [bit]
2
1
SETB C
Pone a 1 il flag CY
1
1
SETB bit
Pone a 1 il bit dell'indirizzo [bit]
2
1
CPL C
Inverte il flag CY
1
1
CPL bit
Inverte il bit dell'indirizzo [bit]
2
1
ANL C,bit
AND logico fra CY e il bit dell'indirizzo [bit]
2
2
ANL C,/bit
AND logico fra CY e la negazione del bit dell'indirizzo [bit]
2
2
ORL C,bit
OR logico fra CY e il bit dell'indirizzo [bit]
2
2
ORL C,/bit
OR logico fra CY e la negazione del bit dell'indirizzo [bit]
2
2
MOV C,bit
Copia nel carry il bit di indirizzo bit
2
1
MOV bit,C
Copia il carry nell'indirizzo bit
2
2
Istruzioni di controllo
Mnemonici
Descrizione
Bytes
Cicli
ACALL addr11
Manda in esecuzione una routine entro un segmento da 2K (solo in avanti)
2
2
LCALL addr16
Manda in esecuzione una routine (anche fuori segmento, fino a ±32K)
3
2
RET
Termina l'esecuzione di una routine
1
2
RETI
Termina l'esecuzione della routine di risposta ad un'interruzione
1
2
AJMP addr11
Salta all'indirizzo specificato entro un segmento da 2K (solo in avanti)
2
2
LJMP addr16
Salta all'indirizzo specificato (anche fuori segmento, fino a ±32K)
3
2
SJMP rel
Salta a [rel] posizioni successive del Program Counter (entro –128 e +127)
2
2
JMP @A+DPTR
Salta alla posizione di PC puntata da A + il contenuto del DPTR
1
2
JZ rel
Salta alla posizione [rel] se il contenuto di A è uguale a zero
2
2
JNZ rel
Salta alla posizione [rel] se il contenuto di A è diverso da zero
2
2
JC rel
Salta alla posizione [rel] se il bit di CY vale 1
2
2
JNC rel
Salta alla posizione [rel] se il bit di CY vale 0
2
2
JB bit,rel
Salta alla posizione [rel] se il bit contenuto nell'indirizzo [bit] vale 1
3
2
JNB bit,rel
Salta alla posizione [rel] se il bit contenuto nell'indirizzo [bit] vale 0
3
2
JBC bit,rel
Salta alla posizione [rel] se il bit contenuto nell'indirizzo [bit] vale 1, e poi lo azzera
3
2
CJNE A,direct,rel
Salta alla posizione [rel] se il contenuto di A è diverso da quello di [direct]; se A è minore di [direct] pone CY=1, altrimenti CY=0
3
2
CJNE A,#data,rel
Salta alla posizione [rel] se il contenuto di A è diverso dal dato immediato; se A è minore di #dato pone CY=1, altrimenti CY=0
3
2
CJNE Rn,#data,rel
Salta alla posizione [rel] se il contenuto di Rn è diverso dal dato immediato; se Rn è minore del dato pone CY=1, altrimenti CY=0
3
2
CJNE @Ri,#data,rel
Salta alla posizione [rel] se il contenuto della posizione puntata da Ri è diverso dal dato immediato; se il contenuto del riferimento è minore del dato pone CY=1, altrimenti CY=0
3
2
DJNZ Rn,rel
Diminuisce di 1 il contenuto di Rn; se Rn non diventa 0, salta a [rel]
2
2
DJNZ direct,rel
Diminuisce di 1 il contenuto della posizione [direct]; se il contenuto non diventa 0, salta a [rel]
3
2
NOP
Nessuna operazione (ritardo di un ciclo macchina)
1
1
Note
Rn Registri di lavoro R0-R7
direct 128 locazioni di ram interna, porta di I/O, registro di controllo o stato
@Ri Locazione di RAM interna indiretta indirizzata dal registro R0 o R1
data costante a 8 bit inclusa nell'istruzione
data16 costante a 16 bit inclusa nell'istruzione
bit 128 flag software, pin di I/O, bit di controllo o stato
addr16 L'indirizzo di destinazione può essere ovunque nei 64-kByte dello spazio di memoria programma
addr11 L'indirizzo di destinazione sarà nella stessa pagina di memoria programma ampia 2-kByte come primo byte della corrente istruzione
rel offset a 8-bit relativo al primo byte della corrente istruzione (+127, -128)
All mnemonics copyrighted (C) Intel Corporation 1979