Tutoriel · Débutant · 30 min de lecture
Architecture 8051 : broches, plan mémoire et registres
Ce que le 8051 contient vraiment : un cœur Harvard, quatre ports aux caractères différents, 256 octets de RAM, et un cycle machine qu'on peut compter.
Introduction
La plupart des cours de microcontrôleurs ouvrent sur le 8051, et la plupart des étudiants le rencontrent comme une liste de faits à mémoriser : quatre ports, 128 octets de RAM, deux minuteries, six interruptions. Mémorisé ainsi, il s’oublie. Compris comme un ensemble de compromis délibérés de 1980 — quand la RAM coûtait cher et qu’une puce devait tenir en 40 broches — il explique presque tout du fonctionnement des petits microcontrôleurs encore aujourd’hui.
Ceci est la visite d’architecture : ce qu’il y a dans le boîtier, comment la mémoire est découpée, et pourquoi l’arithmétique temporelle est inhabituellement facile. Les deux suites couvrent le pilotage des broches et la génération de PWM depuis une minuterie.
« 8051 » est une famille, pas une puce
Intel a introduit le MCS-51 en 1980 puis a largement licencié le cœur, personne n’achète donc un 8051 Intel aujourd’hui. Ce qu’on achète est un compatible — très majoritairement l’AT89S52 d’Atmel (désormais Microchip), qui ajoute une mémoire flash reprogrammable sur quatre broches au lieu de la ROM effaçable aux UV de l’original.
Les différences à connaître :
| 8051 (original) | AT89S52 (celui possédé) | |
|---|---|---|
| Mémoire programme | 4 Ko ROM | 8 Ko flash |
| RAM interne | 128 octets | 256 octets |
| Minuteries | 2 | 3 |
| Sources d’interruption | 5 | 6 |
| Programmation | ROM masquée en usine | En système, sur broches SPI |
Tout le reste — jeu d’instructions, ports, plan des registres, temporisation — est identique. Le matériel de cours écrit pour le 8051 s’applique inchangé à la puce sur votre bureau.
Ce qu’il y a dans le boîtier
Un DIP 40 broches contient un ordinateur complet : un CPU 8 bits, de la flash programme, de la RAM données, trois minuteurs/compteurs, un port série duplex intégral, un contrôleur d’interruptions, et quatre ports d’E/S 8 bits. Il n’y a aucun système d’exploitation et rien ne tourne que votre code.
Quatre broches ne sont pas des E/S et toutes quatre doivent être correctes avant tout démarrage : XTAL1 et XTAL2 pour le quartz, RST pour le réseau de reset, et EA pour choisir la mémoire programme interne ou externe. Avec EA faux, la puce ne fait rien, silencieusement.
Harvard : code et données sont des mondes différents
Le 8051 garde la mémoire programme et la mémoire données dans des espaces d’adressage séparés. Une adresse 0x0030 signifie une chose pour une lecture d’instruction et tout autre chose pour un accès données — ce sont des mémoires différentes, atteintes par des instructions différentes.
D’où les classes de stockage des compilateurs C pour 8051, que d’autres plateformes masquent. Une chaîne littérale jamais modifiée appartient en mémoire code, où il reste des kilo-octets. Mettez-la en data par accident et elle mange les 256 octets voulus pour tout le reste :
// In code (flash) — costs nothing from your 256 bytes of RAM.
const char code banner[] = "Line follower v1";
// In RAM — 17 of your 256 bytes, gone, for a string that never changes.
const char banner_bad[] = "Line follower v1";
Sur Arduino, cette distinction est la raison d’être de PROGMEM. Sur 8051 ce n’est pas une optimisation, c’est la différence entre un programme qui tient et un qui ne tient pas.
Le plan de la RAM interne
Les 256 octets de RAM interne ne sont pas un bloc-notes plat. Ils sont divisés en régions aux capacités différentes, et savoir lesquelles est l’essentiel du plan mémoire.
00h–1Fh — quatre bancs de registres. R0 à R7 ne sont pas des emplacements fixes ; c’est une fenêtre sur l’un des quatre bancs de 8 octets, sélectionnée par deux bits (RS0 et RS1) dans le mot d’état programme. Changer de banc est une écriture de deux bits, donc un moyen très bon marché de donner à une interruption ses propres registres au lieu d’en empiler et dépiler huit.
20h–2Fh — adressable au bit. Ces 16 octets sont aussi adressables comme 128 bits individuels, 00h à 7Fh. Le 8051 possède de vraies instructions monobit — SETB, CLR, JB, JNB — donc un drapeau y coûte un bit et une instruction plutôt qu’un octet et un masque. D’où le type bit des compilateurs C pour 8051, inexistant ailleurs.
30h–7Fh — libre et pile. Quatre-vingts octets pour vos variables et votre pile d’appels, et c’est la ressource vraiment épuisée.
80h–FFh — deux mémoires, une plage d’adresses. L’adressage direct y atteint les registres spéciaux ; l’adressage indirect (via R0 ou R1) atteint les 128 octets hauts de RAM. Mêmes nombres, mémoires différentes, sélectionnées par la forme d’instruction utilisée. Sur le 8051 original à 128 octets, la RAM haute n’existe simplement pas.
Les registres spéciaux sont juste de la mémoire
Chaque périphérique du 8051 se commande en écrivant des octets à des adresses dans la plage directe 80h–FFh. Il n’y a pas d’API — il y a un registre, et mettre un bit dedans change ce que fait le silicium.
| Registre | Adresse | Ce qu’il commande |
|---|---|---|
P0 P1 P2 P3 |
80h, 90h, A0h, B0h | Les quatre ports d’E/S |
TMOD |
89h | Sélection de mode des minuteurs 0 et 1 |
TCON |
88h | Bits de marche et drapeaux de dépassement des minuteurs |
TH0 TL0 TH1 TL1 |
8Ch, 8Ah, 8Dh, 8Bh | Registres de comptage des minuteurs |
SCON SBUF |
98h, 99h | Commande et données du port série |
IE IP |
A8h, B8h | Activation et priorité des interruptions |
PSW |
D0h | Drapeaux, et bits de sélection du banc de registres |
SP |
81h | Pointeur de pile |
Écrire P1 = 0x0F; en C est un stockage à l’adresse 90h, et huit broches changent d’état. Cette franchise est tout l’attrait de la puce comme outil pédagogique.
Une temporisation comptable
Un cycle machine vaut douze périodes d’oscillateur sur un cœur 8051 classique, et la plupart des instructions prennent un ou deux cycles machine. Ce rapport fixe permet de calculer exactement le temps d’exécution plutôt que le mesurer :
machine cycle = 12 / f_osc
at 11.0592 MHz : 12 / 11 059 200 = 1.085 µs
at 12 MHz : 12 / 12 000 000 = 1.000 µs
Une boucle de trois instructions monocycle à 11,0592 MHz prend 3,26 µs, à tous les coups, sans cache, sans pipeline, et sans gigue d’interruption au-delà de celles activées. Très peu de processeurs modernes permettent un tel raisonnement, et c’est pourquoi le 8051 survit dans des périphériques critiques en temps.
Pourquoi le quartz est à 11,0592 MHz
Ce nombre semble arbitraire et ne l’est pas. Le port série dérive son débit en divisant l’horloge de cycle machine, et 11,0592 MHz se divise vers les débits standards exactement :
baud = f_osc / (12 × 32 × (256 − TH1))
11.0592 MHz, TH1 = 253 : 11 059 200 / (12 × 32 × 3) = 9600.0 ✓ exact
12 MHz, TH1 = 253 : 12 000 000 / (12 × 32 × 3) = 10416.7 ✗ 8.5% off
Un UART tolère quelques pour cent d’erreur ; 8,5 % brouille chaque trame. Si votre carte 8051 imprime n’importe quoi sur le série, regardez le quartz avant votre code.
Ce que le 8051 n’a pas
Deux absences façonnent tout projet 8051, invisibles sur une liste de fonctions :
- Pas de convertisseur analogique-numérique. Lire un potentiomètre, une thermistance ou un capteur de ligne analogique exige une puce CAN externe comme l’ADC0804. Il n’y a pas de
analogRead()à appeler. - Pas de matériel PWM. Rien sur la puce ne génère une forme d’onde à rapport cyclique variable. Varier une LED ou une vitesse moteur impose de construire la PWM depuis une interruption de minuterie, et de la payer en temps CPU.
Un Arduino Uno a les deux intégrés. Voilà la comparaison honnête : le 8051 n’est pas un Arduino moins bon, c’est la couche sous-jacente, avec les conforts retirés pour voir ce qu’ils faisaient.
Quand ça tourne mal
- La carte est morte et rien ne chauffe. Vérifiez qu’EA (broche 31) est à +5 V. Flottant ou à la masse, la puce lit du code en mémoire externe inexistante et n’exécute rien, sans aucun symptôme.
- Elle redémarre sans cesse, ou ne démarre jamais. Le reset du 8051 est actif haut. Le circuit à la mise sous tension est un condensateur 10 µF de +5 V vers RST et une résistance 10 kΩ de RST à la masse. Le câbler comme un reset actif bas maintient la puce en reset permanent.
- La sortie série est illisible. Presque toujours le quartz. Une pièce à 12 MHz ne peut pas atteindre les débits standards.
- Les variables se corrompent sans raison. Vous êtes probablement à court des 80 octets en 30h–7Fh, ou votre pile a grandi vers vos variables. Vérifiez la sortie de plan mémoire de votre compilateur.
- Les registres changent seuls dans une interruption. Le pointeur de pile retombe à 07h, donc la pile démarre à 08h — qui est le banc de registres 1. Soit déplacez SP dans votre code de démarrage, soit laissez le banc 1 tranquille.
Explorer le graphe
Fait partie de ces réalisations
Les projets et parcours d'apprentissage qui incluent ce tutoriel.
Pour aller plus loin