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.
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
0lo 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