Vous êtes sur la page 1sur 13

01/03/2019

Ecole Nationale Polytechnique –Constantine.


Département EEA
Quatrième Année Ingénieurs –Semestre 2.
Automatique/Electrotechnique
Cours. Circuits Programmables

Chapitre III. (Partie 1)


Programmation des microcontrôleurs
Durée du Cours: 3h00
Présenté par: Dr. S. BENSEGUENI
(benskandix@gmail.com)
CLR PSW.3
CLR PSW.4 sélection de la banque 0
MOV R0,#0AH compteur
MOV R1,#40H compteur
MOV A,00H
MOV R3, 00H

Année Universitaire. 2018-2019

1. Différents langages de programmation


Quand on choisit de programmer un microcontrôleur,
il faut savoir que sauf exceptions, nous avons le choix
entre plusieurs langages de programmation. En ce qui
concerne le PIC, les programmes se développent avec
le logiciel MPLAB, qui nous permet de programmer le
PIC dans divers langages. Parmi ceux-ci, les principaux
sont le C et le BASIC pour les langages hauts niveaux,
et l’assembleur pour les langages bas niveaux.

Circuits Programmables Dr. S. Bensegueni

1. Différents langages de programmation


Les langages bas niveaux sont les plus proches de la
machine, généralement l’équivalent de la « langue
natale » du système. L’assembleur en fait partie.
Proche de la machine, ce langage permet d’optimiser
le programme. Il reste cependant difficile à mettre en
œuvre pour des programmes complexes, mais
abordable pour des programmes de base. Adopté par
un grand nombre d’industriels comme langage de
référence, il reste cependant difficilement réparable
pour une tierce personne.
Circuits Programmables Dr. S. Bensegueni

1
01/03/2019

1. Différents langages de programmation


Les langages hauts niveaux sont des langages faciles à
comprendre et à mettre en œuvre, avec un minimum de
connaissance. Ce type de langage facilite la maintenance
lors de problèmes, car il est aisé pour quelqu’un, pris au
hasard, de comprendre un programme haut niveau. Ce
type de langage est, en effet, plus proche de l’utilisateur
que de la machine.
Ces langages utilisent des compilateurs, qui sont une
sorte de convertisseurs ou des dictionnaires
automatiques. Ces compilateurs font la conversion directe
entre le langage haut niveau et le langage assembleur.
Circuits Programmables Dr. S. Bensegueni

1. Différents langages de programmation


En comparant ces deux types de langage, et dans la
mesure où les compilateurs sont performants, il apparaît
comme plus pratique de choisir le langage C, plutôt que le
langage assembleur, tant pour la simplicité de
programmation, que pour la facilité d’utilisation.
Dans ce qui suit, on exposera les Instructions et les
commandes de bases de l’assembleur pour deux types de
microcontrôleurs, en proposant quelques exemples de
programmes. Puis on détaillera le langage de
programmation C pour les microcontrôleurs et on
montera les différences avec le C classique.
Circuits Programmables Dr. S. Bensegueni

1. Différents langages de programmation


Tous les microcontrôleurs peuvent être programmés dans
leur langage machine d'origine. Le terme langage
machine, fait référence aux codes primitifs, internes au
microprocesseur, qui exécutent les opérations
fondamentales pouvant être effectuées par un processeur
particulier. Le cycle d'extraction du processeur extrait le
code machine de la mémoire du programme et effectue
les manipulations et les calculs nécessaires.
La programmation est définie de manière vague, comme
la sélection, la configuration et le stockage dans la
mémoire de programme d'une séquence de codes
d’opération primitifs afin de réaliser une fonction ou une
tâche spécifique.
Circuits Programmables Dr. S. Bensegueni

2
01/03/2019

1. Différents langages de programmation


Le programmeur en langage machine doit déterminer
manuellement le code d'opération pour chaque
instruction dans le programme et placer ces codes, dans
un ordre spécifique, dans la zone désignée de la mémoire
de programme.
L’assemblage est basé sur un logiciel qui reconnaît un
langage symbolique dans lequel chaque code machine est
représenté par une structure mnémonique et un
opérande éventuel. Un programme en assembleur, lit ces
instructions et ces opérandes à partir d'un fichier texte et
génère les codes machine correspondants.
Circuits Programmables Dr. S. Bensegueni

