Vous êtes sur la page 1sur 29

Microcontrôleurs Iset de Nabeul

TRAVAUX DIRIGES N° : 1

AFFICHAGE DES DONNEES


Exercice 1.1 :
Soit le montage suivant permettant de commander 8 diodes LED :

On veut maintenant réaliser plusieurs animations sur les LEDs commandées par les boutons
poussoirs B1 et B2 selon le tableau suivant :

N° B B Séquence
séquence 1 2

0 1 1 L0-L1-L2-L3-L4-L5-L6-
L7

1 1 0 L7-L6-L5-L4-L3-L2-L1-
L0

2 0 1 L7/L0-L6/L1-L5/L2-
L4/L3

3 0 0 L0/L1-L2/L3-L4/L5-
L6/L7

Ecrire un programme en C permettant de commander les diodes LED.

Exercice 1.2 :
Soit le montage suivant permettant de commander 8 diodes LED :

Mr Nizar TOUJENI 1
Question 1 :

On propose de faire clignoter LEDs branchées au port B du microcontrôleur de deux façons


différentes :

- Si RA0 = 0, tous les LEDs clignotent avec une période d’une seconde.

- Si RA0 = 1, les LEDs doivent clignoter chaque 500 ms comme indiqué dans la figure ci-
dessous.

Ecrire un programme en C permettant de commander les diodes LED.


Question 2 :

- Si RA0=0, les 8 diodes LED clignotent pendant 2 secondes,

- Si RA0=1, on obtient le cycle répétitif suivant :


Diodes LED Dur
allumés ée
D0D1 1s
D2D3 2s
D4D5 3s
D6D7 4s
Aucune diode 1s

Ecrire un programme en C permettant de commander les diodes LED.

Exercice 1.3 :
On désire commander un afficheur à 7 segments afin de réaliser un compteur modulo 10 à l’aide d’un
microcontrôleur 16F84A.

1. Ecrire un programme C qui permet de réaliser le fonctionnement suivant :

- Compteur modulo 10 commandé par la position 1 du switcher (RA0).

- Décompteur modulo 10 commandé par la position 2 du switcher (RA1).

2. Ecrire un programme C qui permet de réaliser le fonctionnement suivant :

- Compteur des nombres pairs commandé par la position 1 du switcher.

- Compteur des nombres impairs commandé par la position 2 du switcher.


Exercice 1.4 :
Soit le montage suivant :

Ecrire un programme en C qui affiche sur l’écran LCD le message ci-dessus.

Exercice 1.5 :
Soit le montage de la figure ci-après. Ecrire un programme en C qui répond au fonctionnement
suivant :

 Un appui sur le bouton B1 seul, l’afficheur affiche ’BONJOUR’ et la diode D1 clignote.

 Un appui sur le bouton B2 seul, l’afficheur affiche ‘BONSOIR’ et la diode D2 clignote.

 Un appui sur le bouton B3 seul, l’afficheur affiche ‘SALAM’ et la diode D3 clignote.

 Pour les autres cas, rien ne se passe.


TRAVAUX DIRIGES N° : 2

SYSTEMES D’ENTREE DES DONNEES (1)


Exercice 2.1 :
Soient les équations suivantes d’un système logique combinatoire :

S1  A  B  C.B ,

S2 A.B  C.B  C ,

S3  A  B  C.B

S4 A  C.B ,

S5 B.C.A
On propose le schéma de simulation suivant :

Ecrire un programme en C qui permet d’implanter le système combinatoire précédent.

Exercice 2.2 :
On désire commander une LED par plusieurs endroits à l’aide d’un microcontrôleur 16F84A via des
boutons poussoir BPi (BP1, BP2 et BP3).
Une impulsion sur l’un des boutons poussoir BPi, la LED D s’allume, une deuxième impulsion la
LED s’éteint.
Ecrire un programme C qui répond au cahier de charge.
Exercice 2.3 :
On désire réaliser une minuterie d’escalier à 3 temps réglable (1min, 3min, 5min) à l’aide d’un
microcontrôleur 16F84A.

Le principe de fonctionnement est le suivant :


