Académique Documents
Professionnel Documents
Culture Documents
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.
1
Chapitre 2 : Le microcontrôleur 8051
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.
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
Chapitre 2 : Le microcontrôleur 8051
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.
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.
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 (20h2Fh) : 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
6
Chapitre 2 : Le microcontrôleur 8051
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 :
7
Chapitre 2 : Le microcontrôleur 8051
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.
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.
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.
10
Chapitre 3 : Jeu d’instruction du 8051
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
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.
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 ; C0
SETB P3.0 ; (bit 0 de P3)1
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
2
Chapitre 3 : Jeu d’instruction du 8051
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)
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
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)
Exemple :
MOVC A , @A+DPTR ; A (@(A+DPTR))
MOVC A , @A+PC ; PCPC+1
; A (@(A+PC))
4
Chapitre 3 : Jeu d’instruction du 8051
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)
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)
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 ; A10H
MOV B , #1FH ; B1FH
MUL AB ; 10H ×1FH=01F0H, AF0h et B01h.
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 ; A250
MOV B , #18 ; B18
DIV AB ; 250=18 ×13+16, A13 et B16.
5
Chapitre 3 : Jeu d’instruction du 8051
Exemple :
INC A ; A(A)+1
INC @R1 ; @R1(@R1)+1
INC 40H ;40h(40h)+1
INC P1
INC DPTR
Exemple :
MOV A , #10001001B ; A10001001 B
MOV R1 , #10010101B ; R110010101 B
ANL A , R1 ; A10000001=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 ; A10001001 B
MOV R1 , #10010101B ; R110010101 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 ; A10001001 B
MOV R1 , #10010101B ; R110010101 B
XRL A , R0 ; A00011100=10001001 XOR 10010101
6
Chapitre 3 : Jeu d’instruction du 8051
XRL 30H, A
XRL A , @R1
XRL 30H , #20H
Exemple :
MOV A , #11000101B ; A11000101 B
RL A ; A10001011 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 ; A11000101 B
SWAP A ; A01011100 B
7
Chapitre 3 : Jeu d’instruction du 8051
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.
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
Exemple :
8
Chapitre 3 : Jeu d’instruction du 8051
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))
;PCadresse de 16 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
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
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 C1
Sinon C0
Exemple :
CJNE R7 , #60H , ETQ PC(PC)+3
Si R7 ≠ 60h
Alors PC(PC)+offset
Si R7< 60h Alors C1
Sinon C0
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
4.1 Introduction
Méthode 2 :
MOV IE,#10001000B
1
Chapitre 4 : Les interruptions du 8051
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
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.
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
5.1 Introduction
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
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).
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).
3
Chapitre 5 : Les timers compteurs du 8051