Mini projet microcontrôleur thermomètre horloge

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

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)