0% ont trouvé ce document utile (0 vote)
46 vues17 pages

Projet MikroC pour microcontrôleur PIC

Transféré par

HASSAN EL MOUSSAOUI
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
46 vues17 pages

Projet MikroC pour microcontrôleur PIC

Transféré par

HASSAN EL MOUSSAOUI
Copyright
© All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd

Université Sidi Mohammed Ben Abdallah

Faculté des Sciences et Techniques Fès


Département Génie Électrique

Polycopie du Module

Microcontrôleur PIC et Interfaces

Préparé par :Hassan EL MOUSSAOUI


2022-2023

Créationd'unpremierprojet

Vousdisposezd'unpetitfasciculeintitulé
[Link]àsuivrepourcréeretc
ompilerunprojet.

1. Manipulation
Suivrelesinstructions(jusqu'àl'exécution-run)aveclesrecommandationssuivantes:
- nomdu projet:tp1a
- Cheminduprojetd:\rep_perso\
[Link]êtrecrééenremplaçantrep_persoparunnomquivousest propre
- Letype(device) estàlire surlapuceelle-mê[Link] 16F887.
- Choisirlesfusiblespardéfaut.
- Leprogrammesuivantestàsaisir :

1 void main()
2 {
3 ANSEL=ANSELH=0; //ToutesleportsE/Ssontconfiguréscommenumériques
4 PORTC=0;
5 TRISC=0;
6 while(1)
7 {
8 PORTC=~PORTC; //togglePORTC
7 Delay_ms(500);
8 }
9 }

SivousvoulezunfonctionnementcorrectdeDelay_ms,ilfautconfigureraussilafréquenceduqu
artz (8MHz)correctement.

Exemple -1
OnvousdonneunprogrammeCquifaitclignoteruneled(poidsfaible) surleportC.
1 void main()
2 {
3 ANSEL=ANSELH=0; //ToutesleportsE/Ssontconfiguréscommenumériques
4 TRISC=0; //touslesbitsensortiepourPORTC
5 PORTC=0;
6 while(1)
7 {
8 PORTC=0x01;
7 Delay_ms(1000);
8 PORTC=0x00;
9 Delay_ms(1000);
10 }
11 }

Exemple -2
Ce programme fait clignoter d’une LED connectée au port RB0 d'un microcontrôleur PIC avec
l’intervalle d’une seconde. En utilisant les commandes de préprocesseur #define le programme est
devenu plus facile à suivre.

#define LED PORTB.0


#define ON 1
#define OFF 0
#define One_Second_DelayDelay_ms(1000)
void main()
{
TRISB = 0; // PORTB estconfiguréen sortie
for(; ;) // Boucle sans fin
{
LED = ON; // LED estallumée (ON)
One_Second_Delay; // Retard 1 seconde
LED = OFF; // LED estdésactivée (OFF)
One_Second_Delay; // Retard 1 seconde
}
}

Exemple -3
Chenille à LEDs

Dans ce projet les huit LEDs sont connectées à PORTC d'un microcontrôleur.
Lorsqu'une tension est appliquée au microcontrôleur (ou est réinitialisé), les LEDs s'allument en
alternance. Il y a le délai d’une seconde de sorte qu’une LED peut être vu tourner sur ON et OFF.
Le schéma de principe du projet est illustré à la figure suivante.

Chenille à LEDs
===============
Les huit LEDs sont connectées à PORTC du microcontrôleur pic16f887. Lorsqu'une
tension est appliquée au microcontrôleur (ou est réinitialisé), les LEDs s'allument en alternance.

void main()
{
unsigned char J = 1;
TRISC = 0; // PORTC est configure en sortie
for(;;) // Boucle sans fin
{
PORTC = J; // Envoyer J au PORTC
Delay_ms(100); // Pause 100 ms
J = J << 1; // Décalage à gauche J
if(J == 0) J = 1; // Si la dernière LED, allumer la 1ère LED
}
}

SYSTEMES D’ENTREE DES DONNEES

L'interaction de l’utilisateur avec les systèmes à microcontrôleurs nécessite des systèmes d’entrée
de données. Pour ce faire, on utilise des périphériques tels que des interrupteurs, des claviers et
même des claviers PS2 utilisés par les ordinateurs de bureau.

Pour le traitement des boutons et l’élimination des rebondissements, le compilateur MikroC PRO
dispose d’une bibliothèque Button, qui peut être trouvé dans la palette ou l'onglet des
bibliothèques.
Cettebibliothèquecontient la seulefonction : unsigned short Button (unsigned short *port,
unsigned short pin, unsigned short time, unsigned short active_state) ;

Installation des boutons peut être effectuée de deux manières, actif à l’état haut ou actif à l’état
bas, la figure suivante montre comment configurer les deux possibilités :
La décision d'utiliser l'activation à l’état haut ou bas, dépend du développeur qui doit analyser la
manière la plus simple au moment de la conception. On rappelle que dans tous les cas l'activation
finale peut être inversée avec la fonction de la bibliothèque

