Mini projet microcontrôleur thermomètre horloge

Soyez le premier à donner votre avis sur cette source.

Vue 47 453 fois - Téléchargée 5 761 fois

Description

Présentation:
On désire réaliser un projet d'horloge micro programmée avec affichage de la température à l'aide de la maquette du TP, utilisant le PIC 16F877, un module LCD 2 lignes de 16 caractères un capteur de température LM35 et un clavier à 3 touches reliées au PORTB.
Le clavier permettra d'assurer le réglage du temps.
Le capteur de température est câblé sur l'entrée analogique du microcontrôleur RAO.

Source / Exemple :


#define   RS           RB2
#define   E              RB3 
#define   LCD         PORTD  

// Clear Display  
#define  CLS     	    0x01 

// Display & Cursor Home 
#define  HOME  		      0x02 

// EntryMode   
#define  CURSOR_DEC            0x04 
#define  CURSOR_INC            0x06

#define  DISP_SHIFT_ON         0x05 
#define  DISP_SHIFT_OFF        0x04

// LCD_Display  
#define  DISPLAY_ON            0x0C
#define  DISPLAY_OFF                   0x08

#define  CURSOR_ON                      0x0A 
#define  CURSOR_OFF                     0x08 
 
#define  BLINK_ON                         0x09 
#define  BLINK_OFF                        0x08
 
// LCD_FonctionSet  
#define  MODE_8BIT                       0x30 
#define  MODE_4BIT                       0x20 
 
#define  MODE_2LINE                    0x28 
#define  MODE_1LINE                    0x20
 
#define  FONT_5x7                          0x20
#define  FONT_5x10                        0x24 

// LCD_ModeSelection 
#define  COMMAND_MODE           0 
#define  DATA_MODE                     1 
 
//===========================================================
void Set_Enable();
void Lcd_SendCommand(unsigned char Command);
void Lcd_SendData(unsigned char Data);

//===========================================================
void Lcd_SendCommand(unsigned char Command)
{
	 RS = COMMAND_MODE ;
	 LCD = Command;
	 Set_Enable();
}
//===========================================================
void Lcd_SendData(unsigned char Data)
{	
	  RS = DATA_MODE ;
	  LCD = Data;
	  Set_Enable();
}
//===========================================================
void Set_Enable()
{
 	 unsigned char i;
	
  	  E = 1;	for (i=0;i<200;i++);
	  E = 0;	for (i=0;i<200;i++);
}
//===========================================================
void Lcd_Init()
{
        Lcd_SendCommand (MODE_8BIT | MODE_2LINE | FONT_5x7); 
        Lcd_SendCommand(DISPLAY_ON | CURSOR_OFF | BLINK_OFF);
        Lcd_SendCommand(CURSOR_INC | DISP_SHIFT_OFF) ;
        Lcd_SendCommand(CLS );
}
//===========================================================
void Lcd_LigneColonne(unsigned char Ligne, unsigned char Colonne)
{
	Lcd_SendCommand(DISPLAY_ON | CURSOR_OFF | BLINK_OFF);
       if(Ligne==1) 	Lcd_SendCommand (0x80+Colonne);
	if(Ligne==2) 	Lcd_SendCommand (0xC0+Colonne);
}
//===========================================================

