Componente · Controller

Microcontrollore 8051

L'8051 è il microcontrollore a 8 bit che molti corsi di ingegneria insegnano ancora per primo: scopri cosa offre l'architettura e cosa devi costruire a mano.

Che cos’è

L’8051 non è una scheda e non è davvero un singolo chip: è un’architettura. Intel la pubblicò nel 1980, poi concesse in licenza il core così diffusamente che il componente che acquisti oggi proviene da un’altra azienda. In un kit di laboratorio è quasi sempre l’AT89S52 di Atmel: un nucleo 8051 con 8 KB di flash, 256 byte di RAM, tre timer e programmazione nel sistema tramite quattro pin.

Quello che ricevi è un DIP a 40 pin e nulla altro. Nessuna USB, nessun regolatore, nessun bootloader, nessun pinMode(). Prima di eseguire una sola istruzione devi fornirgli un quarzo, due condensatori di carico, una rete di reset e un collegamento da EA a +5 V. Questa dotazione scarna è l’intero motivo per cui è ancora nei programmi didattici: non c’è alcuno strato tra il tuo codice e il silicio che possa spiegare via un comportamento che non capisci.

Il circuito minimo necessario per eseguire un 8051. Un blocco del chip AT89S52 mostra sei pin: VCC pin 40 collegato alla linea a cinque volt e GND pin 20 collegato a massa; pin EA 31 collegato in rosso alla linea a cinque volt, con l'annotazione che collega EA a livello alto altrimenti il chip non esegue nulla; pin XTAL2 18 e XTAL1 19 collegati ai due lati di un quarzo da 11.0592 MHz, con un condensatore da 33 picofarad da ciascun terminale del quarzo a massa; e pin RST 9 collegato a un condensatore da 10 microfarad verso la linea a cinque volt e a una resistenza da 10 kiloohm verso massa, con l'annotazione che il reset è attivo a livello ALTO.
Tutto ciò di cui un 8051 ha bisogno prima di eseguire un'istruzione. Il collegamento di EA a +5 V è quello che impedisce silenziosamente a una prima scheda di funzionare. Scarica SVG
Piedinatura dell'8051 nel contenitore DIP a 40 pin, disegnata verticalmente con l'incisione del pin 1 in alto. La colonna sinistra elenca i pin da 1 a 20: pin della porta 1 da P1.0 a P1.7 con le funzioni alternative T2, T2EX, MOSI, MISO e SCK, poi RST, poi i pin della porta 3 da P3.0 a P3.7 etichettati RXD, TXD, INT0, INT1, T0, T1, WR e RD, quindi XTAL2, XTAL1 e GND. La colonna destra elenca i pin da 40 a 21: VCC, pin della porta 0 da P0.0 a P0.7 che svolgono anche le funzioni da AD0 ad AD7, poi EA, ALE e PSEN, quindi i pin della porta 2 da P2.7 a P2.0 che svolgono anche le linee di indirizzo da A15 ad A8. La codifica a colori separa le porte I/O, le funzioni alternative della porta 3, i pin di clock e controllo e l'alimentazione.
Il DIP a 40 pin. Nota che la porta 0 procede al contrario: il pin 32 è P0.7 e il pin 39 è P0.0; le seconde etichette della porta 3 indicano i pin seriali, di interrupt e dei timer. Scarica SVG

Come funziona

L’8051 è una macchina Harvard: memoria del programma e memoria dei dati sono spazi di indirizzo separati, raggiunti da istruzioni diverse. Il codice risiede nella flash; le variabili risiedono in 256 byte di RAM interna, a loro volta divisi in quattro banchi di registri, una finestra indirizzabile a bit e lo spazio rimanente per lo stack.

Il tempismo è insolitamente facile da ragionare. Un ciclo macchina dura dodici periodi dell’oscillatore e la maggior parte delle istruzioni ne richiede uno o due. A 11.0592 MHz sono 1.085 µs per ciclo, così puoi contare le istruzioni e sapere, senza stimarlo, quanto dura un ciclo. Pochissimi componenti moderni ti permettono di farlo.

