Intel 8051 ou 8051 est un microcontrôleur (MC) développé par Intel en 1980 pour être utilisé dans des produits embarqués. C'est encore une architecture populaire ; de nombreux microcontrôleurs plus récents incorporent un cœur 8051, complété par un certain nombre de circuits périphériques intégrés sur la même puce, et dotés de mémoires de plus grande capacité.

La structure d'un système à microprocesseur (MP) est indiquée dans la figure ci-après.

Le processeur, parfois appelé unité centrale, est le cœur du système, puisque c'est lui qui est chargé d'exécuter les instructions du programme. Le programme est inscrit dans la mémoire ROM du système ; il s'agit d'une mémoire non volatile, c’est-à-dire qui préserve les informations qu'elle contient même en l'absence d'alimentation électrique. La mémoire vive ou RAM sert à stocker des informations durant le fonctionnement du programme : informations en provenance de l'extérieur, données intermédiaires dans les calculs... Les ports d'entrées/sorties permettent la communication du système avec le monde extérieur ; les périphériques d'entrée seront par exemple des boutons-poussoirs, des interrupteurs, des commutateurs, des compteurs, des convertisseurs analogiques/numériques... ; les périphériques de sortie seront des témoins à leds, des relais, des moteurs, des convertisseurs numériques/analogiques... En général, un circuit d'interface de puissance est placé entre le port de sortie et le périphérique commandé.

Un microcontrôleur (MC) réunit ces différentes fonctions électroniques sur une même puce. Dans les paragraphes qui suivent, nous allons décrire les principales parties du microcontrôleur 8051. Le 8051 est un MC 8 bits car il traite des données sur 8 bits ; le bus de données comporte donc 8 lignes ; comme la plupart des MC 8 bits, le 8051 gère des adresses en 16 bits, ce qui donne un espace adressable de soit .

Structure de l'unité centrale

L'unité centrale est le cœur du MC. Elle est chargée d'exécuter les instructions du programme. On peut distinguer 3 parties : traitement des données, gestion des adresses, traitement des instructions.

Traitement des données

Cette partie comporte 3 registres et une unité arithmétique et logique (UAL). Les instructions du 8051 permettent d'agir sur 1 ou 2 données de 8 bits à la fois, pas plus. Le fonctionnement est le suivant : les registres de 8 bits TMP1 et TMP2 présentent à l'UAL la ou les données à traiter. Après traitement, le résultat est placé dans l'accumulateur (Acc). Il peut être utilisé pour un nouveau calcul, envoyé dans une mémoire (RAM ou registre de travail) ou vers un port de sortie.

L'UAL comporte les circuits suivants : un additionneur pour 2 nombres de 8 bits ; le de l'addition est placé dans l'indicateur d'état C (Carry) ; un soustracteur pour 2 nombres de 8 bits ; l'emprunt éventuel généré si le résultat est négatif est aussi placé dans un indicateur d'état ; un circuit de multiplication pour 2 nombres de 8 bits ; ici, le résultat peut nécessiter jusqu'à 16 bits ; les 8 bits les plus significatifs sont placés dans un registre B prévu à cet effet ; un circuit de division pour 2 nombres de 8 bits ; il s'agit ici d'une division entière : le quotient est placé dans l'Acc, le reste dans le registre B ; 8 circuits logiques de type inverseur, ET, OU, XOU ; de nombreux tampons 3 états pour permettre les communications entre les registres, l'UAL et le bus de données aux moments adéquats.

Une série de bascules, appelées indicateurs d'état, sont automatiquement positionnées lors des opérations arithmétiques. L'état de ces indicateurs peut être testé par les instructions de branchement conditionnel.

Le 8051 comporte 32 registres de travail, organisés en 4 groupes de 8 registres. Ces registres constituent des mémoires temporaires, où l'on place provisoirement des informations dont on sait qu'elles seront nécessaires peu de temps après. L'intérêt des registres de travail, c'est que le temps d'accès est plus court que pour une lecture ou écriture en RAM, et les instructions nécessaires pour y accéder plus courtes.

