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.

Le circuit minimal dont un 8051 a besoin pour fonctionner. Un bloc puce AT89S52 montre six broches : VCC broche 40 câblée au rail cinq volts et GND broche 20 à la masse ; EA broche 31 câblée au rail cinq volts en rouge, annotée attacher EA au haut sinon la puce n'exécute rien ; XTAL2 broche 18 et XTAL1 broche 19 câblées sur un quartz à 11,0592 MHz, avec un condensateur de 33 picofarads de chaque patte du quartz à la masse ; et RST broche 9 câblée à un condensateur de 10 microfarads vers le rail cinq volts et une résistance de 10 kiloohms vers la masse, annotée reset actif à l'ÉTAT HAUT.
Tout ce dont un 8051 a besoin avant d'exécuter une seule instruction. EA au +5 V est le point qui empêche silencieusement une première carte de fonctionner. Télécharger le SVG
Brochage du 8051 en boîtier DIP 40 broches, dessiné verticalement avec l'encoche broche 1 en haut. La colonne de gauche va des broches 1 à 20 : broches du port 1 P1.0 à P1.7 avec leurs fonctions alternées T2, T2EX, MOSI, MISO et SCK, puis RST, puis broches du port 3 P3.0 à P3.7 notées RXD, TXD, INT0, INT1, T0, T1, WR et RD, puis XTAL2, XTAL1 et GND. La colonne de droite va des broches 40 à 21 : VCC, broches du port 0 P0.0 à P0.7 doublant AD0 à AD7, puis EA, ALE et PSEN, puis broches du port 2 P2.7 à P2.0 doublant les lignes d'adresse A15 à A8. Le code couleur sépare les ports d'E/S, les fonctions alternées du port 3, les broches d'horloge et de commande, et l'alimentation.
Le DIP 40 broches. Notez que le port 0 est inversé — la broche 32 est P0.7 et la broche 39 est P0.0 — et que les seconds noms du port 3 sont les broches série, interruption et temporisateur. Télécharger le SVG

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 0 les 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

Références