I 32 pin I/O sono raggruppati in quattro porte con caratteri distinti:

  • P1 è l’unica davvero semplice: otto pin per uso generale con resistenze di pull-up interne.
  • P3 affianca a ogni pin una funzione alternativa: seriale RXD/TXD, i due interrupt esterni, i due ingressi dei timer e i segnali di lettura e scrittura della memoria esterna.
  • P2 trasporta il byte alto dell’indirizzo quando è collegata una memoria esterna.
  • P0 è open-drain. Senza resistenze esterne di pull-up non può emettere affatto un livello logico alto e trasporta anche il byte multiplexato di indirizzo basso e dati.

Ciò che il chip non ha è altrettanto importante: nessun ingresso analogico e nessun PWM hardware. Per leggere la tensione di un sensore serve un ADC esterno e per variare la velocità di un motore devi generare tu la forma d’onda con un interrupt del timer.

Quando usarlo

Scegli l’8051 quando l’obiettivo è imparare la macchina: un corso di microcontrollori, un mini-progetto universitario o la curiosità di capire che cosa fa davvero analogWrite(). Scrivere un generatore PWM via software insegna più in un pomeriggio di quanti chiamare per un anno una libreria che lo nasconde.

Scegli quasi qualsiasi altra cosa quando l’obiettivo è il robot. Un Arduino Uno offre PWM hardware, ingressi analogici e una libreria per ogni sensore che incontrerai; un ESP32 aggiunge Wi-Fi e molta più memoria. Entrambi costano circa quanto una scheda di sviluppo 8051. Scegliere l’8051 per un progetto che deve funzionare anziché insegnare significa ricostruire a mano cose che le alternative ti danno gratis.

Trappole comuni

  • EA deve essere collegato a +5 V. Il pin 31 seleziona la memoria del programma interna o esterna. Se è flottante o collegato a massa, il chip cerca silenziosamente il programma in una memoria esterna inesistente e non fa nulla: nessun errore, nessuna luce, nessun indizio. È la causa più comune di una prima scheda 8051 apparentemente morta.
  • Il reset è attivo a livello ALTO. A differenza di quasi tutti gli altri microcontrollori che incontrerai, l’8051 si resetta quando RST viene portato verso l’alto. Il circuito standard di accensione usa un condensatore da 10 µF da +5 V a RST e una resistenza da 10 kΩ da RST a massa.
  • La porta 0 richiede resistenze esterne di pull-up. È open-drain. Collega resistenze da 10 kΩ a +5 V, altrimenti non leggerà né produrrà mai un livello alto.
  • I pin assorbono corrente, non lo erogano. La resistenza di pull-up interna fornisce solo decine di microampere, mentre il transistor di pull-down assorbe milliampere. Collega l’anodo dell’LED all’alimentazione e il catodo al pin: uno 0 lo accende. Un collegamento inverso produce una luce debolissima e molta confusione.
  • Lo stack inizia a 08h, sopra il banco 1 di registri. Il puntatore dello stack si resetta a 07h. Se passi al banco 1 senza spostare prima SP, registri e indirizzi di ritorno occupano gli stessi byte.

Perché 11.0592 MHz, fra tutti i numeri

Quella frequenza del quarzo sembra arbitraria ed è una delle scelte più deliberate dell’intera architettura.

L’8051 genera la velocità seriale in baud facendo traboccare il Timer 1 in modalità a 8 bit con ricarica automatica:

baud = (2^SMOD / 32) x (oscillator / 12) / (256 - TH1)

Con SMOD = 0 e un quarzo da 11.0592 MHz, per ottenere 9600 baud:

TH1 = 256 - (11059200 / (12 x 32 x 9600)) = 256 - 3 = 253 = 0xFD

Esattamente 3. Nessun arrotondamento, nessun errore. Ogni velocità seriale standard — 1200, 2400, 4800, 9600, 19200 — dà un numero intero di ricariche del timer.

Ora prova un bel quarzo da 12 MHz:

TH1 = 256 - (12000000 / 3686400) = 256 - 3.26 -> must round to 3
actual baud = 10417, against a target of 9600 -> 8.5% error

I collegamenti seriali tollerano circa il 2–3% di errore complessivo tra le due estremità. All’8.5% la delimitazione dei caratteri deriva già all’interno di un byte e ogni carattere arriva corrotto. Ecco perché esiste 11.0592 MHz, perché è presente su ogni scheda di laboratorio 8051 e perché sostituire con il quarzo da 12 MHz trovato nel cassetto produce un chip che funziona finché non provi a stampare qualcosa.