- Une impulsion sur l’un des boutons poussoir BPi, la LED D s’allume pendant un temps T
puis s’éteint.
- Deux impulsions successives est sans effet.
- Le temps est réglable par un commutateur C à trois positions.
Ecrire un programme C qui répond au cahier de charge.
TRAVAUX DIRIGES N° : 3

SYSTEMES D’ENTREE DES DONNEES (2)


Exercice 3.1 :

Ce circuit illustre l'utilisation d'un clavier et un écran LCD alphanumérique.

Ecrire un programme qui lit un caractère à partir du clavier et l’affiche sur l’écran LCD.

Exercice 3.2 :

On désire commander un afficheur à 7 segments à l’aide d’un microcontrôleur 16F877A via un


clavier à 12 touches.

Le principe de fonctionnement est le suivant :

- L’appui sur une touche de 0 à 9 affiche sa valeur sur l’afficheur 7 segments.

- L’appui sur la touche (*) affiche la lettre E sur l’afficheur 7 segments.

- L’appui sur la touche (#) affiche la lettre F sur l’afficheur 7 segments.

Ecrire un programme qui répond à ce cahier des charges.


Exercice 3.2 :

Exercice 3.3 :
Soit le circuit suivant composé d’un microcontrôleur PIC 16F877A muni d’un afficheur LCD et 16
boutons poussoirs jouant le rôle d’un clavier matriciel :

Ecrire un programme qui lit un caractère à partir du clavier et l’affiche sur l’écran LCD.
TRAVAUX DIRIGES N° : 4

CONVERTISSEUR ANALOGIQUE NUMERIQUE

Exercice 4.1
Soit le montage suivant :

On veut réaliser un comparateur entre les valeurs de deux tensions analogiques appliquées sur
chacune des pins RA0 et RA1 via deux potentiomètres.
Ecrire un programme en C qui répond au cahier des charges suivant :
- Si tension 0 > tension 1 alors afficher la lettre S.
- Si tension 0 = tension 1 alors afficher la lettre E.
- Si tension 0 < tension 1 alors afficher la lettre I.
L’affichage des résultats se fera sur un afficheur 7 segments comme le montre la figure ci-dessus.

Exercice 4.2
Soit le montage suivant :

Mr Nizar TOUJENI 110


Ecrire un programme en C qui répond au fonctionnement suivant :
- Si RA0 < RA1, on doit faire un comptage modulo 20.
- Si RA0 > RA1, on doit faire un décomptage modulo 20.
- Si RA0 = RA1, on affiche la lettre H sur les deux afficheurs.
L’affichage des résultats se fera sur un afficheur 7 segments.

Exercice 4.3 :
Soit le montage ci-après. Ecrire un programme en C qui répond au fonctionnement suivant :
- Si tension 0 > tension 1 alors afficher sur chaque afficheur 7 segments la lettre S.
- Si tension 0 = tension 1 alors afficher sur chaque afficheur 7 segments la lettre E.
- Si tension 0 < tension 1 alors afficher sur chaque afficheur 7 segments la lettre I.
Le programme doit afficher aussi sur le LCD 16x4 :
- Ligne 1 : le message « Comparateur »,
- Ligne 2 : la valeur de la tension 0,
- Ligne 3 : la valeur de la tension 1,
- Ligne 4 : la valeur de la tension maximale.
Exercice 4.3
TRAVAUX DIRIGES N° : 5

MODULATION A LARGEUR D’IMPULSION


Exercice 5.1 :
Pour faire varier la vitesse d’un moteur à courant continu, on vous propose le circuit de la figure ci-
dessous :

Ecrire un programme qui lit une valeur numérique sur le PORTB sous forme d’un nombre codé sur 8
bits. Ce nombre constituera le rapport du cyclique d'un signal PWM qui va être généré pour
commander un moteur à courant continu.
Exercice 5.2 :
Pour rendre les choses plus intéressantes, la durée d’impulsions à la sortie CCP1 (PORTC, 2) peut
être changée avec les touches symboliquement marqués comme "BRILLANT" et "NOIR", tandis que
la durée est considérée comme la combinaison binaire sur le PORTD.
La diode D1 signale que le module CCP1 est activé. Dans le montage réel son état corresponde à
l’état de la diode D2 pendant la simulation.
- Un appui sur le bouton BRILLANT fait augmenter le rapport cyclique,
- Un appui sur le bouton NOIR fait diminuer le rapport cyclique.
Microcontrôleurs Iset de Nabeul

Ecrire un programme en MikroC qui répond au cahier des charges.

Exercice 5.2 :

Mr Nizar TOUJENI 121


Microcontrôleurs Iset de Nabeul

Correction TRAVAUX DIRIGES N° : 1

AFFICHAGE DES DONNEES


Exercice 1.2 :
Question 1 :

#define B1 PORTB=0x00; Delay_ms(500);

RA0_bit void }

