Vous êtes sur la page 1sur 29

Chapitre 2 : Le microcontrôleur 8051

Chapitre 2 Le microcontrôleur 8051

1. Introduction

Le 8051 est un microcontrôleur 8 bits qui a été conçu par Intel en 1981 pour être utilisé
dans des systèmes embarqués. Il se base sur l’architecture Harvard et utilise un jeu
d’instructions du type CISC. Ses premiers modèles se présentent physiquement sous
forme d’un boitier DIP (Dual Inline Package) de 40 broches.
Le 8051 reste aujourd'hui l’un des microcontrôleurs les plus populaires. Son succès a
amené de nombreux constructeurs de circuits intégrés (comme PHILIPS, DALLAS,
ATMEL, SIEMENS…etc.) a la fabrication d’un important nombre de ses dérivés désignés
par la famille MCS-51.

Figure 1 : Microcontrôleur 8051.

Le 8051 possède les caractéristiques suivantes :


• un CPU à 8 bits conçu pour la commande d'applications diverses ;
• 32 entrées/sorties bidirectionnelles qui peuvent être adressées individuellement
réparties en 4 ports : P0, P1, P2, P3 ;
• 128 octets de RAM interne à utilisation générale ;
• 21 registres spécialisés ;
• un port série en full duplex (données circulent de façon bidirectionnelle);
• 5 sources d'interruptions avec 2 niveaux de priorité ;
• 2 Compteurs/Timers sur 16 bits T0 et T1 fonctionnant suivant 4 modes ;
• un oscillateur interne nécessitant un quartz externe : la fréquence d'oscillation
maximale admise est de 12 MHz ;
• Adressage de 64 Ko de mémoire de données ;
• Adressage de 64 Ko de mémoire de programme ;

1
Chapitre 2 : Le microcontrôleur 8051

• un jeu d'instructions assez développé.

2. Brochage du 8051

Figure 2 : Brochage du 8051.

Port P0 :
C'est un port 8 bits bidirectionnel à usage général. Il a la fonction secondaire de port
transportant le bus de données et les 8 bits inférieurs du bus d’adresse permettant
d'accéder à une mémoire externe de type RAM de données ou EEPROM programme.

Port P1 :
C'est un port 8 bits bidirectionnel à usage général.

Port P2 :
C'est un port 8 bits bidirectionnel à usage général avec la fonction secondaire de port
multiplexé transportant les 8 bits supérieurs des bus de données et d'adresse.

Port P3 :
C'est un port 8 bits bidirectionnel à usage général avec les fonctions secondaires :
P3.0 = RxD : Entrée de l'interface série ;
P3.1 = TxD : Sortie de l'interface série ;
P3.2 = /INT0 : entrée d'interruption ;
P3.3 = /INT1 : entrée d'interruption ;
P3.4 = T0 : entrée horloge du timer 0 ;
P3.5 = T1 : entrée horloge du timer 1 ;
P3.6 = /WR : sortie écriture de la mémoire externe ;
P3.7 = /RD : sortie lecture de la mémoire externe ;
EA : (External Access) si EA=0, les instructions sont recherchées dans la mémoire
programme externe.

2
Chapitre 2 : Le microcontrôleur 8051

RST : Entrée d'initialisation. Un état haut pendant deux cycles machines sur cette broche
entraîne une initialisation du microcontrôleur.

PSEN : (Program Store Enable) passe à 0 lorsque le microcontrôleur va rechercher une


instruction en mémoire programme externe.

ALE : (Adress Latch Enable) prévue pour commander le démultiplexage temporel du port
P0.
 ALE = 1, P0 transporte la partie basse du bus d'adresse : A0 à A7.
 ALE = 0, P0 sert de bus de donnée.

XTAL1 et XTAL2 : pour générer le signal d’horloge, un quartz est placé entre ces deux
broches avec deux condensateurs (de 22pF).

3. Organisation interne du 8051

Figure 3 : Représentation interne du 8051.

3.1 Unité centrale de traitement (CPU)

La CPU du 8051 consiste en l’unité de commande unité arithmétique et logique (UAL)


associée à des registres. L’UAL peut exécuter des opérations arithmétiques et logiques sur
8 bits aussi bien que sur un seul bit. Elle peut traiter une ou deux données seulement à la
fois.

3
Chapitre 2 : Le microcontrôleur 8051

3.2 Oscillateur (circuit générateur du signal d’horloge)

Le 8051 a un circuit oscillateur interne qui utilise un quartz externe et qui a comme
fréquence standard 12 MHz. Cependant, si le 8051 fait usage de son port série, il est
préférable d’utiliser la fréquence 11,0592 MHz.

La cadence de traitement des instructions est pilotée par un signal d’horloge. Cela signifie
que le temps d’exécution d’une instruction dure un certain nombre de périodes d’horloge.
Dans le 8051 la durée d’exécution d’une instruction est précisée en cycle machine dont la
période est égale à 12 fois la période d’horloge.

Figure 4 : Durée d’un cycle machine en fonction de la période d’horloge.

3.3 Ports entrées/sorties