Il compromesso è che l’aritmetica dei tempi diventa scomoda: un ciclo macchina dura 1.085 µs anziché un comodo 1 µs. Un quarzo da 12 MHz dà cicli esattamente di 1 µs e una seriale inutilizzabile. Scegli in base a quale delle due cose serve al tuo progetto.

Timer e generazione manuale del PWM

L’8051 ha tre timer a 16 bit e nessun hardware PWM. Variando la velocità di un motore devi generare la forma d’onda manualmente, e farlo è davvero la parte migliore dell’apprendimento su questo chip.

I timer hanno quattro modalità; due sono importanti:

Modalità Larghezza Ricarica Usala per
0 13 bit Manuale Obsoleta: ignorala
1 16 bit Manuale Ritardi lunghi e precisi. Richiede la ricarica nell’ISR
2 8 bit Automatica Velocità in baud e qualsiasi tick a periodo fisso
3 T0 diviso — Quando ti serve urgentemente un terzo timer

La modalità 2 è quella da usare quando vuoi un tick stabile, perché la ricarica avviene in hardware e nessun jitter dell’ISR si introduce nel periodo.

Un generatore PWM software sul Timer 0, a circa 1 kHz con 100 passi di risoluzione:

#include <reg52.h>

sbit MOTOR_L = P1^0;
sbit MOTOR_R = P1^1;

volatile unsigned char dutyL = 0, dutyR = 0;   // 0..99
volatile unsigned char tick  = 0;

void timer0_isr(void) interrupt 1 {
    /* Mode 1 is not self-reloading: put the value back first, before
       anything else, or the period stretches by the ISR's own length. */
    TH0 = 0xFF; TL0 = 0xA4;                    /* ~10 us at 11.0592 MHz */

    if (++tick >= 100) tick = 0;               /* 100 ticks = ~1 ms period */

    MOTOR_L = (tick < dutyL) ? 1 : 0;
    MOTOR_R = (tick < dutyR) ? 1 : 0;
}

void main(void) {
    TMOD = (TMOD & 0xF0) | 0x01;               /* Timer 0, mode 1 */
    TH0  = 0xFF; TL0 = 0xA4;
    ET0  = 1;                                  /* enable timer 0 interrupt */
    EA   = 1;                                  /* global interrupt enable */
    TR0  = 1;                                  /* start */

    dutyL = 70; dutyR = 70;
    while (1) { }                              /* PWM runs entirely in the ISR */
}

Vale la pena ricavarne due cose. Prima ricarica, sempre: in modalità 1 il timer continua a contare da zero dopo il traboccamento, quindi ogni istruzione eseguita prima della ricarica si aggiunge al periodo successivo. E il costo è reale: questa ISR viene attivata 100.000 volte al secondo e, a 1.085 µs per ciclo macchina, un gestore di dodici istruzioni consuma una fetta notevole di tutto ciò che il chip può fare. Questo budget è esattamente ciò che una periferica PWM hardware ti fa risparmiare, e non lo apprezzi finché non lo paghi a mano.

Budget di corrente delle porte

Questo aspetto può cogliere di sorpresa, perché le porte dell’8051 sono asimmetriche in un modo che i componenti moderni non hanno.

Assorbimento (uscita LOW) Erogazione (uscita HIGH)
Per pin, P1/P2/P3 ~10 mA ~60 µA (solo resistenza di pull-up interna)
Per pin, P0 ~10 mA 0: open-drain, nessun pull-up
Per porta, totale ~26 mA —
Chip intero ~71 mA —

Sessanta microampere non è un errore di battitura. La resistenza di pull-up interna è debole, non un driver, perciò un pin che emette HIGH può fornire circa un millesimo della corrente che è in grado di assorbire.

Ne seguono direttamente tre conseguenze:

Gli LED vanno dal catodo al pin, con l’anodo collegato tramite una resistenza a +5 V; scrivere 0 li accende. Collegati al contrario, emettono una luce molto debole, che sembra un LED spento o guasto anziché un errore di comprensione.

Non pilotare mai direttamente nulla. Non un relè, non un cicalino a volume elevato, non un motore. Usa un transistor, una scheda driver ULN2003 o un apposito driver del motore.