Gestion des adresses

L'espace mémoire d'un 8051 est partagé en 3 zones bien distinctes : la zone programme ; pour assurer sa permanence en l'absence d'alimentation, le programme est mis en mémoire ROM ; on peut également placer dans la ROM, en même temps que le programme, des données permanentes qui pourraient être utiles : facteurs de conversion pour des calculs, informations diverses tels que noms de jours de la semaine, des mois... la zone données, en RAM ; la pile : il s'agit d'une zone de RAM qui est utilisée principalement pour préserver les adresses de retour des sous-programmes ; on peut également l'utiliser comme zone de stockage temporaire (un peu comme les registres de travail) ou pour l'échange de données entre programme principal et sous-programmes.

Le 8051 comporte donc très naturellement trois registres consacrés à la gestion des adresses. Le pointeur de programme, aussi appelé compteur ordinal (PC, Program Counter), est un registre de 16 bits qui contient à tout moment l'adresse de la prochaine instruction à exécuter. Il est mis à 0 au moment de la mise sous tension du système ; le programme doit donc impérativement commencer à l'adresse 0000h (h signifiant code hexadécimal, c'est le code le plus couramment employé pour définir les zones d'adresse dans les MP et MC). La plupart du temps, ce pointeur est simplement incrémenté chaque fois que l'on va chercher dans la ROM un octet du programme (une instruction comporte de 1 à 3 octets). Toutefois, le contenu du pointeur est complètement modifié lorsque l'on doit effectuer un branchement (saut ou sous-programme), puisque c'est alors l'adresse de l'endroit où l'on veut aller qui y est introduite. Pour permettre au MP de revenir à l'endroit de départ dans le cas des sous-programmes, on sauvegarde dans la pile l'adresse à laquelle on était avant d'effectuer le branchement. Pour lire ou écrire une donnée dans la RAM, l'adresse souhaitée doit se trouver dans le pointeur de données (DPTR, Data Pointer). Enfin, le programmeur définit la zone de RAM qu'il va attribuer à la pile en introduisant, au démarrage du programme, l'adresse de départ de la pile dans le pointeur de pile (SP, Stack Pointer). Le pointeur indique à chaque instant la plus haute adresse occupée dans la pile. Il est incrémenté au moment où l'on veut charger un nouvel octet dans la pile, et décrémenté si l'on retire un octet. Par défaut, le pointeur est initialisé à 07h au démarrage. Le pointeur peut aussi être modifié par le programme.

Traitement des instructions

Les instructions comportent de 1 à 3 octets. Le premier octet, appelé code opératoire, précise de quelle instruction il s'agit. Certaines instructions nécessitent une donnée (8 bits) ou une adresse restreinte (8 bits), voire une adresse absolue (16 bits).

Le code opératoire est placé dans le registre d'instructions, prévu à cet effet. Il est présenté à un décodeur qui détermine le type d'instruction et, le cas échéant, ira lire 1 ou 2 octets supplémentaires qui seront placés dans des registres ad hoc (donnée ou adresse).

Le bloc traitement des instructions est piloté par une horloge ; le 8051 contient tous les éléments de l'horloge, à l'exception des composants qui déterminent la fréquence d'oscillation : généralement un quartz, mais un circuit RC peut aussi être utilisé si une connaissance précise de la fréquence n'est pas nécessaire. Le bloc génère des signaux de contrôle (lecture, écriture) tant pour les autres blocs du MC que pour les circuits extérieurs éventuels (mémoires externes...).

Mémoires

Le 8051 comporte une mémoire ROM de 4Ko ; cette mémoire doit être programmée par le constructeur, au moment de la fabrication du composant. D'autres membres de la famille du 8051, tels le 8751 remplacent la ROM par une EPROM, qui peut être programmée (et effacée) par l'utilisateur. Le coût est plus élevé, mais ce composant est fort utile dans la phase de mise au point du programme puisqu'il permet de modifier le programme.

