Composant · Contrôleur
8051 Microcontroller
Le 8051 est le microcontrôleur 8 bits que les cursus enseignent encore en premier. Ce que l'architecture apporte, et ce qu'elle oblige à construire soi-même.
Présentation
Le 8051 n’est pas une carte ni vraiment une seule puce — c’est une architecture. Intel l’a publiée en 1980, puis a licencié le cœur si largement que la pièce que vous achetez aujourd’hui vient d’un autre fabricant. Dans un kit de TP, c’est presque toujours l’AT89S52 d’Atmel : un cœur 8051 avec 8 Ko de flash, 256 octets de RAM, trois temporisateurs, et une programmation in situ sur quatre broches.
Ce qui arrive est un DIP 40 broches et rien d’autre. Pas d’USB, pas de régulateur, pas de bootloader, pas de pinMode(). Avant d’exécuter la moindre instruction, il faut lui donner un quartz, deux condensateurs de charge, un réseau de reset, et une liaison de EA au +5 V. Cette nudité est toute la raison de sa présence au programme : il n’y a aucune couche entre votre code et le silicium pour expliquer un comportement que vous ne comprenez pas.
Fonctionnement
Le 8051 est une machine Harvard : mémoire programme et mémoire données sont des espaces d’adressage séparés, atteints par des instructions différentes. Le code vit en flash ; les variables vivent dans 256 octets de RAM interne elle-même divisée en quatre bancs de registres, une fenêtre adressable au bit, et ce qui reste pour votre pile.
Le séquencement est exceptionnellement facile à raisonner. Un cycle machine vaut douze périodes d’oscillateur, et la plupart des instructions en prennent un ou deux. À 11,0592 MHz cela fait 1,085 µs par cycle, donc vous pouvez compter les instructions et savoir — et non estimer — combien de temps prend une boucle. Très peu de pièces modernes permettent cela.
Les 32 broches d’E/S sont regroupées en quatre ports aux personnalités distinctes :
- P1 est le seul simple — huit broches d’usage général avec rappels internes.
- P3 double chaque broche d’une fonction alternée : RXD/TXD série, les deux interruptions externes, les deux entrées de temporisateur, et les signaux de lecture et d’écriture de la mémoire externe.
- P2 porte l’octet d’adresse haut quand de la mémoire externe est connectée.
- P0 est à collecteur ouvert. Sans résistances de rappel externes, il ne peut pas du tout sortir un niveau haut logique, et il porte aussi l’octet multiplexé d’adresse basse et de données.
Ce que la puce n’a pas compte tout autant : pas d’entrées analogiques ni de PWM matériel. Lire une tension de capteur exige un CAN externe, et faire varier la vitesse d’un moteur signifie générer soi-même la forme d’onde depuis une interruption de temporisateur.
Quand l’utiliser
Prenez le 8051 quand l’objectif est d’apprendre la machine — un cours de microcontrôleurs, un mini-projet universitaire, ou votre propre curiosité sur ce que fait réellement analogWrite(). Écrire un générateur PWM logiciel enseigne plus en un après-midi qu’une année à appeler une bibliothèque qui le cache.
Choisissez presque tout autre chose quand l’objectif est le robot. Un Arduino Uno donne du PWM matériel, des entrées analogiques et une bibliothèque pour chaque capteur rencontré ; un ESP32 ajoute le Wi-Fi et bien plus de mémoire. Les deux coûtent à peu près le même prix qu’une carte de développement 8051. Choisir le 8051 pour un projet qui doit fonctionner plutôt que enseigner signifie reconstruire à la main des choses que les alternatives offrent gratuitement.
Pièges courants
- EA doit être attachée au +5 V. La broche 31 sélectionne la mémoire programme interne ou externe. En l’air ou à la masse, la puce lit silencieusement depuis une mémoire externe inexistante et ne fait rien du tout — pas d’erreur, pas de voyant, aucun indice. C’est la raison la plus fréquente d’une première carte 8051 apparemment morte.
- Le reset est actif à l’ÉTAT HAUT. Contrairement à presque tous les autres microcontrôleurs rencontrés, le 8051 se réinitialise quand RST est tiré vers le haut. Le circuit standard à la mise sous tension est un condensateur de 10 µF du +5 V vers RST et une résistance de 10 kΩ de RST à la masse.
- Le port 0 exige des rappels externes. Il est à drain ouvert. Câblez des résistances de 10 kΩ au +5 V ou il ne lira ni ne sortira jamais un haut.
- Les broches absorbent, elles ne fournissent pas. Le rappel interne ne fournit que des dizaines de microampères, tandis que le transistor de tirage absorbe des milliampères. Les LED vont anode vers l’alimentation, cathode vers la broche, et un
0les allume. Les câbler dans l’autre sens produit une lueur très faible et beaucoup de confusion. - La pile commence à 08h, au-dessus du banc de registres 1. Le pointeur de pile est initialisé à 07h. Si vous passez au banc 1 sans déplacer SP d’abord, vos registres et vos adresses de retour occupent les mêmes octets.
Pourquoi 11,0592 MHz, parmi tous les nombres
Cette fréquence de quartz semble arbitraire et est l’un des choix les plus délibérés de toute l’architecture.
Le 8051 génère sa vitesse série en faisant déborder le temporisateur 1 en mode 8 bits à rechargement automatique :
baud = (2^SMOD / 32) x (oscillator / 12) / (256 - TH1)
Avec SMOD = 0 et un quartz à 11,0592 MHz, pour 9600 bauds :
TH1 = 256 - (11059200 / (12 x 32 x 9600)) = 256 - 3 = 253 = 0xFD
Exactement 3. Pas d’arrondi, pas d’erreur. Chaque vitesse standard — 1200, 2400, 4800, 9600, 19200 — tombe sur un nombre entier de rechargements.
Essayez maintenant un quartz rond de 12 MHz :
TH1 = 256 - (12000000 / 3686400) = 256 - 3.26 -> must round to 3
actual baud = 10417, against a target of 9600 -> 8.5% error
Les liaisons série tolèrent environ 2–3 % d’erreur totale entre les deux extrémités. À 8,5 %, le cadrage dérive dans un octet et chaque caractère arrive corrompu. Voilà pourquoi le 11,0592 MHz existe, pourquoi il est sur chaque carte de TP 8051, et pourquoi substituer le quartz 12 MHz du tiroir produit une puce qui fonctionne parfaitement jusqu’à ce qu’on essaie d’afficher quelque chose.
Le compromis est que l’arithmétique de minutage devient malcommode : un cycle machine vaut 1,085 µs plutôt qu’une ronde 1 µs. Un quartz 12 MHz donne des cycles d’exactement 1 µs et une série inutilisable. Choisissez selon celui dont votre projet a besoin.
Temporisateurs, et générer le PWM à la main
Le 8051 a trois temporisateurs 16 bits et aucun PWM matériel. Faire varier la vitesse d’un moteur signifie générer soi-même la forme d’onde, et le faire est vraiment la meilleure chose de l’apprentissage sur cette puce.
Les temporisateurs ont quatre modes ; deux comptent :
| Mode | Largeur | Rechargement | Usage |
|---|---|---|---|
| 0 | 13 bits | Manuel | Historique ; ignorez-le |
| 1 | 16 bits | Manuel | Délais longs et précis. À recharger dans l’ISR |
| 2 | 8 bits | Automatique | Vitesses série, et tout top à période fixe |
| 3 | T0 divisé | — | Quand il faut absolument un troisième temporisateur |
Le mode 2 est celui à prendre quand on veut un top stable, parce que le rechargement se fait en matériel et qu’aucune gigue d’ISR ne s’insinue dans la période.
Un générateur PWM logiciel sur temporisateur 0, à environ 1 kHz avec 100 pas de résolution :
#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 */
}
Deux choses à en retenir. Rechargez d’abord, toujours — en mode 1 le temporisateur repart de zéro après un débordement, donc chaque instruction exécutée avant le rechargement allonge la période suivante. Et le coût est réel : cette ISR se déclenche 100 000 fois par seconde, et à 1,085 µs par cycle machine un gestionnaire d’une douzaine d’instructions consomme une part notable de tout ce que la puce peut faire. Ce budget est exactement ce qu’un périphérique PWM matériel vous épargne, et on ne l’apprécie qu’après l’avoir payé à la main.
Le budget de courant des ports
Cela piège parce que les ports du 8051 sont asymétriques d’une façon que les pièces modernes ne sont pas.
| Absorption (sortie BASSE) | Fourniture (sortie HAUTE) | |
|---|---|---|
| Par broche, P1/P2/P3 | ~10 mA | ~60 µA (rappel interne seul) |
| Par broche, P0 | ~10 mA | 0 — drain ouvert, sans rappel du tout |
| Par port, total | ~26 mA | — |
| Puce entière | ~71 mA | — |
Soixante microampères n’est pas une coquille. Le rappel interne est une faible résistance, pas un étage de sortie, donc une broche sortant un HAUT peut fournir environ un millième de ce qu’elle peut absorber.
Trois conséquences suivent directement :
Les LED vont cathode vers la broche, anode via une résistance au +5 V, et écrire 0 les allume.
Câblées dans l’autre sens, elles luisent très faiblement, ce qui ressemble à une LED atténuée ou défectueuse plutôt qu’à un
malentendu.
Ne pilotez jamais rien directement. Ni un relais, ni un buzzer à fort volume, ni un moteur. Utilisez un transistor, un réseau de pilotes ULN2003, ou un vrai pilote moteur.
Le port 0 exige des rappels externes — 10 kΩ au +5 V sur chaque broche destinée aux E/S. Sans eux, il ne peut pas sortir un haut ni en lire un fiablement, et c’est le port que la plupart des cartes de TP routent vers l’afficheur LCD.
Mémoire, et où vont les 256 octets
Huit kilo-octets de flash semblent étroits et le sont rarement. 256 octets de RAM est la vraie contrainte, et ce ne sont pas 256 octets plats :
| Adresse | Taille | Contenu |
|---|---|---|
| 00h–1Fh | 32 octets | Quatre bancs de registres, R0–R7 chacun |
| 20h–2Fh | 16 octets | Adressable au bit — 128 bits adressables individuellement |
| 30h–7Fh | 80 octets | Zone de travail générale, et où va généralement la pile |
| 80h–FFh | 128 octets | Adressage indirect seul (les SFR occupent l’espace direct) |
Le pointeur de pile est initialisé à 07h, ce qui place la pile juste au-dessus du banc de registres 1.
Si vous passez au banc 1 sans déplacer SP d’abord, vos registres et vos adresses de retour
partagent des octets, et la défaillance est spectaculaire : le programme revient à une adresse aléatoire.
SP = 0x30; en première ligne de main() est la pratique standard.
La région adressable au bit mérite d’être connue parce qu’elle est vraiment élégante. Tout bit dans 20h–2Fh peut être positionné, effacé ou testé en une seule instruction, ce qui rend les drapeaux d’état gratuits :
bit lineDetected; /* the compiler allocates this in 20h-2Fh */
bit motorEnabled; /* one bit each, one instruction to test */
Huit d’entre eux coûtent un octet, et en tester un coûte un cycle machine. Sur une puce à 256 octets de RAM, cela compte.
Dépannage
| Symptôme | Cause probable | Solution |
|---|---|---|
| La puce ne fait rien du tout | EA en l’air ou à la masse |
Attachez la broche 31 au +5 V. Vérifiez cela d’abord, à chaque fois |
La puce ne fait rien, EA est au haut |
Pas d’oscillation du quartz | Vérifiez les condensateurs de charge 33 pF et les soudures du quartz |
| Redémarre sans cesse | RST maintenu au haut | Le reset est actif au HAUT ici — vérifiez le réseau 10 µF / 10 kΩ |
| Le port 0 ne lit ni n’écrit rien | Drain ouvert, sans rappels | 10 kΩ de chaque broche au +5 V |
| LED très faible | Câblée pour fournir du courant | Cathode vers la broche ; écrivez 0 pour allumer |
| La série affiche n’importe quoi | Quartz 12 MHz | Utilisez 11,0592 MHz — 12 MHz donne 8,5 % d’erreur de vitesse |
| La série marche dans un seul sens | TX/RX non croisés, ou pas de masse commune | Croisez-les ; reliez les masses |
| Le programme revient nulle part | Pile chevauchant le banc de registres 1 | SP = 0x30; en haut de main() |
| La période PWM a de la gigue | Temporisateur rechargé tard dans l’ISR | Rechargez en première instruction, ou utilisez le mode 2 |
| Comportement erratique quand le code grandit | Plus de RAM | 256 octets au total ; vérifiez la carte du linker |
| Le programmateur ne voit pas la puce | Broches ISP utilisées, ou pas de contrôle du reset | Libérez P1.5–P1.7 et RST pendant la programmation |
8051 ou microcontrôleur moderne ?
| 8051 (AT89S52) | Arduino Uno | ESP32 | |
|---|---|---|---|
| Flash / RAM | 8 Ko / 256 o | 32 Ko / 2 Ko | 4 Mo / 520 Ko |
| PWM matériel | Aucun | 6 canaux | 16 canaux |
| Entrée analogique | Aucune | 6 × 10 bits | 18 × 12 bits |
| Vitesse série | Exige le bon quartz | Quelconque | Quelconque |
| Bibliothèques | Écrivez vous-même | Des milliers | Des milliers |
| Ce qu’on apprend | La machine | Le projet | Le système |
La position honnête : le 8051 est une pièce pédagogique, et excellente. Écrire un générateur PWM logiciel, calculer un rechargement de vitesse à la main, et découvrir qu’une broche de port ne peut pas fournir du courant vous apprend ce que chaque périphérique moderne fait réellement pour vous. Cette compréhension se transfère durablement, et c’est pourquoi l’architecture est encore aux programmes quarante-cinq ans après sa publication par Intel.
Pour un robot qui doit fonctionner, choisissez presque tout autre chose. Construire un suiveur de ligne 8051 signifie écrire le PWM, ajouter un CAN externe ou utiliser des capteurs à sortie comparateur, et calculer à la main chaque constante de minutage — tout ce qu’un Uno fournit pour le même prix. Faites-le quand l’objectif est de comprendre la machine. Prenez un Uno quand l’objectif est le robot.
Explorer le graphe
Utilisé dans ces réalisations
Projets, parcours d'apprentissage et simulateurs qui intègrent le composant 8051 Microcontroller.
Comparer
Alternatives
Questions
FAQ : 8051 Microcontroller
Qu'est-ce que le microcontrôleur 8051 ?
Le 8051 est une architecture de microcontrôleur 8 bits introduite par Intel en 1980 puis largement licenciée, si bien qu'aujourd'hui on l'achète comme puce compatible telle que l'AT89S52 d'Atmel plutôt que comme pièce Intel. Il regroupe CPU, mémoire flash, RAM, temporisateurs, port série et 32 broches d'E/S dans une seule puce 40 broches, et reste le microcontrôleur pédagogique standard dans la plupart des cursus d'ingénierie.
Pourquoi enseigne-t-on encore le 8051 alors qu'il date de 1980 ?
Parce que rien ne vous est caché. Il n'y a pas de bibliothèque centrale, pas d'abstraction de carte, et pas de PWM matériel — pour faire clignoter une LED, vous positionnez un bit dans un registre de port, et pour varier son intensité vous écrivez vous-même une interruption de temporisateur qui compte les tops. Cela en fait un mauvais choix pour livrer un produit et un excellent choix pour comprendre ce que chaque autre microcontrôleur fait à votre place.
Quelle est la différence entre un 8051 et un Arduino ?
Un Arduino Uno est une carte construite autour d'un ATmega328P ; le 8051 est une puce nue qu'il faut entourer d'un quartz, d'un circuit de reset et d'un programmateur. L'Arduino offre du PWM matériel, des entrées analogiques, un bootloader USB et un énorme écosystème de bibliothèques. Le 8051 n'offre rien de tout cela — ni CAN ni PWM — ce qui est exactement pourquoi les cours l'utilisent pour enseigner les fondamentaux.
Pourquoi le 8051 utilise-t-il un quartz à 11,0592 MHz ?
Parce qu'il rend les vitesses série exactes. L'UART divise l'horloge du cycle machine, et 11,0592 MHz se divise en précisément 9600 bauds, tandis qu'un quartz rond de 12 MHz tombe à environ 8,5 % d'écart et corrompt les données série. Ce nombre d'apparence bizarre est choisi pour l'arithmétique, pas pour la vitesse.
Combien de ports possède le 8051 ?
Quatre ports 8 bits — P0, P1, P2 et P3 — pour 32 broches d'E/S au total. Ils ne sont pas interchangeables : P0 n'a pas de rappels internes et exige des résistances externes, P3 porte les broches série, interruption et temporisateur en fonctions alternées, et P0 et P2 servent aussi de bus d'adresse et de données si vous connectez de la mémoire externe.
Pourquoi mon programme 8051 ne fait rien après flashage ?
Vérifiez d'abord la broche EA (broche 31). À la masse ou en l'air, la puce lit son programme depuis une mémoire externe inexistante, donc elle n'exécute rien du tout sans message d'erreur. EA doit être reliée au +5 V pour exécuter le code depuis la flash interne. Les deux suspects suivants sont un circuit de reset manquant et les deux condensateurs de charge du quartz.
Peut-on programmer le 8051 en C ?
Oui, et la plupart des cours le font aujourd'hui. Keil C51 est le compilateur standard de l'industrie et SDCC une alternative open source gratuite. Le C est bien plus productif que l'assembleur ici, mais le 8051 récompense de savoir ce que le compilateur produit — une multiplication d'apparence innocente ou un grand tableau local coûte bien plus cher sur une puce à 256 octets de RAM qu'ailleurs.
Le 8051 est-il encore utilisé dans de vrais produits ?
Oui, bien que rarement comme puce autonome visible. Des cœurs compatibles 8051 sont embarqués dans d'innombrables appareils — contrôleurs USB, capteurs tactiles, télécommandes et modules radio — parce que le cœur est minuscule, bien compris et sans friction de licence. Vous le rencontrerez bien plus souvent comme bloc dans une autre puce que comme le DIP 40 broches de votre paillasse.
Pour aller plus loin