Mini projet microcontrôleur thermomètre horloge

1/5 (15 avis)

Vue 49 524 fois - Téléchargée 5 992 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
REVESETOILES Messages postés 1 Date d'inscription lundi 16 avril 2012 Statut Membre Dernière intervention 21 avril 2012
21 avril 2012 à 18:58
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.
ilsab Messages postés 2 Date d'inscription dimanche 27 novembre 2011 Statut Membre Dernière intervention 7 janvier 2012
27 nov. 2011 à 14:04
Salut bon travail,et bon ne chance.
cs_ahmed05 Messages postés 1 Date d'inscription mardi 17 mai 2011 Statut Membre Dernière intervention 18 mai 2011
18 mai 2011 à 11:07
salut bon travail,svp donne moi la liste des composant plus shéma electrique,merci bon courage
hajourk Messages postés 3 Date d'inscription jeudi 31 mars 2011 Statut Membre Dernière intervention 12 avril 2013
5 avril 2011 à 11:30
salut svp tu peut me donner ce programme en mikro basic c trés urgent et merciiiiii d'avance
aladin589 Messages postés 1 Date d'inscription mercredi 7 avril 2010 Statut Membre Dernière intervention 20 avril 2010
20 avril 2010 à 11:17
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)