Le programme respectif du microcontrôleur est le suivant :


voidmain( void)
{
TRISB=0xF0; //Configuration des ports.
PORTB=0;
while(1) //Boucle infinie
{
if(Button(&PORTB, 7, 100, 0)) //Test de d’état du bouton sur RB7, activé à l’état bas
PORTB.F0=1; // Allumer le voyant si le bouton est actif.
else
PORTB.F0=0; //Eteindre la LED s’il est relâché.
}
}

A l’exécution de la simulation, la LED doit s'allumer lorsque le bouton est pressé, et s’éteindre
lorsqu'il est relâché.
L'exemple suivant commute l’état de la LED :
voidmain( void)
{
TRISB=0xF0; //Configuration des ports.
PORTB=0;
while(1) //Boucle infinie.
{
if(Button(&PORTB, 7, 100, 0)) //Test de l’état actif du bouton.
{
if( PORTB.F0==1 ) // Commutation de l’état de la LED.
PORTB.F0=0;
else
PORTB.F0=1;
//Attente que le bouton soit no actif.
while( Button(&PORTB, 7, 100, 0) );
}
}
}

void main()
{
TRISC=0X00;
PORTC=0X00;
TRISD=0XFF;
for(;;)
{
if(PORTD.B0==0) PORTC.B0=1; else PORTC.B0=0;

}
}

Objectif:Danscetteexpérienceonvaapprendreàcontrôlerunafficheur7segments.

ManipulationN1 compteur:
Circuit sous ISIS CompilateurmikroCPRO

Circuit sous ISIS CompilateurmikroCPRO


Manipulation N3compteuretdécompteur:

Circuit sous isis CompilateurmikroCPRO

Objectif:Cettemanipulationa pourobjectifd’utiliserun boutonpoussoirviale pic16f877.

ManipulationN1:
Circuit sous ISIS CompilateurmikroCPRO

Exercice4
 Dans le même projet, réaliser un 4 ème exercice de test qui permet d’afficher un chiffre 7 segments
de 0 à 9 avecune cadence de 500ms ? (déclarer un tableau tab[10] contenant les 10 codes 7
segments des chiffres de 0 à 9 etavecuneboucleforrepérerlecodeàenvoyer).
 VérifierlefonctionnementdevotreprogrammeviaPROTEUSISIS ?
Remarque:MikroC vouspermetdedéterminer lecode7segments ;enallant
dans:ToolsSevenSegmentEditor.
Exercice5
 Dans le même projet, réaliser un 5ème exercice de test qui permet d’incrémenter le chiffre affiché en
appuyant unbouton poussoir?
 VérifierlefonctionnementdevotreprogrammeviaPROTEUSISIS ?

Exercice6
 Dans le même projet, réaliser un 6 ème exercice de test qui permet de contrôler l’affichage de deux
chiffre (2 digits)7 segments de 0 à 99 avec une cadence de 500ms ? (déclarer un tableau tab[10]
contenant les 10 codes 7segmentsdeschiffresde 0à 9etavecdesbouclesforrepérerle codeàenvoyer)?
 VérifierlefonctionnementdevotreprogrammeviaPROTEUSISIS ?
Objectif : L’objectif de ce 2ème TP est toujours de se familiariser avec la programmation
du microcontrôleur PIC 16F887et aux environnements de conception et de simulation
(MikroC et Proteus ISIS). On cherche simplement à réaliser
unprogrammeenMikroCquiorganisela circulationdesvéhiculesdansuncroisementexterne
deroute(carrefour).

I- Gestiond’unseulfeutricolores
RéaliserunprogrammeenMikroCquipermetdepiloterlefeutricoloredelafigureci-
dessous.Vérifierlebonfonctionnement duprogrammeréalisé enutilisantProteusISIS.
1 2 3 4

32sec 4sec

Eneffet,lechronogrammedefonctionnementes
t lesuivant:
Déclenchement
32sec 4sec

Vert Orange
Rouge

32 sec 4 sec 32 sec 4 sec


Déclenchement

VertOr

ange

Rouge

32sec 4sec 32sec 4sec

II- Gestiondedeuxfeuxtricoloresdecirculation(carrefour)
RéaliserunprogrammeenMikroCquipermetdepiloterdeuxfeuxtricoloresdecarrefour.Vérifier
lebonfonctionnementdu programmeréaliséenutilisantProteusISIS.
2

Lechronogrammedefonctionnementestlesuivant:

Déclenchement

VertOr

1 ange

Rouge

32sec 4sec 32sec 4sec

Déclenchement

VertOr

2 ange