Le 8051 dispose 4 ports de 8 bits pour communiquer avec le monde extérieur où chacun
d’eux est associé à un registre qui porte son nom (P1, P2, P3 et P4). La lecture ou l’écriture
sur les ports E/S se fait en lisant ou en chargeant les données sur ces registres. Pour
configurer un port E/S en lecture il faut charger la valeur FF h dans le registre
correspondant et pour le configurer en écriture on doit charger la valeur 00 h puis la
valeur à écrire. De même, on peut configurer une broche individuelle en lecture ou en
écriture en mettant 1 ou 0 logique dans le bit approprié du registre du port de cette
broche.

3.4 Mémoire du 8051

Le 8051 possède une mémoire de données interne RAM de 128 octets et une mémoire de
programme interne de type ROM de 4 Ko. De plus, une zone registre adressable
comportant les registres internes de l'UC (accumulateur, stackpointer…) et les registres
de gestion des entrées/sorties et des auxiliaires.

4
Chapitre 2 : Le microcontrôleur 8051

Pour les applications un peu plus gourmandes en mémoire on peu lui ajouté une mémoire
programme externe de 64 Ko ainsi qu’une mémoire de données externe également de 64
Ko.

ROM interne

La mémoire programme interne de type ROM est de 4ko avec un espace d’adressage de
0000h à 0FFFh. Puisque cette plage d’adresse est partagée avec la mémoire programme
externe, la ligne EA est utilisée pour distinguer l'accès à la mémoire interne ou externe.

RAM interne

Le 8051 possède 128 octets de RAM interne adressable de 00 à 7F. Cette mémoire est
organisée en 3 zones :

Les bancs de registres (00h 1Fh) : Les 32 premier octets sont utilisés soit comme
position mémoire pour les données soit comme registres de travail appelés aussi registres
universels organisés en 4 bancs. Chaque banc comporte 8 registres d’un octet portant les
noms de R0 à R7.

