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.

Brochage du 8051 en boîtier DIP 40 broches, dessiné verticalement avec l'encoche broche 1 en haut. La colonne 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 légendées RXD, TXD, INT0, INT1, T0, T1, WR et RD, puis XTAL2, XTAL1 et GND. La colonne 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. Les couleurs séparent ports d'E/S, fonctions alternées du port 3, broches d'horloge et de commande, et alimentation.
Trente-deux des quarante broches sont des E/S. Le port 0 est numéroté à l'envers des autres, et les étiquettes alternées du port 3 abritent port série, interruptions externes et entrées de minuteries. Télécharger le SVG

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.

Le circuit minimal dont un 8051 a besoin pour tourner. Un bloc puce AT89S52 montre six broches : VCC broche 40 reliée au rail cinq volts et GND broche 20 à la masse ; EA broche 31 reliée au rail cinq volts en rouge, annoté reliez EA au haut sinon la puce ne fait rien ; XTAL2 broche 18 et XTAL1 broche 19 de part et d'autre d'un quartz 11,0592 mégahertz, avec un condensateur 33 picofarads de chaque patte du quartz à la masse ; et RST broche 9 reliée à un condensateur 10 microfarads vers le rail cinq volts et une résistance 10 kiloohms vers la masse, annoté reset actif à HIGH.
Quatre connexions et une poignée de passifs. Notez le réseau de reset : le condensateur va vers l'alimentation, pas vers la masse, car RST est actif haut. Télécharger le SVG

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.

Une carte de la mémoire données interne du 8051 dessinée en blocs empilés de l'adresse 00h en bas à FFh en haut. Depuis le bas : quatre bancs de registres 8 octets en 00h à 07h, 08h à 0Fh, 10h à 17h et 18h à 1Fh ; une région adressable au bit 16 octets en 20h à 2Fh contenant 128 bits adressables individuellement ; 80 octets de RAM libre et pile de 30h à 7Fh ; et en 80h à FFh un bloc contenant à la fois les registres spéciaux, atteints en adressage direct, et les 128 octets hauts de RAM, atteints uniquement en adressage indirect. Une flèche marque que le pointeur de pile retombe à 07h donc la pile démarre à 08h sur le banc de registres 1, et une seconde flèche marque la région 80h à FFh comme deux mémoires partageant une plage d'adresses.
Quatre régions à quatre tâches différentes. Les deux faits annotés sont ceux qui mordent : la pile tombe sur le banc de registres 1, et la moitié haute de la plage d'adresses est deux mémoires séparées. Télécharger le SVG

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

Références