1. Différents langages de programmation


Le programme assembleur lit le fichier texte du
programmeur, analyse ces mots mnémoniques et leurs
opérandes possibles, et stocke les codes opération
binaires dans un fichier pour une exécution ultérieure.
Comme le langage assembleur fait référence aux codes
d’opérations du processeur, il s'agit d'un langage
spécifique à la machine. Un programme assembleur ne
fonctionne que sur des appareils ayant un
langage machine commun. En raison de leur relation avec
le matériel, le langage machine et le langage assembleur
sont généralement appelés langages de bas niveau.

Circuits Programmables Dr. S. Bensegueni

1. Différents langages de programmation


Les langages de programmation de haut niveau, tels
que le C, fournit un niveau d'abstraction plus élevé à
partir du périphérique hardware. Il est généralement
admis, que par rapport aux langages de bas niveau, la
programmation de haut niveau est plus naturelle, plus
facile à apprendre et simplifie le processus de
développement des langages de programme. Le
résultat est un environnement de développement
plus simple et plus compréhensible avec de bonnes
performances en termes de contrôle du matériel et de
taille du programme.
Circuits Programmables Dr. S. Bensegueni

3
01/03/2019

1. Différents langages de programmation


Plutôt que de traiter avec des registres, des adresses
mémoire et des piles d’appels, un langage de haut
niveau traite des variables, des tableaux, des
expressions arithmétiques ou booléennes, des sous-
programmes et des fonctions, des boucles et d’autres
concepts abstraits. Dans un langage de haut niveau, la
conception met l’accent sur la convivialité plutôt que
sur l’efficacité optimale du programme.

Circuits Programmables Dr. S. Bensegueni

1. Différents langages de programmation


Il convient de noter, que beaucoup soutiennent que
les développements modernes dans des langages de
haut niveau, basés sur des compilateurs bien conçus,
produisent un code comparable en termes d'efficacité
et de contrôle à celui des langages de bas niveau.
Un autre avantage des langages de haut niveau est
que leur conception est indépendante des structures
de la machine et que le matériel et les
caractéristiques d'un périphérique spécifique donnent
un code qui peut être facilement porté sur différents
systèmes.
Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


Il faut savoir que l’ensemble d’instructions du
processeur du 8051 est utilisé pour manipuler une
unité arithmétique et logique en combinaison avec les
registres internes qui pouvant être contrôlés par des
codes opérations codés en binaire pour effectuer des
opérations arithmétiques et logiques, il est utilisé
aussi pour transférer les donnée dans le processeur et
dans ou en dehors du microcontrôleur, il est utilisé
pour faire des décisions en se basant sur les résultats
des différentes manipulations.
Circuits Programmables Dr. S. Bensegueni

4
01/03/2019

2. Langage assembleur du 8051


Pour programmer le microcontrôleur 8051, il faut suivre les
étapes suivantes :
1. Savoir où se situent les entrée du programme :
- Les données sont accessibles d’une manière directe,
- Les données sont stockées dans un des registres R0,…, R7 de la
banque sélectionnée,
- Les données sont stockées dans une location de mémoire,
- Les données sont stockées dans une location de mémoire qui a
une adresse pointée par un des registres R0, …, R7 de la banque
sélectionnée.
2. Quelles sont les opérations qu’on veut réaliser.
3. Savoir où on va stocker les résultats.
Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


Avant d’exposer les différentes instructions, on va tout d’abord
donnée quelques significations de quelques symboles :
Rx : un des registres actifs R0 à R7
direct : adresse d'un octet de RAM interne, d'un port, ou SFR
@Rx : adressage indirect par registre R0 ou R1
#data : donnée sur 8 bits
#data16 : donnée sur 16 bits
bit : adressage au niveau du bit
rel : déplacement 8 bits signé relatif au PC : de -128 à +127
addr11 : adressage limité à la zone de 2Ko où se situe
l'instruction
addr16 : adressage dans la zone de 64Ko

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Directives d’assemblage)
ORG : est la directive qui définit l’origine ou le début
d’adresse des instructions suivant cette directive.
EQU : pour associer à une constante une étiquette,
qui ne va pas occuper un espace mémoire.
DB ou DW : pour définir un ensemble de données en
un octet (mot) pour chacune, et qui peuvent être des
données décimales, hexadécimale, binaire ou ASCII.
END : définie la fin du programme (fichier source
.asm)

