PROJET PE
2024 / 2025
Réaliser par :
EL GHAZALI Marwa
DANHACH Ilham
I. Description générale du projet :
Ce projet consiste à concevoir et réaliser un système électronique capable de commander un
moteur à courant continu de manière simple et interactive. L’objectif principal est de
permettre à l’utilisateur de choisir le sens de rotation du moteur (vers la gauche ou vers la
droite), ou de l’arrêter complètement, à l’aide de commandes manuelles.
L’état du moteur est affiché en temps réel sur un écran textuel, ce qui permet de suivre
visuellement l’action en cours (par exemple : "GAUCHE", "DROITE", "ARRET").
L’ensemble du système est piloté par un microcontrôleur, qui joue le rôle de cerveau de la
commande : il interprète les entrées utilisateur, déclenche les actions nécessaires, et met
à jour l’affichage.
Le programme a été entièrement développé en langage assembleur, ce qui permet
une maîtrise fine des ressources matérielles et une meilleure compréhension du
fonctionnement bas niveau du système. Ce projet représente une application concrète de
l’électronique numérique et de la programmation embarquée.
II. Justification des composants utilisés dans le
projet :
Microcontrôleur (PIC16F877A)
Ce microcontrôleur a été choisi pour sa richesse en entrées/sorties numériques, sa
compatibilité avec le langage assembleur, et sa fiabilité dans les applications de
commande. Il permet de gérer simultanément les entrées utilisateur (boutons), les
sorties de commande (activation des relais) et l’affichage sur écran LCD, tout en
offrant une gestion simple des ports et registres internes.
Écran LCD 16x2
Nous avons opté pour un écran LCD 16 caractères sur 2 lignes afin d’afficher de manière
lisible et immédiate l’état du système (sens de rotation ou arrêt du moteur). Ce type d’écran
est facile à piloter via le microcontrôleur, et ne nécessite que peu de ressources, tout en offrant
une bonne visibilité.
Moteur à courant continu
Le moteur à courant continu a été choisi pour sa simplicité de commande et sa réversibilité. Il
peut changer de sens de rotation facilement en inversant la polarité de l’alimentation, ce qui
correspond parfaitement aux besoins du projet.
Relais électromécaniques
Les relais permettent de commuter la polarité appliquée au moteur pour
changer son sens de rotation. Ils offrent une isolation galvanique entre la
commande (basse puissance) et la charge (le moteur), ce qui garantit la
sécurité du circuit et la protection du microcontrôleur.
Transistors NPN (type 2N2222A)
Les transistors jouent le rôle d’interrupteurs électroniques pour activer les relais. Ils sont
pilotés par le microcontrôleur via un courant de base, et permettent de faire passer le courant
nécessaire dans la bobine du relais, ce que le microcontrôleur ne peut pas faire directement.
Diodes de roue libre (type 1N4001)
Ces diodes sont placées en parallèle des relais pour protéger les transistors contre les
surtensions générées par la coupure brutale du courant dans la bobine (phénomène d’auto-
induction). Elles assurent la durabilité des composants de commutation.
Résistances
Les résistances sont utilisées principalement pour limiter le courant dans la base des
transistors et pour stabiliser les signaux numériques au niveau des boutons-poussoirs. Elles
assurent un fonctionnement correct et sûr des éléments de commande.
Boutons-poussoirs
Ils représentent l’interface utilisateur du système. Leur choix repose sur leur simplicité, leur
coût réduit et leur facilité d’intégration dans un système numérique. Chaque bouton
correspond à une commande spécifique (gauche, droite, stop, etc.).
III. L’analyse fonctionnel :
• Bête à corne :
• SADT :
Commander le
Moteur non moteur en rotation Moteur
commander commander
PIC 16F877
IV. L’étude théorique :
Le code :
LIST P=16F877
INCLUDE <P16F877.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
RA0 EQU 0x00
RA1 EQU 0x01
RA2 EQU 0x02
RA3 EQU 0x03
RB0 EQU 0x00
RB1 EQU 0x01
RB2 EQU 0x02
RB3 EQU 0x03
RB4 EQU 0x04
RB5 EQU 0x05
PWM1 EQU 0x02
TMR2IF EQU 0x01
CBLOCK 0x0C;
SPEED
DUTY_CYCLE
SAVE_DUTY_CYCLE
SAVE_WORK_COMPT_5M
COMPT
COMM
POSITION
INCRE
DECRE
SAVE_WORK_COMPT
COMPT1
COMPT2
SAVE_WORK_CALC
DIVIDER
QUOTIEN
REMAINDER
DEVISOR
Ready
ENDC
SAVE_WORK_CALC
DIVIDER
QUOTIEN
REMAINDER
DIVISOR
ENDC
ORG H’0000’
GOTO start
TEMPO
MOVLW 0x10
MOVWF COMPT
CLRF TMR0
LOOP
BCF INTCON, T0IF
LOOP1
BTFSS INTCON, T0IF
GOTO LOOP1
DECFSZ COMPT, F
GOTO LOOP
RETURN
REPEAT
MOVF SPEED, W
MOVWF CCPR1L
RETURN
MSEC
MOVF DUTY_CYCLE, SAVE_DUTY _CYCLE
MOVWF SAVE_WORK_COMPT_5M
MOVLW D'249'
MOVWF COMPT2
OUTER_LOOP
MOVLW D'249'
MOVWF COMPT1
LOOP2
DECFSZ COMPT1, F
GOTO LOOP2
DECFSZ COMPT2, F
GOTO OUTER_LOOP
MOVF SAVE_WORK_COMPT_5M, W
Ready
GOTO LOOP2
DECFSZ COMPT2, f
GOTO OUTER_LOOP
MOVE_SAVE_WORK_COMPT_5M, W
MOVE_SAVE_DUTY_CYCLE, DUTY_CYCLE
RETURN
COMLCD MOVWF PORTD
BCF PORTA, RA3
BCF PORTA, RA2
CALL DELAY
BSF PORTA, RA2
RETURN
DATALCD MOVWF PORTD
BSF PORTA, RA3
BCF PORTA, RA2
CALL DELAY
BSE PORTA, RA2
RETURN
start
; TRISC Setting for output
BANKSEL PIE1
CLRF PIE1
BANKSEL CCP1CON
CLRF TMR2
CLRF INTCON
CLRF PIR1
MOVLW 0xAF ; 504 DUTY CYCLE
MOVWF SPEED
; PWM PERIOD SETTING
READY
R5
BTFSS PORTA,0
GOTO R5
GOTO DROITE
R1
BTPSS PORTA,1
GOTO R5
GOTO GAUCHE
R2 BTFSS PORTA,2
GOTO R5
GOTO STOOP
DROITE
BSF PORTB,0
BCF PORTB,1
GOTO R5
GAUCHE
BSF PORTB,0
BCF PORTB,1
GOTO R5
STOP
BSF PORTB,0
BCF PORTB,1
GOTO R5
INIT_LCD:
MOVLW 0x38
CALL LCD_CMD
MOVLW 0x0C
CALL LCD_CMD
MOVLW 0x06
CALL LCD_CMD
MOVLW 0x01
CALL LCD_CMD
RETURN
LCD_CMD:
MOVWF PORTB
BCF PORTA, RA2
BCF PORTA, RA3
BSF PORTA, RA1
NOP
BCF PORTA, RA1
NOP
RETURN
LCD_CHAR:
MOVWF PORTB
BSF PORTA, RA2
BCF PORTA, RA3
BSF PORTA, RA1
NOP
BCF PORTA, RA1
NOP
RETURN
LCD_STRING:
MOVF LCD_STR_PTR, W
CALL LCD_CHAR
INCF LCD_STR_PTR, F
BTFSC STATUS, Z
GOTO LCD_STRING
RETURN
DROITE_LCD:
MOVLW 'D'
CALL LCD_CHAR
MOVLW 'r'
CALL LCD_CHAR
MOVLW 'o'
CALL LCD_CHAR
MOVLW 'i'
CALL LCD_CHAR
MOVLW 't'
CALL LCD_CHAR
MOVLW 'e'
CALL LCD_CHAR
RETURN
GAUCHE_LCD:
MOVLW 'G'
CALL LCD_CHAR
MOVLW 'a'
CALL LCD_CHAR
MOVLW 'u'
CALL LCD_CHAR
MOVLW 'c'
CALL LCD_CHAR
MOVLW 'h'
CALL LCD_CHAR
MOVLW 'e'
CALL LCD_CHAR
RETURN
STOP_LCD:
MOVLW 'A'
CALL LCD_CHAR
MOVLW 'r'
CALL LCD_CHAR
MOVLW 'r'
CALL LCD_CHAR
MOVLW 'ê'
CALL LCD_CHAR
MOVLW 't'
CALL LCD_CHAR
MOVLW 'e'
CALL LCD_CHAR
RETURN
start:
BANKSEL TRISC
CLRF TRISC
BANKSEL TRISB
CLRF TRISB
BANKSEL TRISA
CLRF TRISA
CALL INIT_LCD
R5
BTFSS PORTA,0
GOTO R5
GOTO DROITE_LCD
BSF PORTB,0
BCF PORTB,1
GOTO R5
R1
BTFSS PORTA,1
GOTO R5
GOTO GAUCHE_LCD
BSF PORTB,1
BCF PORTB,0
GOTO R5
R2
BTFSS PORTA,2
GOTO R5
GOTO STOP_LCD
BCF PORTB,0
BCF PORTB,1
GOTO R5
END