Informatique Industrielle : Exercices corrigés microcontrolleur
Télécharger PDFFeu tournant à partir de la valeur stockée en @40h
ORG 100H
MOV A,#20h
boucle: MOV P1,A
RL A
SJMP boucle
END
Lire le port P0 et l'afficher sur P1
ORG 100H
boucle: MOV A,P0
MOV P1,A
SJMP boucle
END
Lire le port P0 et afficher uniquement les bits du poids faible sur P1
ORG 100H
boucle: MOV A,P0
ANL A,#00001111b ; Masquage des bits du poids fort
MOV P1,A
SJMP boucle
END
Charger le contenu du port P0 en @40h, l'additionner à 22h et afficher sur P1
ORG 100H
debut: MOV R0,#40h
MOV A,P0
MOV @R0,A
ADD A,#22h
MOV P1,A
SJMP debut
END
Écrire l'alphabet (A à Z) en mémoire externe à partir de @40h
ORG 100H
debut: MOV R0,#40h
MOV A,#'a'
boucle: MOV @R0,A
INC A
INC R0
CJNE A,#'z'+1,boucle
SJMP debut
END
Validation d'un code entré via P0 avec deux LEDs
ORG 100H
debut: MOV A,P0
CJNE A,#55h,invalide
MOV P1,#10000000b ; LED0 allumée (valide)
SJMP debut
invalide: MOV P1,#00000001b ; LED7 allumée (invalide)
SJMP debut
END
Émission d'un caractère via RS232
ORG 100H
LCALL INIT
MOV A,#'X'
MOV SBUF,A
Fin: SJMP Fin
INIT: MOV TMOD,#20h ; Mode timer 1
MOV TH1,#0FDh ; Vitesse 9600 bits/s
MOV SCON,#52h ; Mode RS232
SETB TR1
RET
END
Émission de l'alphabet (A à Z) via RS232
ORG 100H
MOV A,#'A'
Boucle: LCALL INIT
MOV SBUF,A
INC A
CJNE A,#'Z'+1,Boucle
Fin: SJMP Fin
INIT: MOV TMOD,#20h ; Mode timer 1
MOV TH1,#0FDh ; Vitesse 9600 bits/s
MOV SCON,#52h ; Mode RS232
SETB TR1
RET
END
Écrire son nom en mémoire externe et l'afficher via RS232
ORG 100H
LCALL INIT
MOV DPTR,#0000h
MOV A,#'A'
MOVX @DPTR,A
INC DPTR
MOV A,#'N'
MOVX @DPTR,A
INC DPTR
MOV A,#'A'
MOVX @DPTR,A
INC DPTR
MOV A,#'S'
MOVX @DPTR,A
INC DPTR
MOV A,#'S'
MOVX @DPTR,A
INC DPTR
MOV A,#13h ; Fin de chaîne
MOVX @DPTR,A
MOV DPTR,#0000h
Boucle: MOVX A,@DPTR
MOV SBUF,A
INC DPTR
CJNE A,#13h,Boucle
Fin: SJMP Fin
INIT: MOV TMOD,#20h ; Mode timer 1
MOV TH1,#0FDh ; Vitesse 9600 bits/s
MOV SCON,#52h ; Mode RS232
SETB TR1
RET
END
Lecture d'un caractère au clavier et émission via RS232
ORG 0H
LJMP 100H
ORG 80H
INIT: MOV TMOD,#20h ; Mode timer 1
MOV TH1,#0FDh ; Vitesse 9600 bits/s
MOV SCON,#52h ; Mode RS232
SETB TR1
RET
RECP: MOV A,SBUF
RET
EMET: MOV SBUF,A
RET
ORG 100H
LCALL INIT
LCALL RECP
Fin: SJMP Fin
END
Enregistrer une chaîne clavier en mémoire externe à partir de @0000H
ORG 0H
LJMP 100H
ORG 80H
INIT: MOV TMOD,#20h ; Mode timer 1
MOV TH1,#0FDh ; Vitesse 9600 bits/s
MOV SCON,#52h ; Mode RS232
SETB TR1
RET
RECP: MOV A,SBUF
RET
EMET: MOV SBUF,A
RET
ORG 100H
LCALL INIT
MOV DPTR,#0000h
Boucle: LCALL RECP
MOVX @DPTR,A
INC DPTR
CJNE A,#'/',Boucle
Fin: SJMP Fin
END
Afficher une chaîne clavier sur la console avec mémoire externe @0000H
ORG 0H
LJMP 100H
ORG 80H
INIT: MOV TMOD,#20h ; Mode timer 1
MOV TH1,#0FDh ; Vitesse 9600 bits/s
MOV SCON,#52h ; Mode RS232
SETB TR1
RET
RECP: MOV A,SBUF
RET
EMET: MOV SBUF,A
RET
ORG 100H
LCALL INIT
MOV DPTR,#0000h
Boucle: LCALL RECP
MOVX @DPTR,A
INC DPTR
CJNE A,#'/',Boucle
MOV DPTR,#0000h
Boucle2: MOVX A,@DPTR
LCALL EMET
INC DPTR
CJNE A,#'/',Boucle2
Fin: SJMP Fin
END
Compteur binaire (00 → FF ou FF → 00) selon le caractère tapé (C/D)
ORG 0H
LJMP 100H
ORG 80H
INIT: MOV TMOD,#20h ; Mode timer 1
MOV TH1,#0FDh ; Vitesse 9600 bits/s
MOV SCON,#52h ; Mode RS232
SETB TR1
RET
ORG 100H
LCALL INIT
Boucle: MOV A,SBUF
MOV R1,A
SUBB A,#0FFh
JZ Boucle
MOV A,R1
SUBB A,#'C'
JZ COMPT
MOV A,R1
SUBB A,#'c'
JZ COMPT
MOV A,R1
SUBB A,#'D'
JZ DCMPT
MOV A,R1
SUBB A,#'d'
JZ DCMPT
COMPT: MOV P1,#00h ; Initialisation à 00h
MOV P3,#00h ; Initialisation à 00h
Boucle2: INC P1 ; Incrémentation
INC P3
SJMP Boucle2
DCMPT: MOV P1,#0FFh ; Initialisation à FFh
MOV P3,#0FFh ; Initialisation à FFh
Boucle3: DEC P1 ; Décrémentation
DEC P3
SJMP Boucle3
Fin: SJMP Fin
END
Régulation du niveau d'eau dans un bassin
ORG 100H
ET1: MOV A,P0
ANL A,#00000001b ; Tester bit 0 (P1)
CJNE A,#00000001b,ET1
MOV P1,#00000001b ; Allumer LED0
MOV P3,#50 ; Initialisation niveau
ET2: MOV A,P3 ; Incrémentation
ADD A,#05
MOV P3,A
CJNE A,#70,ET2
MOV P1,#00000000b ; Éteindre LED0
MOV P1,#00010000b ; Allumer LED4 (remplissage terminé)
ET3: MOV A,P0
ANL A,#00000010b ; Tester bit 1 (P2)
CJNE A,#00000010b,ET3
ET4: MOV P1,#10000000b ; Allumer LED7 (détection vide)
DEC P3 ; Décrémentation
CJNE A,#50,ET4
MOV P1,#00000000b ; Éteindre toutes les LEDs
SJMP ET1
END
Adressage indirect avec registre R0
ORG 100H
DEBUT: MOV R0,#82h
MOV A,#00h
MOV @R0,A
MOV R0,#83h
MOV A,#20h
MOV @R0,A
MOV DPTR,#2000h ; Adresse mémoire externe
MOV A,#'A'
MOVX @DPTR,A
SJMP DEBUT
END
Écrire l'alphabet (A à Z) en mémoire externe à partir de @3000H
ORG 100H
MOV DPTR,#3000H
MOV A,#'A'
Boucle: MOVX @DPTR,A
INC DPTR
INC A
CJNE A,#'Z'+1,Boucle
Fin: SJMP Fin
END
Charger des valeurs en mémoire externe selon X (P0) et afficher sur P1 avec temporisation
ORG 100H
debut: MOV A,P0
MOV DPTR,#4000H ; Adresse de départ
MOV R0,#07h ; Compteur de boucle (7 valeurs)
boucle: MOVX @DPTR,A
MOV P1,A
LCALL Tempo
INC DPTR
ADD A,#10h ; Incrémenter X de 10h
DEC R0
CJNE R0,#00h,boucle
SJMP debut
Tempo: MOV R4,#08h ; Valeur temporisation
ET1: MOV R5,#0FFh
ET2: MOV R6,#0FFh
ET3: MOV R7,#0FFh
ET4: DJNZ R7,ET4
DJNZ R6,ET3
DJNZ R5,ET2
DJNZ R4,ET1
RET
END
FAQ
1. Que signifie "ORG 100H" dans un programme assembleur ?
La directive "ORG 100H" indique au compilateur d'assembleur de positionner le début du programme à l'adresse mémoire 100H.
2. Pourquoi utiliser "MOV P1,A" deux fois dans certains exemples ?
L'utilisation répétée de "MOV P1,A" peut servir à stabiliser l'affichage en évitant un retard dû à la propagation des signaux.
3. À quoi sert la sous-routine "Tempo" dans les programmes ?
La sous-routine "Tempo" crée un délai en utilisant des registres et des instructions de décrémentation (DJNZ) pour synchroniser l'affichage ou les actions.