Circuits Programmables Dr. S. Bensegueni

5
01/03/2019

2. Langage assembleur du 8051


(Instructions de transfert)
MOV : recopier les données
MOV Dest,Source : recopie Source dans Dest, aucun
drapeau n'est positionné.
Notons que l'on peut transférer des données
directement d'une case mémoire interne dans une
autre sans passer par l'accumulateur.
Les instruction du genre MOV Rx,Rx ne sont pas
autorisés. Pour réaliser MOV R2,R4 avec le bank 0
actif, il faut faire MOV 02,04. Si c'est le bank 1 qui est
actif, pour réaliser MOV R2,R4 il faut faire MOV
0Ah,0Ch.
Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Instructions de transfert)
PUSH et POP : empiler et dépiler une valeur dans la
pile.
PUSH incrémente SP puis écrit l'opérande dans la case
pointé par ce dernier et POP lit la valeur pointée par
SP avant de décrémenter ce dernier.

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Instructions de transfert)
XCH : XCH A,<byte> : échange les données de
l'accumulateur A et de l'octet adressé.
XCHD : XCHD A,@Ri : échange les digits de poids
faibles entre l'accumulateur A et l'octet adressé.
MOVX : MOVX <dest>, <source> permet la lecture ou
l'écriture d'un octet en RAM externe en passant
toujours par l'accumulateur. L'adressage indirect est
utilisé
MOVC : MOVC A, @A+<base-reg> permet de lire un
octet dans la mémoire programme.

Circuits Programmables Dr. S. Bensegueni

6
01/03/2019

2. Langage assembleur du 8051


(Instructions arithmétiques et logiques)
ADD : ADD A, <byte> : additionne un octet avec l'accu
A, résultat dans A.
ADDC : ADDC A, <byte> : additionne un octet, l'accu A
et la retenue, résultat dans A.
SUBB : SUBB A, <byte> : soustrait un octet et la
retenue du contenu de A, résultat dans A.
INC : INC <byte> : incrémente un octet ou DPTR.
DEC : DEC <byte> : décrémente un octet.

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Instructions arithmétiques et logiques)
MUL : MUL AB : multiplie l'accu A et l'accu B, résultat :
octet faible dans A et octet fort dans B
DIV : DIV AB : divise le contenu de A par le contenu de B,
quotient dans A et reste dans B.
DA : DA A : ajustement décimal de A.
ANL : ANL <dest>, <source> : réalise un ET logique entre
source et dest, résultat dans dest.
ORL : ORL <dest>, <source> : réalise un OU logique entre
source et dest, résultat dans dest.
XRL : XRL <dest>, <source> : réalise un OU exlusif entre
source et dest, résultat dans dest.
Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Instructions arithmétiques et logiques)
CLR : met l'accumulateur ou un bit à 0.
CPL : complémente l'accumulateur ou un bit.
RL : RL A : rotation vers la gauche du contenu de A.
RLC : RLC A : rotation vers la gauche du contenu de A à
travers la retenue.
RR : RR A : rotation vers la droite du contenu de A.
RRC : RRC A : rotation vers la droite du contenu de A à
travers la retenue.
SWAP: SWAP A : échange le degit de poids faible avec
celui de poids fort de A.
SETB : SETB <bit> : met un bit à 1.

Circuits Programmables Dr. S. Bensegueni

7
01/03/2019

2. Langage assembleur du 8051