main() else
{
TRISA=0xFF; TRISB=0x00; PORTB=0x00; {

while(1) PORTB=0x55;
Delay_ms(500);
{ PORTB=0xAA;
Delay_ms(500);
if(B1==0) }

{ }

PORTB=0xFF; Delay_ms(500); }

Question 2 :

#define B1 RA0_bit PORTB=0xFF;


Delay_ms(500);
int i; PORTB=0x00;
Delay_ms(500);
void main()
}
{ }

TRISA=0xFF; else
TRISB=0x00; {
PORTB=0x00; PORTB=0x03; Delay_ms(1000);
while(1) PORTB=0x0C; Delay_ms(2000);
{ PORTB=0x30; Delay_ms(3000);
if(B1==0) PORTB=0xC0; Delay_ms(4000);
{ PORTB=0x00; Delay_ms(1000);
for(i=0; i<2; i++){
Mr Nizar TOUJENI 122
Microcontrôleurs Iset de Nabeul

}
}

Mr Nizar TOUJENI 123


Exercice 1.3 :
1.

void main()

int i, CHIFFRE[10] = {0x3F, 0x06, 0x51011, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

TRISB = 0x00; PORTB = 0;

while(1)

if(RA0_Bit==1)

for(i=0;i<10;i++) {PORTB = CHIFFRE[i]; delay_ms(300);}

if(RA1_Bit==1)

for(i=0;i<10;i++) {PORTB = CHIFFRE[9-i]; delay_ms(300);}

2.

void main()

int i, CHIFFRE[10] = {0x3F, 0x06, 0x51011, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

TRISB = 0x00; PORTB = 0;

while(1)

{
if(RA0_Bit==1)

for(i=0;i<10;i+=2) {PORTB = CHIFFRE[i]; delay_ms(300);}

if(RA1_Bit==1)

for(i=1;i<10;i+=2) {PORTB = CHIFFRE[i]; delay_ms(300);}

Exercice 1.5 :
#define B1 RB2_bit D1 = 0; D2 = 0; D3 = 0;
#define B2 RB1_bit while(1)
#define B3 RB0_bit {
#define D1 RC0_bit if(B1==1&B2==0&B3==0)
#define D2 RC3_bit {
#define D3 RC6_bit Lcd_Out(1, 1, msg1);
sbit LCD_RS at RD2_bit; D1 = 1; delay_ms(500);
sbit LCD_EN at RD3_bit; D1 = 0; delay_ms(500);
sbit LCD_D4 at RD4_bit; }
sbit LCD_D5 at RD5_bit; else if(B1==0&B2==1&B3==0)
sbit LCD_D6 at RD6_bit; {
sbit LCD_D7 at RD7_bit; Lcd_Out(1, 1, msg2);
sbit LCD_RS_Direction at TRISD2_bit; D2=1;delay_ms(500);D2=0;delay_ms(500);
sbit LCD_EN_Direction at TRISD3_bit; }
sbit LCD_D4_Direction at TRISD4_bit; else if(B1==0&B2==0&B3==1)
sbit LCD_D5_Direction at TRISD5_bit; {
sbit LCD_D6_Direction at TRISD6_bit; Lcd_Out(1, 1, msg3);
sbit LCD_D7_Direction at TRISD7_bit; D3=1;delay_ms(500);D3=0;delay_ms(500);
char msg1[]="BONJOUR"; }
char msg2[]="BONSOIR"; else
char msg3[]="SALAM"; {
void main() Lcd_Cmd(_LCD_CLEAR);
{ D1 = 0; D2 = 0; D3 = 0;
Lcd_Init(); }
Lcd_Cmd(_LCD_CLEAR); }
Lcd_Cmd(_LCD_CURSOR_OFF); }
TRISB = 0xFF; TRISC = 0x00;
Correction TRAVAUX DIRIGES N° : 2

SYSTEMES D’ENTREE DES DONNEES (1)


Exercice 2.1 :

#define A if (A | B | !B & ! S1

RA0_bit #define C) else =1;

B RA1_bit // Equation de S2 S1=

#define C 0;

RA2_bit
#define S1 RB0_bit if(A & !B | B & !C | S2=
C) 1;
#define S2 RB1_bit else S2=
0;
#define S3 RB2_bit // Equation de S3

#define S4 RB3_bit if(!(A | B) | !B & C) S3=


1;
#define S5 RB4_bit else S3=
0;
void main( ) // Equation de S4

{ if(A | B & !C) S4


=1;
TRISA=0xFF; else S4=
0;
TRISB=0x00; // Equation de S5

PORTB = 0; if(A & B & !C) S5=


1;
while(1) else S5=
0;
{ }

// Equation de S1 }

Exercice 2.3

#define BP RA0_Bit #define C2 RB6_Bit #define C5 RB7_Bit

#define Led RA2_Bit void main()

#define C1 RB5_Bit
Led = 1;
delay_ms(60000);
Led = 0;

&

Led = 1;
delay_ms(120000);
Led = 0;

}
{ if(BP==1&C5==1)

TRISA=0x01; TRISB=0x07; {

while(1) Led = 1; delay_ms(300000); Led =


0;
{ }

if(BP==1&C1==1) }

{ }
Correction TRAVAUX DIRIGES N° : 3

SYSTEMES D’ENTREE DES DONNEES (2)


Exercice 3.1 : do

char keypadPort at PORTD; kpi = Keypad_Key_Click ( );


while (!kpi);
sbit LCD_RS at RB2_bit; switch (kpi) {

sbit LCD_EN at RB3_bit; case 1: kpi = 55; break; // 7

sbit LCD_D7 at RB7_bit; case 2: kpi = 52; break; // 4

sbit LCD_D6 at RB6_bit; case 3: kpi = 49; break; // 1


sbit LCD_D5 at RB5_bit; case 4: kpi = 32; break; // Espace
sbit LCD_D4 at RB4_bit; case 5: kpi = 56; break; // 8
sbit LCD_RS_Direction at TRISB2_bit; case 6: kpi = 53; break; // 5
sbit LCD_EN_Direction at TRISB3_bit; case 7: kpi = 50; break; // 2
sbit LCD_D7_Direction at TRISB7_bit; case 8: kpi = 48; break; // 0
sbit LCD_D6_Direction at TRISB6_bit; case 9: kpi = 57; break; // 9
sbit LCD_D5_Direction at TRISB5_bit; case 10: kpi = 54; break; // 6
sbit LCD_D4_Direction at TRISB4_bit; case 11: kpi = 51; break; // 3
int kpi; case 12: kpi = 61; break; // =
void main ( ) { case 13: kpi = 47; break; // /
Lcd_Init ( ); case 14: kpi = 42; break; // x
Lcd_Cmd (_LCD_CLEAR); case 15: kpi = 45; break; // -
Keypad_Init ( ); case 16: kpi = 43; break; // +
Lcd_Out (1,1,"Tapez une touche"); }
delay_ms (1000); Lcd_Chr (1, 2, kpi);
Lcd_Cmd (_LCD_CLEAR); }while (1);
}
do{ kpi = 0;
Exercice 3.3

char keypadPort at PORTC; case 5: return '4';

sbit LCD_RS at RB4_bit; case 6: return '5';

sbit LCD_EN at RB5_bit; case 7: return '6';

sbit LCD_D7 at RB3_bit; case 8: return 'B';

sbit LCD_D6 at RB2_bit;


case 9: return '7';
sbit LCD_D5 at RB1_bit;
case 10: return '8';
sbit LCD_D4 at RB0_bit;
case 11: return '9';
sbit LCD_RS_Direction at TRISB4_bit;
case 12: return 'C';
sbit LCD_EN_Direction at TRISB5_bit;
case 13: return '*';
sbit LCD_D7_Direction at TRISB3_bit;
case 14: return '0';
sbit LCD_D6_Direction at TRISB2_bit;
case 15: return '#';
sbit LCD_D5_Direction at TRISB1_bit;
case 16: return 'D';
sbit LCD_D4_Direction at TRISB0_bit;
default: return 0;
char Lecture_Clavier (void)
}}
{
void main ( ){
switch (Keypad_Key_Press ( ))
char clavier;
{
Lcd_Init ( );
case 1: return '1';
Lcd_Cmd (_LCD_CURSOR_OFF);
case 2: return '2';
Lcd_Out (1, 1,"Valeur:");
case 3: return '3'; while(1){
case 4: return 'A';
clavier = Lecture_Clavier ( );

Lcd_Chr (2,1,clavier);

delay_ms (500) ;} }
Correction TRAVAUX DIRIGES N° : 4

CONVERTISSEUR ANALOGIQUE NUMERIQUE


Exercice 4.1
int CHIFFRE[3] = {0B01101101, 0B01111001, 0B00000110};
unsigned int temp_res0, temp_res1;
float tension0, tension1;
void main()
{
TRISA=0xFF; TRISB=0x00;
while(1)
{
temp_res0=ADC_Read(0); temp_res1=ADC_Read(1); tension0=(float)
(temp_res0*5)/1024; tension1=(float)(temp_res1*5)/1024; if(tension0 >
tension1) PORTB = CHIFFRE[0];
if(tension0 == tension1) PORTB = CHIFFRE[1];
if(tension0 < tension1) PORTB = CHIFFRE[2];
}
}
Exercice 4.2
int i, j, chiffre [11] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110,
0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111,0b01110110};
unsigned int temp_res0, temp_res1;
float tension0, tension1;
void main()
{
TRISA=0xFF; TRISB=0x00; TRISC=0x00;
while(1)
{
temp_res0=ADC_Read(0); temp_res1=ADC_Read(1); tension0=(float)
(temp_res0*5)/1024; tension1=(float)(temp_res1*5)/1024; if(tension0 >
tension1)

Mr Nizar TOUJENI 130


{
for(i=0; i<2; i++)
{
PORTB = CHIFFRE[i];
for(j=0;j<10;j++)
{
PORTC = CHIFFRE[j]; delay_ms(500);
}
}
}
if(tension0 == tension1)
{
PORTB = CHIFFRE[10]; PORTC = CHIFFRE[10];
}
if(tension0 < tension1)
{
for(i=0; i<2; i++)
{
PORTB = CHIFFRE[1-i];
for(j=0; j<10; j++)
{
PORTC = CHIFFRE[9-j]; delay_ms(500);
}
}
}
}
}
Correction TRAVAUX DIRIGES N° : 5

MODULATION A LARGEUR D’IMPULSION

Exercice 5.1

void main ( ) PWM1_Start (

{ ); while(1)

TRISB = 0xFF; {

TRISC = 0x00; PWM1_Set_Duty(PORTB);

PORTC = 0; }

delay_ms(2000); }

PWM1_Init(1000);

Exercice 5.2

unsigned short cd=155, od=0; while(1)

void initMain () {

{ if(Button(&PORTB, 0,1,0)) cd+


+;
TRISB = 0xFF; if(Button(&PORTB, 1,1,0))
cd--;
TRISC = 0; if(od != cd)

TRISD = 0; {

PORTC = 0; PWM1_Set_Duty (cd);

PORTD = 0; od = cd;

PWM1_Init (5000); PORTD = od;

} }

void main ( ) Delay_ms(150);

{ }

initMain (); }

PWM1_Start

();

Mr Nizar TOUJENI 120


Mr Nizar TOUJENI 121

Vous aimerez peut-être aussi