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
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.