La porta 0 richiede resistenze esterne di pull-up: 10 kΩ verso +5 V su ogni pin che intendi usare come I/O. Senza di esse non può emettere un livello alto né leggerlo in modo affidabile, ed è la porta che la maggior parte delle schede di laboratorio collega all’LCD.

Memoria e dove finiscono i 256 byte

Otto kilobyte di flash sembrano pochi e raramente lo sono. I 256 byte di RAM sono il vincolo reale, e non sono 256 byte piatti:

Indirizzo Dimensione Che cosa contiene
00h–1Fh 32 byte Quattro banchi di registri, R0–R7 ciascuno
20h–2Fh 16 byte Indirizzabile a bit: 128 bit singolarmente indirizzabili
30h–7Fh 80 byte Area di lavoro generale e dove di solito va lo stack
80h–FFh 128 byte Solo indirizzamento indiretto (gli SFR occupano lo spazio diretto)

Il puntatore dello stack si resetta a 07h, collocando lo stack immediatamente sopra il banco 1 di registri. Se passi al banco 1 senza spostare prima SP, registri e indirizzi di ritorno condividono i byte, e il guasto è spettacolare: il programma ritorna a un indirizzo casuale. SP = 0x30; come prima riga di main() è la pratica standard.

La regione indirizzabile a bit merita attenzione perché è davvero elegante. Qualsiasi bit tra 20h e 2Fh può essere impostato, cancellato o testato con una sola istruzione, il che rende gratuiti i flag di stato:

bit lineDetected;      /* the compiler allocates this in 20h-2Fh */
bit motorEnabled;      /* one bit each, one instruction to test */

Otto di questi costano un byte e il test di uno richiede un solo ciclo macchina. Su un chip con 256 byte di RAM è importante.

Risoluzione dei problemi

Sintomo Causa probabile Soluzione
Il chip non fa proprio nulla EA flottante o collegato a massa Collega il pin 31 a +5 V. Controllalo sempre per primo
Il chip non fa nulla, EA è alto Il quarzo non oscilla Controlla i condensatori di carico da 33 pF e i giunti saldati del quarzo
Si resetta continuamente RST mantenuto alto Qui il reset è attivo a livello ALTO: controlla la rete 10 µF / 10 kΩ
La porta 0 non legge né scrive Open-drain senza pull-up 10 kΩ da ogni pin a +5 V
LED molto debole Collegato per erogare corrente Dal catodo al pin; scrivi 0 per accenderlo
La seriale stampa caratteri illeggibili Quarzo da 12 MHz Usa 11.0592 MHz: 12 MHz dà un errore dell’8.5% sulla velocità in baud
La seriale funziona in una sola direzione TX/RX non incrociati o masse non comuni Incrociali e collega le masse
Il programma ritorna a un indirizzo casuale Stack sovrapposto al banco 1 di registri SP = 0x30; all’inizio di main()
Il periodo PWM oscilla Timer ricaricato tardi nell’ISR Ricarica con la prima istruzione oppure usa la modalità 2
Comportamento irregolare all’aumentare del codice RAM esaurita 256 byte totali; controlla la mappa del linker
Il programmatore non vede il chip Pin ISP in uso o nessun controllo del reset Libera P1.5–P1.7 e RST durante la programmazione

8051 o un microcontrollore moderno?

8051 (AT89S52) Arduino Uno ESP32
Flash / RAM 8 KB / 256 B 32 KB / 2 KB 4 MB / 520 KB
PWM hardware Nessuno 6 canali 16 canali
Ingresso analogico Nessuno 6 × 10 bit 18 × 12 bit
Velocità seriale in baud Richiede il quarzo giusto Qualsiasi Qualsiasi
Librerie Scrivila tu Migliaia Migliaia
Che cosa impari La macchina Il progetto Il sistema

La posizione onesta è questa: l’8051 è un componente didattico, ed eccellente. Scrivere un generatore PWM software, calcolare a mano una ricarica per la velocità in baud e scoprire che un pin di porta non può erogare corrente ti insegna che cosa fanno davvero per te tutte le periferiche moderne. Quella comprensione trasferisce stabilmente, ed è il motivo per cui l’architettura è ancora nei programmi quarantacinque anni dopo la sua pubblicazione da parte di Intel.