Zone mémoire adressable par bits (20h2Fh) : Les 16 octets suivants constituent une
zone adressable bit par bit. (L'adressage par octet reste évidemment valable).

Zone RAM entre 30h et 7Fh : cette zone RAM est sans fonction particulière elle est destinée
au travail avec les données de l'utilisateur.

A la mise sous tension (RESET), le processeur place le début de la pile à l'adresse 07h
(SP=07h), ce qui signifie que l'écriture dans la pile commencera à l'adresse 08h. Dans le
cas où l'on désire utiliser les bancs de registres, il est préférable de placer la pile dans un
autre endroit en changeant la valeur su SP (60h par exemple).

De même que pour la mémoire programme, la plage d’adresse 00h  FFh est partagée
par la RAM interne (plus les registres spéciaux) et la RAM externe. Le 8051 fait la
distinction entre elles (RAM interne et RAM externe) au niveau de l’instruction de
transfert des données utilisée : MOV pour RAM interne et MOVX pour RAM externe.
5
Chapitre 2 : Le microcontrôleur 8051

Figure 5 : RAM interne du 8051.

6
Chapitre 2 : Le microcontrôleur 8051

3.5 Interfaçage des mémoires externes

Pour son interfaçage avec les mémoires de données et de programme externes, le 8051
utilise les ports P0 (octet faible) et P1(octet fort) sortie pour le bus d’adresse (16 bits) et
le port P0 comme entrée/sortie pour le bus de données (8 bits). La séparation de l’octet
des données de celui du poids faible d’adresse se fait en mémorisant l’adresse lorsque
celle-ci est présente sur P0, à l’aide d’un circuit verrou (latch), qui est constitué par un
ensemble de bascules D.

Fonctionnement :

- si ALE = 1, le verrou est transparent (Q = D) ;


- si ALE = 0, mémorisation de la dernière valeur de D sur les sorties Q ;
- les données ne sont envoyées ou reçu par le microcontrôleur qu’après le
verrouillage des latchs.

Figure 6 : Interfaçage 8051 avec les mémoires externes

7
Chapitre 2 : Le microcontrôleur 8051

3.4 Registres spéciaux SFR (Special Function Registers)

Le 8051 possède 21 registres spéciaux nécessaire au fonctionnement et à la configuration


du microcontrôleur, on y trouve aussi des registres pour accéder aux ports d'E/S et aux
timers. Ces registres sont accessibles comme des positions mémoire sauf que leurs
adresses se situent dans l'espace 80h – FFh. 11 registres SFR sont adressables par bit.

Figure 7 : Registre SFR.

8
Chapitre 2 : Le microcontrôleur 8051

Accumulateur A (E0h) : Il est référencé par ACC sur le tableau, cependant dans les
instructions on le désigne par A.

Accumulateur B (F0h) : Il est utilisé tout particulièrement pour l'exécution des


multiplications et divisions. Mais il peut être considéré aussi comme un registre
quelconque.

P0 (80h) : Registre d'accès au port P0

P1 (90h) : Registre d'accès au port P1

P2(A0h) : Registre d'accès au port P2

P3 (B0h) : Registre d'accès au port P3

PSW (D0h) :

PSW (Program Status Word) est un registre d'état qui contient les drapeaux positionnés
après les instructions ainsi que les bits de sélection de banks.

P : parité de l'accumulateur = 1 si le nombre de 1 dans l'accu est impair (odd)


OV : Débordement (Overflow)
RS0, RS1 : pour sélectionner un bank de registres

FO : drapeau à usage général


AC : Carry auxiliaire pour les calculs en BCD
CY : Carry.

9
Chapitre 2 : Le microcontrôleur 8051

SP (81h) : Pointeur de pile. Lors d'un reset le pointeur est initialisé à 07H, et par
conséquent la pile débute à l'adresse 08H. L'utilisateur peut changer la valeur de SP pour
placer la pile dans une autre zone de la RAM.

DPL, DPH (82h, 83h) : Partie basse et partie haute du pointeur de donnée DPTR utilisé
avec certaines instructions d'accès à la RAM externe.

SBUF (99h) : C'est le buffer d'entrée sortie du port série. Tout octet écrit dans SBUF et
transmis en série sur TxD et tout octet reçu sur RxD peut être lu dans SBUF.

TL0, TH0 (90h, 92h) : Partie basse et haute du registre double qui permet d'accéder au
Timer T0.

TL1, TH1 (91h, 93h) : Partie basse et haute du registre double qui permet d'accéder au
Timer T1.

SCON (98h) : (Serial Control) ce registre adressable par bits sert à la configuration du port
série

TCON (88h) : (Timer Control) ce registre adressable par bits permet le contrôle des timers
T0 et T1. Il contient aussi certains bits relatifs à l'utilisation des interruptions externes.

TMOD (89h) : (Timer mode) ce registre permet de définir le mode de fonctionnement des
timers T0 et T1.

IE (A8h) : (Interrupt Enable) ce registre permet la validation ou l'interdiction des


interruptions. Les premiers 7 bits permettent de valider les interruptions
individuellement alors que le 8ème bit permet une validation globale de toutes les
interruptions.

IP (B8h) : (Interrupt Priority) ce registre permet de définir la priorité relative pour


chaque interruption. Sur le 8051 une interruption peut avoir deux niveaux de priorité,
basse (0) et Haute (0). Une interruption ne peut être interrompue que par une
interruption de priorité supérieure.

PCON (87h) : (Power Control) registre de contrôle de la consommation du 8051.

10
Chapitre 3 : Jeu d’instruction du 8051

Chapitre 3 Jeu d’instructions du 8051

3.1 Modes d’adressage

Le 8051 possède 4 modes d’adressage : l’adressage registre, l’adressage immédiat,


l’adressage direct et l’adressage indexé ou indirect.
Remarque : Dans la suite de ce cours les instructions sont écrites avec des caractères
majuscules seulement pour des raisons de lisibilité. En fait, la quasi-totalité des logiciels
d’assembleur du 8051 ne font pas de distinction entre les caractères minuscules des
caractères majuscules.
Adressage registre : Dans ce mode d’adressage l’opérande est dans un registre.
Exemple :
MOV A , R3
ADD A , R4
INC R2

Adressage immédiat : L’opérande est précisé dans l’instruction.


Exemple :
MOV A , #15 ; 15 est la donnée en décimale
ADD A , #15 H ; ici 15 est la donnée en hexadécimale.

Adressage direct : L’adresse de l’opérande est précisée dans l’instruction. Cet adressage
est valable seulement pour la RAM interne et les SFR (car la taille des adresses de la RAM
externe est 2 octets).
Exemple :
MOV A , 50H ;50 est l’adresse en hexadécimal
ADD A , 50H ;de l’opérande

Adressage indirect (indexé) : C’est le registre qui contient l’adresse de l’opérande qui est
explicité dans l’instruction. Ce mode d’adressage est valable pour les RAM interne et
externe mais pas pour les SFR. Pour la RAM interne (adresse 8 bits) on utilise les registres
indexes R0 et R1 et pour la RAM externe (adresse 16 bits) on utilise le registre indexe
DPTR.
Exemple :
MOV A , @R0 ; A@R0 (donnée dont l’adresse est
ADD A , @R1 dans R0)
MOV @R0 , P1
MOVX @DPTR , A
MOVX A , @A+DPTR ; A @(A+DPTR)

1
Chapitre 3 : Jeu d’instruction du 8051

3.2 Adressage de bit

8051 possède un processeur qui travaille sur des bits individuels. Pour ce processeur
l’accumulateur est C qui est impliqué dans la plupart des opérations qui manipulent un
seul bit.

Figure 1 : Zone RAM et SFR adressable par bit

Exemple :
MOV C , 45h ;C (45h) 45h est l’adresse d’un bit.
MOV P1.2 , C ;(bit 2 de P1) (C)
MOV RS0 , C ;(bit RS0 de PSW) (C)
CLR C ; C0
SETB P3.0 ; (bit 0 de P3)1

3.3 Format des instructions

Le 8051 a 111 instructions (attention : mov a,#2, mov b,#2, mov a,b, mov b,a, mov
a,r0,…etc. sont des instructions différentes) :
49 instructions de taille de 1 octet OPCODE

45 instructions de taille de 2 octets OPCODE OPERANDE

17 instructions de taille de 3 octets OPCODE OPERANDE1 OPERANDE2

2
Chapitre 3 : Jeu d’instruction du 8051

3.4 Jeu d’instructions du 8051

3.4.1 Instructions de transfert de données

MOV : déplace les données entre les registres et la mémoire interne. Elle peut également
déplacer une donnée directement entre deux cases de la RAM interne
Exemple :
MOV 45H , 20H ; (45h) (20h) charge le contenu de 20h dans 45h
MOV 45H , #53 ; 45h  53 charge 53 (en décimal) dans 45h

Les instructions du genre MOV Rn , Rn (Rn :R0, R1, …R7) ne sont pas autorisées. Dans
ce cas il faut spécifier au moins une adresse d’un registre Rn.
Exemple :
MOV R1 , 04 ; R1 (R4) 04 est l’adresse de R4
MOV 01 , 04 ; R1 (R4) 01 est l’adresse de R1
MOV 01 , R4 ; R1 (R4)
PUSH et POP : Sauvegarde et récupère une donnée de la pile.
Exemple :
MOV Acc , 10 ; A 10
MOV B , 20 ; B 20
PUSH Acc ; (case 08h de la pile) (A)
PUSH B ; (case 09h de la pile) (B)
POP 05 ; R5(contenu de la case 09h)
POP 07 ; R7(contenu de la case 08h)

RAM interne Push Acc


Push B

0Ah 0Ah 0Ah


09h 09h 09h 20
08h 08h 10 08h 10
07h 07h 07h
Initialement SP=07 SP=08 SP=09

POP 05
POP 05

0Ah 0Ah
09h 20 09h 20
08h 10 08h 10
07h 10 07h
SP=07 SP=08

3
Chapitre 3 : Jeu d’instruction du 8051

Les opérations suivantes ne sont pas autorisées :


PUSH A
PUSH Rn
POP A
POP Rn

XCH : Fait l’échange des données entre l’accumulateur A et une case mémoire ou un
registre.
Exemple :
XCH A , B ; (A)(B)
XCH A , R0 ; (B)(R0)
XCH A , @R0 ; (A)(@R0)

Syntaxe :
XCH A , <octet>
XCH A , <registre>

XCHD : Echange les digits (4bits) de poids faible entre A et l’octet indexé dans R0 ou R1.
Syntaxe : XCHD A , @Ri ; i=1 ou 2.

MOVX : Permet la lecture ou l’écriture d’un octet dans la RAM externe en passant toujours
par l’accumulateur. MOVX utilise l’adressage indexé (indirecte).
Exemple :
MOVX A , @R0 ; A (@R0) charge le contenu de la case de
; mémoire de données externe dont l’adresse
; est dans R0 dans A.
MOVX A , @DPTR ; A (@DPTR)
MOVX @R1 , A ; @R1 (A) charge le contenu de A dans la
; case de mémoire dont l’adresse et dans R1
MOVX @DPTR , A ; @DPTR(A)

MOVC : Permet de déplacer un octet de la mémoire programme (ROM interne ou externe)


vers l’accumulateur A.
Syntaxe : MOVC A , @A+<registre DPTR ou registre PC>

Exemple :
MOVC A , @A+DPTR ; A (@(A+DPTR))
MOVC A , @A+PC ; PCPC+1
; A (@(A+PC))

3.4.2 Instructions arithmétiques


ADD : additionne le contenu de l’accumulateur A avec un octet et met le résultat dans A.

4
Chapitre 3 : Jeu d’instruction du 8051

Syntaxe : ADD A , <octet>

Exemple :
ADD A , R5 ; A (A)+(R5)
ADD A , 63H ; A(A)+(@63h)
ADD A , #63H ; A(A)+63h
ADD A ,@R0 ; A(A)+(@R0)

ADDC : Additionne un octet l’accumulateur et le contenu du bit drapeau C de PSW.


Syntaxe : ADDC A , <octet>

Exemple :
ADDC A , R5 ; A (A)+(R5)+(C)
ADDC A , 63H ; A(A)+(@63h)+(C)
ADDC A , #63H ; A(A)+63h+(C)
ADDC A ,@R0 ; A(A)+(@R0)+(C)

SUBB : Fait la soustraction d’un octet et le contenu du drapeau de la retenu du contenu de


A et met le résultat dans A.
Syntaxe : SUBB A , <octet>

Exemple :
SUBB A , R5 ; A (A)-(R5)-(C)
SUBB A , 63H ; A(A)-(@63h)-(C)
SUBB A , #63H ; A(A)-63h-(C)
SUBB A ,@R0 ; A(A)-(@R0)-(C)

MUL : Multiplie le contenu de A par le contenu de B et met le résultat : octet faible dans A
et octet fort dans B.
Syntaxe : MUL AB

Exemple :
MOV A , #10h ; A10H
MOV B , #1FH ; B1FH
MUL AB ; 10H ×1FH=01F0H, AF0h et B01h.

DIV : Divise le contenu de A par le contenu de B et met le quotient dans A et le reste dans
B.
Syntaxe : DIV AB

Exemple :
MOV A , #250 ; A250
MOV B , #18 ; B18
DIV AB ; 250=18 ×13+16, A13 et B16.
5
Chapitre 3 : Jeu d’instruction du 8051

INC : Incrémente un octet ou le contenu du DPTR de 1.


Syntaxe : INC <octet>
INC DPTR

Exemple :
INC A ; A(A)+1
INC @R1 ; @R1(@R1)+1
INC 40H ;40h(40h)+1
INC P1
INC DPTR

3.4.3 Instructions logiques


ANL : Effectue un ET logique au niveau bit entre deux opérandes de taille d’un octet et met
le résultat dans l’opérande de destination.
Syntaxe : ANL <destination> , <source>

Exemple :
MOV A , #10001001B ; A10001001 B
MOV R1 , #10010101B ; R110010101 B
ANL A , R1 ; A10000001=10001001 ET 10010101
ANL A , 30H
ANL A , @R1
ANL B , #20H

ORL : Effectue un OU logique au niveau du bit entre deux opérandes de taille d’un octet et
met le résultat dans l’opérande de destination.
Syntaxe : ORL <destination> , <source>

Exemple :
MOV A , #10001001B ; A10001001 B
MOV R1 , #10010101B ; R110010101 B
ORL A , R0 ; 10011101=10001001 OU 10010101
ORL A , 30H
ORL A , @R1
ORL B , #20H

XRL : Effectue un OU exclusif logique au niveau du bit entre deux opérandes de taille d’un
octet et met le résultat dans l’opérande de destination.
Exemple :
MOV A , #10001001B ; A10001001 B
MOV R1 , #10010101B ; R110010101 B
XRL A , R0 ; A00011100=10001001 XOR 10010101

6
Chapitre 3 : Jeu d’instruction du 8051

XRL 30H, A
XRL A , @R1
XRL 30H , #20H

CLR : Met A ou un bit spécifié à 0.


Exemple :
CLR A ; A00h
CLR C ; C0 B
CLR 10h ; (bit d’adresse 10h)0 B
CLR P1.3

CPL : Complémente logiquement l’accumulateur A ou le bit spécifié.


Exemple :
MOV A , #10001001B ; A10001001 B
CPL A ; A01110110 B
CPL C ; (bit C)0 B
CPL 30H ; (bit d’adresse 30h)0 B
CPL P2.2

3.4.4 Instructions de rotation


RL : Rotation d’un bit du contenu de A vers la gauche
Syntaxe : RL A

Exemple :
MOV A , #11000101B ; A11000101 B
RL A ; A10001011 B

RLC : Rotation d’un bit du contenu de A vers la gauche à travers le bit C.


Exemple :
MOV A , #11000101B ; A11000101 B
CLR C ; C0 B
RLC A ; A10001010 B et C1 B

RR et RRC : Ces deux instructions effectuent les mêmes opérations que RL et RLC
respectivement, cependant le sens de rotation dans ce cas et vers la gauche.
SWAP : Echange le digit de poids faible contre celui de poids fort dans l’accumulateur.
Exemple :
MOV A , #11000101B ; A11000101 B
SWAP A ; A01011100 B

7
Chapitre 3 : Jeu d’instruction du 8051

3.4.5 Instructions de branchement


Les instructions de branchement permettent de modifier l’ordre de l’exécution des
instructions d’un programme. On peut les classer en 3 catégories :
- Sauts inconditionnels.
- Sauts conditionnels.
- Appel de sous-programmes.
Les instructions de saut remplacent le contenu du registre PC (Program Counter) par
l’adresse de l’instruction de destination qui peut être spécifiée soit par l’offset entre
l’adresse de l’instruction de destination et l’adresse de l’instruction courante, soit en
donnant directement l’adresse de l’instruction de destination.
Il existe pour le 8051 3 types de sauts selon la taille de l’offset qui sépare l’adresse de
destination et l’adresse courante.
Saut court relatif : Peut se faire seulement dans l’intervalle [PC-128 , PC+128]. Dans ce cas
la taille de l’instruction du saut est 2 octets ; un octet contient l’opcode et le deuxième
octet contient l’offset.

1er octet 2ième octet


Opcode Offset relatif

Saut court absolu : Dans ce cas l’instruction du saut utilisent une adresse de 11 bits qui
substitue les 11 bits de poids faible du PC. Cela signifie que l’adresse de destination reste
dans le même bloc de 2 Ko que l’adresse courante. Le codage de l’instruction se fait d’une
façon particulière : les 3 bits de poids fort de l’adresse de destination complète l’opcode.

1er octet 2ième octet


A10 A9 A8 Opcode A7 A6 A5 A4 A3 A2 A1 A0

Saut long absolu : L’instruction du saut utilise une adresse de 16 bits, ce qui signifie que la
portée de ce saut est 64 Ko.
1er octet 2ième octet 3ième octet
Opcode A15 …A8 A7 …. A0

3.4.6 Instructions d’appel de sous-programmes


Les instructions d’appel de sous-programmes stockent le contenu du registre PC dans la
pile pour le récupérer ensuite à la fin du sous-programme. Après cet empilement, le
contenu de PC est remplacé totalement ou partiellement par l’adresse du début du sous-
programme.
ACALL : Effectue un saut absolu inconditionnel vers un sous-programme.

Exemple :
8
Chapitre 3 : Jeu d’instruction du 8051

ACALL Sousprg ;PC(PC)+2


;SP(SP)+1
;@SP(PC(bits :7-0))
;SP(SP)+1
;@SP(PC(bit :15-8))
;PC(bits :10-0)adresse de 11 bits

LCALL : Réalise un saut long absolu inconditionnel vers un sous-programme. Pour repérer
la position de retour, le PC est incrémenté de 3 (car la taille de l’instruction est 3 octets)
puis empilé. Il sera dépilé à la fin du sous-programme.

Exemple :
LCALL Sousprg ;PC(PC)+3
;SP(SP)+1
;@SP(PC(bits :7-0))
;SP(SP)+1
;@SP(PC(bit :15-8))
;PCadresse de 16 bits

3.4.7 Instructions des sauts inconditionnels


AJMP : Effectue un saut absolu inconditionnel. Sa différence avec ACALL est que le saut
n’est pas vers un sous-programme et donc il n’est pas nécessaire d’empiler le PC.
Exemple :
AJMP Etiq ;PC(PC)+2
;PC(bits :10-0)adresse de 11 bits

LJMP : Effectue un saut long absolu inconditionnel.


Exemple :
LJMP Etiq ;PC(PC)+3
;PCadresse de 16 bits

SJMP : Effectue un saut court relatif inconditionnel.


Exemple :
SJMP Etiq ;PC(PC)+2
;PC(PC)+(offset de 8 bits)

JMP : Effectue un saut long absolu inconditionnel vers l’instruction d’adresse A+DPTR.
Syntaxe : JMP @A+DPTR ; PC(A)+(DPTR)

Exemple :
MOV A , #4
MOV DPTR , ETQ0
JMP @A+DPTR
ETQ0 AJMP ETQ1
AJMP ETQ2
9
Chapitre 3 : Jeu d’instruction du 8051

AJMP ETQ3

Quelle est l’instruction vers laquelle JMP effectue le saut ?

3.4.8 Instructions de saut conditionnel


Les sauts conditionnels sont tous des sauts courts relatifs.
JZ : Saut vers l’adresse (étiquette) spécifiée si A=0.
Exemple :
MOV A , #01
JZ ETQ1 ; pas de saut car A≠00 (PCPC+2).
DEC A
JZ ETQ2 ; saut vers ETQ2 car A=00 (PCPC+2).
(PCPC+offset).
JNZ : Saut vers l’adresse (étiquette) spécifiée si A≠0.
Exemple :
MOV A , #0
JZ ETQ1 ; pas de saut car A=00 (PCPC+2).
INC A
JZ ETQ2 ; saut vers ETQ2 car A≠00 (PCPC+2).
(PCPC+offset).
JC : Saut si la retenue est égale à 1.
Exemple : Initialement C=0.

JC ETQ0 ; pas de saut car C=0 (PC(PC)+2).


CPL C
JC ETQ1 ; saut vers ETQ1 car C=1 (PC(PC)+2).
(PCPC+offset).
JNC : Saut si la retenue est égale à 0.
JB : Saut si le bit spécifié est égal à 1.
Exemple :
JB P1.2 ETQ0 ; saut vers ETQ0 si P1.2=1 (PC(PC)+3).
(PC(PC)+offset)
JB Acc.2 ETQ1 ; saut vers ETQ1 si Acc.2=1 (PC(PC)+3).
(PC(PC)+offset).

JNB : Saut si le bit spécifié est à 0.


Exemple :
JNB P3.3 ETQ0 ; saut vers ETQ0 si P3.3=0 (PC(PC)+3).
(PC(PC)+offset)
JNB Acc.2 ETQ1 ; saut vers ETQ1 si Acc.2=1 (PC(PC)+3).
(PC(PC)+offset).

JBC : Saut si le bit spécifié est égal à 1. Si le saut est effectué ce bit sera mis à 0.

10
Chapitre 3 : Jeu d’instruction du 8051

Exemple : Initialement A=01001010


JBC Acc.3 , ETQ1 ; PC(PC)+3
; Acc0
; PC(PC)+offset

CJNE : Saut si les deux octets spécifiés dans l’instruction sont différents.
Syntaxe : CJNE <octet1>,<octet2> PC(PC)+3
Si octet1 ≠ octet2
Alors PC(PC)+offset
Si octet1<octet2
Alors C1
Sinon C0

Exemple :
CJNE R7 , #60H , ETQ PC(PC)+3
Si R7 ≠ 60h
Alors PC(PC)+offset
Si R7< 60h Alors C1
Sinon C0

DJNZ : Décrémente l’octet spécifié de 1 et effectue le saut si le résultat est différent de 0.


Syntaxe : DJNZ <octet1>,ETQ PC(PC)+2
octet1 octet1-1
si octet1≠0 Alors PC(PC)+offset

Exemple :
MOV R2 , #8
LOOP : CPL P1.6
DJNZ R2 , LOOP ;PC(PC)+2
R2(R2)-1
Si R2≠0
Alors PC(PC)+offset

11
Chapitre 4 : Les interruptions du 8051

Chapitre 4 : Les interruptions du 8051

4.1 Introduction

En informatique, une interruption est un arrêt temporaire de l’exécution d’un programme


par le microprocesseur (CPU d’un microcontrôleur) afin d’exécuter un autre programme
appelé routine d’interruption. Le 8051 possède 5 sources d’interruptions :
- Evénement externe sur l’entrée INT0 (P3.2).
- Evénement externe sur l’entrée INT1 (P3.3).
- Débordement du TIMER0.
- Débordement du TIMER1.
- Emission ou réception d’un caractère sur le port série.
Toutes les interruptions sont inhibées après le RESET du système. Le programmeur peut
les activer en configurant le registre IE (A8h).

4.2 Gestion des interruptions

4.2.1 Validation des interruptions

Pour valider une interruption, deux bits doivent être à 1 :


- le bit EA (sert à valider globalement toutes les interruptions),
- et le bit de validation individuelle correspondant à cette interruption.

Exemple : Valider l’interruption du TIMER1


SETB ET1 ; ET11
SETB EA ; EA1

Méthode 2 :
MOV IE,#10001000B

1
Chapitre 4 : Les interruptions du 8051

Exemple : Valider toutes les interruptions.


MOV IE,#FFh
ou
MOV IE,#9Fh

4.3 Priorité des interruptions

A l’aide du registre IP (Interrupt Enable) on peut définir pour chaque interruption 2


niveau de priorité : bas (0) et haut (1).

Une interruption ne peut être interrompue que par une interruption de priorité
supérieure et pour les interruptions de même priorité qui interviennent simultanément,
le 8051 évalue après l’exécution de chaque instruction si une interruption doit avoir lieu
ou non selon l’ordre suivant :
1- interruption INT0 ;
2- interruption TIMER0 ;
3- interruption INT1 ;
4- interruption TIMER1 ;
5- interruption port série.
Cela signifie que si une interruption port série intervient en même temps que INT0, celle-
ci sera exécutée en premier lieu et quand elle sera terminée le 8051 exécutera
l’interruption port série.
Exemple : On suppose que IP=00010011 et IE=10011110. Déterminer l’ordre
d’exécution des interruptions survenant selon l’ordre suivant :
1- INT0
2- INT1
3- Port série
4- TIMER0
On suppose que les interruption INT1, port série et TIMER0 interviennent avant la fin de
l’exécution de la routine de l’interruption en cours.
Solution :
INT0 n’est pas validée

2
Chapitre 4 : Les interruptions du 8051

4.4 Vecteurs d’interruptions

Pour une bonne gestion des interruptions, il faut savoir l’emplacement des routines de
service de toutes les interruptions. Les adresses vers lesquelles se déroute le PC lors des
interruptions sont appelées vecteurs d’interruptions.
Interruption Drapeau Adresse de la
routine d’int
INT0 IE0 0003h
TIMER0 TF0 000Bh
INT1 IE1 0013h
TIMER1 TF1 001Bh
Port série RI/TI 0023h

Evidemment si l’espace mémoire réservé à une routine de service d’une interruption n’est
pas suffisants (de 0003h à 000Ah pour Externe0 par exemple), on y code une instruction
de saut vers un autre emplacement mémoire où l’on y écrit le corps de de la routine de
service d’interruption.

4.5 Déroulement d’une interruption

Un événement déclencheur d’une interruption met le drapeau correspondant à 1. Si le bit


de validation est également à 1, alors l’interruption est déclenchée :
- le PC est empilé,
- les interruptions de même priorité ou de priorité inférieure sont masquées,
- le drapeau correspondant est mis à 0 sauf pour l’interruption port série où le
programmeur doit le mettre à zéro au début de la routine d’interruption.
- le PC est chargé par la valeur du vecteur d’interruption.
- A la fin de l’interruption (exécution de IRET) le PC est dépilé.

4.6 Registre TCON et interruptions externes

Les bits de poids faibles de TCON sont utilisés pour la signalisation et l’initialisation des
interruptions externes.

3
Chapitre 4 : Les interruptions du 8051

4
Chapitre 5 : Les timers compteurs du 8051

Chapitre 5 : Les timers/compteurs du 8051

5.1 Introduction

Le 8051 possède deux timers/compteurs (temporisateurs/compteurs) : TIMER0 et


TIMER1, qui sont des registres incrémentaux de 16 bits et qui peuvent être configurés
pour fonctionner en :
- Mode timer, où le signal d’entrée du registre provient de l’horloge système. Dans
ce cas le registre est incrémenté après chaque cycle machine (en d’autres termes,
il compte le nombre de cycles machine).
- Mode compteur où le signal d’entrée provient de T0 (P3.4) pour TIMER0 et T1
(P3.5) pour TIMER1. Dans ce cas, le registre compte le nombre d'impulsions sur
l’entrée externe correspondante.
Le débordement de ces Timers/compteur positionne les drapeaux TF0 ou TF1 qui
déclenchent les interruptions correspondantes si elles ne sont pas masquées.
Les deux Timers ont un fonctionnement identique. Ils sont accessibles par l'intermédiaire
des registres 8 bits TL1 (TL2) et TH1 (TH2) qui constituent leurs parties basse et haute.

5.2 Gestion des Timers


5.2.1 Registre TCON

L’activation des deux Timers est contrôlée par deux bits du registre TCON : TR0 pour
Timer0 et TR1 pour Timer1.
La mise à 1 de ces bits permet d’activer le Timer correspondant qui commence alors à
s’incrémenter ; la mise à 0 de ces bits désactive le Timer correspondant qui s’arrête et
garde le même contenu.
Registre TCON

1
Chapitre 5 : Les timers compteurs du 8051

Bit Nom Adresse Description


7 TF1 8F h Ce drapeau est positionné par le microcontrôleur quand le
TIMER1 déborde
6 TR1 8E h Ce bit permet de démarrer/arrêter (1/0) le TIMER 1
5 TF0 8D h Ce drapeau est positionné par le microcontrôleur quand le
TIMER 0 déborde
4 TR0 8C h Ce bit permet de démarrer/arrêter (1/0) le TIMER 0

Les bits de poids faibles de TCON sont utilisés pour la signalisation et l’initialisation des
interruptions externes (voir le chapitre précédent).

5.2.2 Registre TMOD

Les Timers 0 et 1 peuvent être configurés indépendamment l’un de l’autre (excepté en


mode 4) à partir d’un même registre de configuration TMOD (Timer Mode) : les 4 bits
poids fort pour la configuration du Timer1, les 4 bits poids faible pour le Timer0.
Registre TMOD

Bit Nom Description


Quand ce bit est positionné, TIMER1 ne peut fonctionner que si l'entrée
7 GATE INT1 (P3.3) est haute. Quand il est à zéro, TIMER1 peut fonctionner
indépendamment de l'entrée INT1
Si bit est positionné, TIMER1 fonctionne en compteur d'évènements sur
6 C/T l'entrée T1 (P3.5). Si ce bit est à zéro, TIMER1 est incrémenté par
l'horloge système.
5 M1 Timer1 mode
4 M0 Timer1 mode
Quand ce bit est positionné, TIMER0 ne peut fonctionner que si l'entrée
3 GATE INT0 (P3.2) est haute. Quand il est à zéro, TIMER0 peut fonctionner
indépendamment de l'entrée INT0
Si bit est positionné, TIMER0 fonctionne en compteur d'évènements sur
2 C/T l'entrée T0 (P3.4). Si ce bit est à zéro, TIMER0 est incrémenté par
l'horloge système.
1 M1 Timer0 mode
0 M0 Timer0 mode

Le schéma suivant résume le en quelque sorte le principe de fonctionnement du TIMER0


qui est identique à celui du TIMER1.

2
Chapitre 5 : Les timers compteurs du 8051

Le démarrage ou l’arrêt d’un Timer/compteur peuvent être effectués soit par logiciel, soit
par matériel :
Démarrage logiciel : Si le bit GATE=0, alors le positionnement de TR0=1 (TR1=1)
démarre TIMER0 (TIMER1).
Démarrage matériel : les 2 Timers peuvent être démarrés par des périphériques externes
contrôlant les entrées INT0 (TIMER0) et INT1 (TIMER1) tant que le bit GATE
correspondant est à 1 (évidemment TR0 et TR1 doivent être également positionnés à 1).
Le bit C/T de TCON permet de choisir le mode de fonctionnement temporisateur (compte
les cycles machines) ou compteur (compte les impulsions sur l’entrée T0).

5.3 Modes de fonctionnement

Les Timers/compteurs du 8051 peuvent fonctionner en 4 modes : mode0, mode1, mode2


et mode 3. Les bits M0 et M1 de TMOD permettent de choisir ces modes qui sont
accessibles que ce soit en comptage ou en temporisation.
M1 M0 Mode Description
0 0 0 13-bit
0 1 1 16-bit
1 0 2 8-bit auto-reload
1 1 3 Split timer mode

Mode 0 (13 bits)


Ce mode est peu utilisé. Il emploie 8 bits de TL0 (TL1) et 5 bits (0 à4) de TH0 (TH1). La
valeur maximale qu’il peut atteindre est 8191.

3
Chapitre 5 : Les timers compteurs du 8051

Mode 1 (16 bits)


C'est le mode le plus utilisé. Avec 16 bits, la valeur maximale qu’il peut atteindre est
65536.
Mode 2 (8 bits auto-reload)
Dans ce mode c'est TL0 (TL1) qui fonctionne en Timer/compteur, quand il déborde, au
lieu d'être chargé par 0, il est chargé par la valeur contenue dans TH0 (TH1). Ce mode est
souvent utilisé pour définir la vitesse de communication du port série.
Mode 3 (Split-Timer)
Dans ce mode les deux registres TL0 et TH0 du Timer 0 fonctionnent comme deux timers
8 bits indépendants. TL0 utilisent tous les bits de contrôle de TIMER0 et déclenche (quand
il déborde) l'interruption TIMER0. TH0 emprunte les bits TR1 et TF1 à TIMER1 et
déclenche (quand il déborde) l'interruption TIMER1.
Placé en mode 3, TIMER1 est arrêté exactement comme si on a fait TR1 = 0. Par contre, si
TIMER0 est en mode 3, TIMER1 peut être utilisé en mode 0,1 ou 2, mais il ne peut être
contrôlé par le bit TR1 car il est affecté à TH0 et il ne déclenche pas d'interruption quand
il déborde.

Vous aimerez peut-être aussi