(Instructions de branchement)
ACALL : ACALL addr11 : réalise un saut absolu
inconditionnel vers un sous programme commençant
à l'adresse addr11. Les 11 bits de addr11 sont
substitués au 11 bits de poids faible du PC, ce qui
signifie que la destination reste dans le même bloc de
2K que l'instruction courante.

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Instructions de branchement)
AJMP : AJMP addr11 : réalise un saut absolu inconditionnel vers
l'instruction d'adresse addr11. La différence avec ACALL est que
ici on ne saute pas vers un sous programme, il n'est pas
nécessaire d'empiler le PC pour pouvoir retourner après
l'exécution du sous programme.
LCALL : LCALL addr16 : réalise un saut long absolu inconditionnel
vers un sous programme commençant à l'adresse addr16. Pour
repérer la position de retour, le PC est incrémenté puis empilé. Il
sera dépilé au retour du sous programme.
LJMP : LJMP addr16 : réalise un saut long absolu inconditionnel
vers la position d'adresse addr16.
SJMP : SJMP rel : réalise un saut court relatif au PC. On peut
donc effectuer un saut dans l'intervalle :
[PC-128, PC+127].
Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Instructions de branchement)
JMP : JMP @A+DPTR : réalise un saut long absolu inconditionnel
vers la position d'adresse A+DPTR, (Adressage indirect).
JZ : JZ rel : saut si A=0.
JNZ : JNZ rel : saut si A< >0.
JC : JC rel : saut si retenue à 1.
JNC : JNC rel : saut si retenue à 0.
JB : JB bit,rel : saut si bit à 1.
JNB : JNB bit,rel : saut si bit à 0.
JBC : JBC bit,rel : saut si le bit est à 1 et mise à zero de celui-ci.
CJNE : CJNE <byte1>, <byte2>, <rel> : saut si byte1 et byte2 sont
différents.
DJNZ : DJNZ <byte>, rel : décrémente byte et saut si résultat
différent de 0.
Circuits Programmables Dr. S. Bensegueni

8
01/03/2019

2. Langage assembleur du 8051


(Autres types d’instructions)
RET : Retour de sous programme.
RETI : Retour d'interruption.
NOP : No Operation.

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Exercice)
Ecrire un programme en assembleur du 8051 qui
effectue l’addition de dix octets stockés à la RAM
interne à partir de l’adresse 40h, en supposant que le
résultat de la somme sera d’une langueur de 16 bits
et sera stocker dans R1 (pour l’octet le moins
significatif) et dans R2 (pour l’octet le plus significatif).

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Réponse)
CLR PSW.3
CLR PSW.4 sélection de la banque 0
MOV R0,#0AH compteur
MOV R1,#40H compteur
MOV A,#00H
MOV R3,#00H
ET2: ADD A,@R1
JNC ET1
INC R3
ET1: INC R1
DEC R0
JNZ ET2 on peut regrouper ces deux dernières instructions
en : DJNZ R0,ET2
MOV R2,A
END
Circuits Programmables Dr. S. Bensegueni

9
01/03/2019

2. Langage assembleur du 8051