Per un robot che deve funzionare, scegli quasi qualsiasi altra cosa. Costruire un seguilinea con 8051 significa scrivere il PWM, aggiungere un ADC esterno o usare sensori con uscita di comparatore e calcolare a mano ogni costante di temporizzazione, tutto ciò che un Uno offre per la stessa somma. Fallo quando l’obiettivo è capire la macchina. Scegli un Uno quando l’obiettivo è il robot.

Esplora il grafo

Usato in queste costruzioni

Progetti, percorsi di apprendimento e simulatori che includono Microcontrollore 8051.

Confronto

Alternative

Domande

FAQ su Microcontrollore 8051

Che cos'è il microcontrollore 8051?

L'8051 è un'architettura di microcontrollore a 8 bit introdotta da Intel nel 1980 e poi messa in licenza diffusamente, così oggi lo compri come chip compatibile come l'AT89S52 di Atmel anziché come componente Intel. Integra in un unico chip a 40 pin CPU, memoria flash, RAM, timer, una porta seriale e 32 pin I/O, e resta il microcontrollore didattico standard nella maggior parte dei programmi di ingegneria.

Perché l'8051 viene ancora insegnato se è del 1980?

Perché non nasconde nulla. Non c'è una libreria del nucleo, né un'astrazione della scheda, né PWM hardware: per far lampeggiare un LED imposti un bit in un registro di porta e per attenuarne la luminosità scrivi un interrupt del timer che conta i tick. Questo lo rende una scelta sbagliata per commercializzare un prodotto e una scelta eccellente per capire che cosa fanno per te tutti gli altri microcontrollori.

Qual è la differenza tra 8051 e Arduino?

Un Arduino Uno è una scheda basata su ATmega328P; l'8051 è un chip nudo che devi circondare con un quarzo, un circuito di reset e un programmatore. Arduino offre PWM hardware, ingressi analogici, un bootloader USB e un enorme ecosistema di librerie. L'8051 non offre nulla di tutto questo: non ha ADC né PWM, ed è proprio per questo che i corsi lo usano per insegnare le basi.

Perché l'8051 usa un quarzo da 11.0592 MHz?

Perché rende esatte le velocità seriali in baud. L'UART divide il clock del ciclo macchina e 11.0592 MHz si divide fino a esattamente 9600 baud, mentre un bel quarzo da 12 MHz si scosta di circa 8.5% e corrompe i dati seriali. Quel numero dall'aspetto insolito è scelto per l'aritmetica, non per la velocità.

Quante porte ha l'8051?

Quattro porte a 8 bit: P0, P1, P2 e P3, per un totale di 32 pin I/O. Non sono intercambiabili: P0 non ha resistenze di pull-up interne e richiede resistenze esterne, P3 trasporta i pin seriali, di interrupt e dei timer come funzioni alternative e P0 e P2 fungono anche da bus di indirizzo e dati se colleghi una memoria esterna.

Perché il mio programma per 8051 non fa nulla dopo che lo carico?

Controlla prima il pin EA (pin 31). Collegato a massa o lasciato flottante, il chip cerca il programma in una memoria esterna che non esiste, quindi non esegue nulla e non fornisce errori. EA deve essere collegato a +5 V per eseguire il codice dalla flash interna. I due sospetti successivi sono un circuito di reset mancante e i due condensatori di carico del quarzo.

Si può programmare l'8051 in C?

Sì, e ormai lo fanno la maggior parte dei corsi. Keil C51 è il compilatore standard del settore e SDCC è un'alternativa libera e open source. C è molto più produttivo dell'assembly, ma l'8051 premia chi sa che cosa genera il compilatore: una moltiplicazione dall'aspetto innocuo o un grande array locale costano molto di più su un chip con 256 byte di RAM che altrove.

L'8051 viene ancora usato in prodotti reali?

Sì, anche se raramente come chip autonomo visibile. I nuclei compatibili con 8051 sono integrati in innumerevoli dispositivi: controllori USB, sensori tattili, telecomandi e moduli radio, perché il nucleo è minuscolo, ben compreso e non comporta complicazioni di licenza. Lo incontri molto più spesso come blocco dentro un altro chip che come DIP a 40 pin sul banco del laboratorio.

Per approfondire

Fonti