Rouge
32sec4sec 32sec 4sec
III- Gestiondedeuxfeuxtricoloresdecirculationetdeuxpassagespiétons
RéaliserunprogrammeenMikroCquipermetdepiloteruncarrefouravecpassagepiétons.Vérifi
erlebonfonctionnement duprogrammeréalisé enutilisantProteusISIS.

Lechronogrammedefonctionnementestlesuivant:
Déclencheme

ntVert

Orange

Rouge
1 [Link]étons

[Link]étons

32sec 4sec 32sec 4sec

Déclenchement

Vert

Orang

eRoug
2
e

[Link]étons

32sec 4sec 32sec 4sec


[Link]étons
* Mode 1 is running LED's
* Mode 2 (Bar graph) each Led switch on one at the time moving to the next Led
* Mode 3 is reverse of mode 2 each Led switch off one at the time
* Mode 4 only activated when RA3 is high then the following happens
* RA0 controls state of Led on RB0 i.e when high RB0 output is high vice versa
* RA1 controls state of Led on RB1 irrespective of state on RB0
* RA2 controls state of Led on RB2 irrespective of the other inputs

/*-----------------------------------------------------------------------------*
* Multiple mode LEDs Project1 Brought by Lofg Tech Learning with Sakkie
* Here is how each mode work
* Mode 1 is running LEDs
* Mode 2 (Bar graph) each Led switch on one at the time moving to the next Led
* Mode 3 is reverse of mode 2 each Led swith off one at the time
* Mode 4 only activated when RA3 is high then the following happens
* RA0 controls state of Led on RB0 i.e when high RB0 output is high vice versa
* RA1 controls state of Led on RB1 irrespective of state on RB0
* RA2 controls state of Led on RB2 irrespective of the other inputs
*More projects on my Youtube Channel [Link]
*/
void Setinputsoutputs()
{
ADCON1 = 6;
CMCON = 0x00;
//set PORTA as input and Portb as output
TRISA = 0xff;
TRISB = 0x00;
PORTB = 0x00; // set )as initial oupus for all portb pins
}
void main() {
Setinputsoutputs(); //call Setinputsoutputs function
while(1)
{
//Mode 1
if(PORTA.RA0 == 1 && PORTA.RA1 == 0 && PORTA.RA2 == 0 && PORTA.RA3
==0)
{
PORTB = 0b10000000;
delay_ms(700);
PORTB = 0b01000000;
delay_ms(700);
PORTB = 0b00100000;
delay_ms(700);
PORTB = 0b00010000;
delay_ms(700);
PORTB = 0b00001000;
delay_ms(700);
PORTB = 0b00000100;
delay_ms(700);
PORTB = 0b00000010;
delay_ms(700);
PORTB = 0b00000001;
delay_ms(700);
PORTB = 0x00;
}
//Mode 2
else if (PORTA.RA0 == 0 && PORTA.RA1 == 1 && PORTA.RA2 == 0 &&
PORTA.RA3 ==0)
{
PORTB = 0b10000000;
delay_ms(700);
PORTB = 0b11000000;
delay_ms(700);
PORTB = 0b11100000;
delay_ms(700);
PORTB = 0b11110000;
delay_ms(700);
PORTB = 0b11111000;
delay_ms(700);
PORTB = 0b11111100;
delay_ms(700);
PORTB = 0b11111110;
delay_ms(700);
PORTB = 0b11111111;
delay_ms(700);
PORTB = 0x00;
}
//Mode 3
else if (PORTA.RA0 == 0 && PORTA.RA1 == 0 && PORTA.RA2 == 1 &&
PORTA.RA3 ==0)
{
PORTB = 0b11111111;
delay_ms(700);
PORTB = 0b11111110;
delay_ms(700);
PORTB = 0b11111100;
delay_ms(700);
PORTB = 0b11111000;
delay_ms(700);
PORTB = 0b11110000;
delay_ms(700);
PORTB = 0b11100000;
delay_ms(700);
PORTB = 0b11000000;
delay_ms(700);
PORTB = 0b10000000;
delay_ms(700);
PORTB = 0x00;
}
//Mode 4
if(PORTA.RA3 == 1 && PORTA.RA0 ==1)
{
PORTB.RB0 =1;
}
if(PORTA.RA3 == 1 && PORTA.RA0 == 0)
{
PORTB.RB0 = 0;
}
if(PORTA.RA3 == 1 && PORTA.RA1 ==1)
{
PORTB.RB1 = 1;
}
if(PORTA.RA3 == 1 && PORTA.RA1 ==0)
{
PORTB.RB1 = 0;
}
if(PORTA.RA3 == 1 && PORTA.RA2 ==1)
{
PORTB.RB2 = 1;
}
if(PORTA.RA3 == 1 && PORTA.RA2 ==0)
{
PORTB.RB2 = 0;
}
}
}

Vous aimerez peut-être aussi