Le 8051 comporte une mémoire RAM de 128 octets. Celle-ci comporte 3 zones : les 32 octets de 00h à 1Fh peuvent être utilisés comme 4 groupes de 8 registres de travail ; les 16 octets de 20h et 2Fh sont utilisés pour les variables booléennes, c’est-à-dire des variables d'un bit ; les 80 octets qui restent, de 30h à 7Fh, constituent la RAM proprement dite ; rappelons qu'il faudra réserver une zone de RAM pour la pile, en général quelques octets dans le haut de la mémoire. Remarque : les octets qui ne sont pas utilisés comme registres de travail ou pour les variables booléennes peuvent être utilisés comme RAM conventionnelle.

Le 8051 comporte aussi un certain nombre de registres appelés SFR (Special Function Registers). Ces registres contrôlent le fonctionnement des divers périphériques intégrés : ports d'entrées/sorties, compteurs/temporisateurs etc.

La tendance, dans les systèmes utilisant un MC, est de choisir un composant disposant d'une ROM et d'une RAM de capacité suffisantes pour stocker l'entièreté du programme et l'ensemble des données. Toutefois, si nécessaire, on peut adjoindre au MC des mémoires externes. Le MC se comporte alors comme un microprocesseur. Des lignes qui sont normalement utilisées comme ports d'entrées/sorties sont converties en bus d'adresses et de données. Dans ce type d'applications, on choisira généralement des MC sans ROM interne, tels le 8031.

Modes d'adressage

Le 8051 admet 6 modes d'adressage : l'adressage implicite ; l'adressage registre, qui est utilisé pour spécifier un des 8 registres de travail du groupe actif (le groupe actif est spécifié par 2 bits dans un des SFR ; à la mise sous tension, c'est le groupe 0 qui est spécifié ; l'adressage direct restreint : utilisé pour accéder à la RAM et aux SFR ; l'adressage indirect à registre : utilisé pour accéder à la RAM interne, externe et aux ports d'E/S ; pour les adresses en 8 bits, c'est le registre de travail R0 ou R1 qui joue le rôle de pointeur de données ; pour les adresses en 16 bits, c'est le DPTR (Data Pointer) ; l'adressage immédiat, où la donnée suit le code opératoire ; l'adressage indexé : c'est une variante de l'adressage indirect à registre : l'adresse de la donnée est calculée en additionnant les contenus de l'Acc et du pointeur de programme (Acc + PC) ou du pointeur de données (Acc + DPTR).

Jeu d'instructions

Dans cette section, nous donnons un aperçu du jeu d'instructions du 8051 en employant la syntaxe du constructeur, Intel : Rr : registre de travail R0 à R7 du groupe sélectionné direct : adresse directe (RAM ou SFR) @Ri : case de RAM pointée par R0 ou R1 @DPTR : case mémoire pointée par le DPTR #data : donnée immédiate 8 bits #data16 : donnée immédiate 16 bits bit : adresse bit (dans les 16 octets pour variables booléennes et les SFR) addr16 : adresse de destination pour les branchements rel : adresse relative pour les branchements ; l'adresse est indiquée en complément à 2, de façon à pouvoir effectuer des sauts en avant ou en arrière (les nombres de 128 à 255 sont considérés comme des nombres négatifs)

Instructions de transfert

Les adresses de source et de destination peuvent être l'Acc, un registre de travail, une case de RAM interne ou externe, un port d'E/S ; la ROM ne peut servir que de source. Transferts en RAM interne La structure des instructions est : MOV destination, source copie l'octet de l'adresse source à l'adresse de destination MOV A,R7 copie le contenu de R7 dans l'Acc MOV 70h,A copie le contenu de l'Acc dans la case de RAM interne à l'adresse 70h MOV A, @R1 copie le contenu de la case dont l'adresse est en R1 dans l'Acc MOV 20h, 71h copie le contenu de la case 71h de RAM interne dans la case 20h

Transferts de et vers la RAM externe La structure des instructions est : MOVX destination, source