(Modes d'adressage)
Adressage Immédiat
Ce n'est pas réellement un adressage car la donnée constituant
l'opérande est précisée dans l'instruction. Dans l'écriture en
assembleur, on place un signe # devant la donnée pour la
différentier d'une adresse.
Exemples:
MOV A,#40h : Chargement de l'octet 40h dans l'accumulateur
MOV A,#40 : charger la valeur 40 décimal dans l'accumulateur
MOV A,#11001101B : charger la valeur binaire dans
l'accumulateur
MOV P1,#80H : envoie la valeur 80h sur le port P1
MOV 40h,#5AH : Charger la valeur 5Ah dans la case mémoire
d'adresse 40h
Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Modes d'adressage)
Adressage Registre
L'opérande est contenu dans un registre
Exemple:
ADD A,R4
INC A
INC R3

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Modes d'adressage)
Adressage direct
C'est l'adresse de l'opérande qui est précisée dans l'instruction.
L'adresse n'a que 8 bits, Seule la RAM interne et les SFRs peuvent
être adressés de cette manière. Il n'existe pas d'adressage direct pour
la RAM externe, il faut passer par le registre DPTR.
Exemple:
MOV A,45h : Charger l'accumulateur avec le contenu de la case
mémoire 45h
MOV R0,30h : Charger le registre R0 avec le contenu de la case
mémoire 30h
MOV A,P1 : Charger l'accumulateur avec le mot en entrée sur le port
P1
ANL A,78 : Une opération ET logique est effectuée entre le contenu
de A et le
contenu de la case mémoire 78 (4Eh)
Circuits Programmables Dr. S. Bensegueni

10
01/03/2019

2. Langage assembleur du 8051


(Modes d'adressage)
Adressage Indirect (indexé)
L'instruction spécifie un registre qui contient l'adresse de
l'opérande. Les mémoires internes et externes sont
accessibles par ce type d'adressage (sauf les registres
SFR).
Dans le cas d'un adressage sur 8 bits le registre d'index
peut être l'un des 2 registres R0 ou R1 choisi dans la bank
actif. Dans le cas de l'adressage 16 bits, qui ne concerne
que la mémoire externe, le registre d'index est le DPTR
(16 bits). L'adressage indirect est désigné dans
l'assembleur par le signe @.

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Modes d'adressage)
Exemple:
MOV A,@R0 : Charger l'accumulateur avec le contenu de la case
dont l'adresse est contenue dans registre R0 du bank actif.
MOV @R1,P1 : Transférer le contenu du port P1 dans la case
mémoire dont l'adresse est le contenu du registre R1 du bank
actif.
ANL A,@R0 : ET logique entre l'accumulateur et la case mémoire
dont l'adresse est le contenu du registre R0 du bank actif.
MOVX @DPTR,A : Charge la mémoire dont l'adresse est
contenue dans DPTR dans l'accumulateur. Le X du mnémonique
indique qu'il s'agit d'une mémoire extérieure.

Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Modes d'adressage)
Exemple:
L'utilisation des registres d'index R0 et R1 avec la
mémoire externe peut s'avérer assez souple, mais elle
permet seulement l'adressage à l'intérieur d'une page
mémoire de 256 octets. L'adresse de la page doit être
précisée à l'aide du port P2.
Les 3 instructions suivantes permettent de charger
l'accumulateur avec le contenu de la case mémoire
externe d'adresse 43A0h :
MOV P2,#43h
MOV R0,#A0h
MOVX A,@R0
Circuits Programmables Dr. S. Bensegueni

11
01/03/2019

2. Langage assembleur du 8051


(Modes d'adressage)
Adressage de Bits
Le 8051 possède un processeur de bits qui travaille sur
des bits individuels. Pour ce processeur l'Accumulateur
est C. Les bits de certains registres sont ainsi accessibles
par une adresse sur 1 octet.
D'abord les bits de la zone en début de RAM interne (16
octets de 20H à 2FH ). Ces 128 bits qui commencent Bit 0
de la case 20h et se terminent au bit 7 de la case 2F ont
des adresses qui vont de 00 à 7Fh. Sont également
accessibles de cette façon les bits des cases du SFR dont
l'adresse en hexadécimal se termine par 0 ou 8, 80H 88H
90H 98H etc...
L'un des opérandes est toujours le carry C.
Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Modes d'adressage)
Exemple :
MOV C,45h : Chargement de C avec le bit d'adresse 45h
MOV P1.3,C : Le contenu de C est transféré dans le bit 3
du port P1
MOV RS0,C : Le bit C est placé dans le bit RS0 du Registre
PSW
CLR C : mise à zéro de C
CLR P3.6 : mise à zéro du bit 6 de P3
SETB RS1 : mise à 1 de RS1
CPL P1.1 : Inversion du bit 1 de P1
SETB P3.2 : Mise à 1 du bit 2 du port 3
Circuits Programmables Dr. S. Bensegueni

2. Langage assembleur du 8051


(Exercice)
Ecrire un programme en assembleur du 8051 qui
calcule le nombre des nombres positives d’un vecteur
de données en octets stockés dans la mémoire
externe à l’adresse 3000h et en supposant que sa
langueur est stockée dans R0 de la banque 0. Le
résultat sera stocké dans R1 de la banque 0.

Circuits Programmables Dr. S. Bensegueni

12
01/03/2019

2. Langage assembleur du 8051


(Exercice)
Ecrire un programme en assembleur du 8051 qui
calcule le maximum des nombres d’un vecteur de
données en octets stockés dans la mémoire externe à
partir de l’adresse l’adresse 3000h et en supposant
que la langueur du vecteur de données égale à 50h
est stockée dans R0 de la banque 0. Le résultat sera
stocké dans R1 de la banque 0.

Circuits Programmables Dr. S. Bensegueni

13

Vous aimerez peut-être aussi