/**************************************************
          Mini-Projet
    Date         : 4/07/2008
    Auteur 	 :  HILALI Tarik & ELQASMI Med Zakaria
      Compilateur : HI-TECH C Compiler
	Objectif : mettre à jour l'Horloge,lire la Température
    ( tension analogique )  à intervalles de temps réguliers  et
   afficher le résultat  sur  l'afficheur LCD (2x16).
   	PIC 16F877
    Quartz : 4 MHz

                                                                                                      • /
#include<pic1687x.h> #include "lcd.h" #define degre 0xDF unsigned char Jr , Hr , Mn , Sc , n , m1, m2 , pression , pointeur , v1 , v2 , temp; const unsigned char T[ ]="LunMarMerJeuVenSamDim"; const unsigned char word[ ]="EMSIMARRAKECHMini-Projet :16F877+LCD+CAN"; const unsigned char prof[ ]="ENCADRE PAR :<< Mr.CHOURI >>"; //static int temp; bit FinSeconde , Finduree1 , Finduree2 ; bit normal_reglage , select , plus ; /**************************************************/ static void interrupt inter() { if(TMR1IF) { TMR1H = 0x3C ; TMR1L = 0xB0 ; m1++; if(m1==12) // 600 mS { m1=0; Finduree1 =1; } m2++; if(m2==4) // (6) 300 mS { m2=0; Finduree2 =1; } n++; if(n==20) // 1000 mS { n=0; FinSeconde =1; } TMR1IF=0; } } /*************************************************/ void AfficheHorloge() { Lcd_LigneColonne(1,0); Lcd_SendData(Hr/10 +48); Lcd_SendData(Hr%10 +48); Lcd_SendData(':'); Lcd_SendData(Mn/10 +48); Lcd_SendData(Mn%10 +48); Lcd_SendData(':'); Lcd_SendData(Sc/10 +48); Lcd_SendData(Sc%10 +48); } /*************************************************/ void AfficheJour() { Lcd_LigneColonne(1,11); Lcd_SendData(T[Jr*3]); Lcd_SendData(T[Jr*3+1]); Lcd_SendData(T[Jr*3+2]); } /*************************************************/ void MiseAjour() { Sc++; if(Sc==60) { Sc=0; Mn++; if(Mn==60) { Mn=0; Hr++; if(Hr==24) { Hr=0; Jr++; if(Jr==7) Jr=0; } } } } /*************************************************/ unsigned int ConvertAD() { unsigned char t; unsigned int V=0; ADCON1 = 0x8E; ADCON0 = 0xC1; t=10; while(--t); ADGO = 1; while(ADGO==1); V = ADRESH; V = V<<8; V = V | ADRESL; return V; } /*************************************************/ void AfficheTemperature() { temp = 5.00 * ConvertAD() * 1000.00 / 1024.00 ; Lcd_LigneColonne(2,4); if(temp>=0x80) { Lcd_SendData('-'); temp = (~(temp)+1) ; Lcd_SendData(temp/100+48); Lcd_SendData((temp%100)/10+48); Lcd_SendData(','); Lcd_SendData((temp%100)%10+48); Lcd_SendData(degre); // "°" } else if(temp<0x80) { Lcd_SendData('+'); Lcd_SendData(temp/100+48); Lcd_SendData((temp%100)/10+48); Lcd_SendData(','); Lcd_SendData((temp%100)%10+48); Lcd_SendData(degre); // "°" } Lcd_SendData('C'); } /*************************************************/ void Entree() { v1=0; Lcd_Init(); while(v1!=4) // "EMSI" if(Finduree2==1) { Finduree2=0; Lcd_LigneColonne(1,v1+6); Lcd_SendData(word[v1]); v1++ ; } while(v1!=13) // "MARRAKECH" if(Finduree2==1) { Finduree2=0; Lcd_LigneColonne(2,v1); Lcd_SendData(word[v1]); v1++ ; } v2=0; // Temporisation : 3 S while(v2!=3) if(FinSeconde==1) { FinSeconde=0; v2++; } v2=0; Lcd_Init(); while(v1!=26) // "Mini-ProJet :" if(Finduree2==1) { Finduree2=0; Lcd_LigneColonne(1,v1-13); Lcd_SendData(word[v1]); v1++ ; } while(v1!=40) // "16F877+LCD+CAN" if(Finduree2==1) { Finduree2=0; Lcd_LigneColonne(2,v1-25); Lcd_SendData(word[v1]); v1++ ; } v2=0; // Temporisation : 3 S while(v2!=3) if(FinSeconde==1) { FinSeconde=0; v2++; } v2=v1=0; Lcd_Init(); while(v1!=13) // "ENCADRE PAR :" if(Finduree2==1) { Finduree2=0; Lcd_LigneColonne(1,v1); Lcd_SendData(prof[v1]); v1++ ; } while(v1!=28) // "<< Mr.CHOURI >>" if(Finduree2==1) { Finduree2=0; Lcd_LigneColonne(2,v1-13); Lcd_SendData(prof[v1]); v1++ ; } v2=0; while(v2!=5) // Temporisation : 5 S if(FinSeconde==1) { FinSeconde=0; v2++; } v2=v1=0; Lcd_Init(); } /*************************************************/ void Mode() { if(RB0) pression=0; else pression++; if(pression==3 && normal_reglage==1) { normal_reglage = pression = 0; } else if(pression==3 && normal_reglage==0) { normal_reglage = pointeur = 1; pression=0; } } /*************************************************/ void Select() { if(normal_reglage==1) { if(pointeur==1) pointeur=4; else if(pointeur==4) pointeur=11; else if(pointeur=11) pointeur=1; } } /*************************************************/ void Plus() { if(normal_reglage==1) { if(pointeur==1) { Hr++; if(Hr==24) Hr=0; AfficheHorloge(); } else if(pointeur==4) { Mn++; if(Mn==60) Mn=0; AfficheHorloge(); } else if(pointeur==11) { Jr++; if(Jr==7) Jr=0; AfficheJour(); } } } /*************************************************/ void lente() { if(!RB4) { if(Finduree1==1) { Finduree1=0; Select(); v1++; if(v1==6) v1--; } } else v1=0; if(!RB5) { if(Finduree1==1) { Finduree1=0; Plus(); v2++; if(v2==6) v2--; } } else v2=0; } /*************************************************/ void rapide() { if(v1==5 && Finduree2==1) { Finduree2=0; Select(); } if(v2==5 && Finduree2==1) { Finduree2=0; Plus(); } } /*************************************************/ void Curseur() { if(normal_reglage==1) { Lcd_LigneColonne(1,pointeur); Lcd_SendCommand(DISPLAY_ON | CURSOR_ON | BLINK_ON); } else Lcd_SendCommand(DISPLAY_ON | CURSOR_OFF | BLINK_OFF); } /*************************************************/ void main() { TRISD = 0x00; TRISB = 0x31; Jr = Hr = Mn = Sc = 0; FinSeconde = pression = n = m1 = m2 = v1 = v2 = 0x00; Finduree1 = Finduree2 = 0 ; normal_reglage = select = plus = 0 ; pointeur = 1; GIE = PEIE = 1 ; T0IE = 0 ; // inValid TMR0 (OPTION = 0x04) T1CKPS1 = T1CKPS0 = 0 ; // 1Mhz --> 1 µs TMR1ON = TMR1IE = 1 ; // Valid TMR1 TMR1H = 0x3C ; TMR1L = 0xB0 ; // ~ 310 ms Entree(); for(;;) { if( FinSeconde==1 ) { FinSeconde=0; MiseAjour(); AfficheJour(); AfficheHorloge(); AfficheTemperature(); Mode(); } lente(); rapide(); Curseur(); } } /******************* FIN *********************/

Conclusion :


pour tester il y a le schema realiser avec isis proteus 7

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
lundi 16 avril 2012
Statut
Membre
Dernière intervention
21 avril 2012

Bonjour,

Est-il possible de faire fonctionner ce projet en mode 4 Bits ?
J'ai essayé en modifiant en (MODE_4BIT | MODE_2LINE | FONT 5x7); Mais Ca ne fonctionne pas.
En mode 8 Bits, c'est OK.
70.void Lcd_Init()
71.{
72. Lcd_SendCommand (MODE_8BIT | MODE_2LINE | FONT_5x7);
73. Lcd_SendCommand(DISPLAY_ON | CURSOR_OFF | BLINK_OFF);
74. Lcd_SendCommand(CURSOR_INC | DISP_SHIFT_OFF) ;
75. Lcd_SendCommand(CLS );

Qui peut m'aider? car je ne trouve vraiment pas.
Messages postés
3
Date d'inscription
dimanche 27 novembre 2011
Statut
Membre
Dernière intervention
7 janvier 2012

Salut bon travail,et bon ne chance.
Messages postés
1
Date d'inscription
mardi 17 mai 2011
Statut
Membre
Dernière intervention
18 mai 2011

salut bon travail,svp donne moi la liste des composant plus shéma electrique,merci bon courage
Messages postés
3
Date d'inscription
jeudi 31 mars 2011
Statut
Membre
Dernière intervention
12 avril 2013

salut svp tu peut me donner ce programme en mikro basic c trés urgent et merciiiiii d'avance
Messages postés
1
Date d'inscription
mercredi 7 avril 2010
Statut
Membre
Dernière intervention
20 avril 2010

slt.svp tu pe me donner ce programme en mikroc et comment je pe utiliser le devppc et l'affichage de temperature elle atteind 12 degre puis il devient négatif
Afficher les 15 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (zmtechnologie)