ETUDE DUN SYSTEME DE COMPTAGE DE PIECES Compte-Rendu Projet microcontroleur Réalisés et presentés...
of 29
/29
-
Author
irene-pasquet -
Category
Documents
-
view
108 -
download
3
Embed Size (px)
Transcript of ETUDE DUN SYSTEME DE COMPTAGE DE PIECES Compte-Rendu Projet microcontroleur Réalisés et presentés...
- Page 1
- ETUDE DUN SYSTEME DE COMPTAGE DE PIECES Compte-Rendu Projet microcontroleur Raliss et presents par : - SABIR Lihimdi - FATIMA ZOHRA El Merrakchi Anne : 2009/2010 3IAII Encadrant EMSI Mr:CHOURI.
- Page 2
- Plan Presentation. Schma du systme. Materiels utiliss. Les fonctions utilises. Les fonctions utilises.Tester.
- Page 3
- Presentation Le projet ralis est un systme de comptage, de trois types de pices transportes par trois tapis roulants, au passage dune pice devant un capteur optique,ce dernier gnre une impulsion permettant dincrmenter le cpt1 pour le passage des pices sur le tapis 1 et le cpt2 pour les pices du tapis 2 et le cpt3 pour les pices du tapis 3, la suite du programme est faite par un afficheur LCD pour afficher la Date,le jour,le mois, lheure et les minutes du circuit pcf et la valeur des trois compteurs,enfin lenregistrement des donnes dans la memoire EEPROM toutes les 30 minutes,avec la possibilit de la communication entre le Pic et le PC avec le logiciel Hyper-Treminal
- Page 4
- Schma du systme
- Page 5
- Materials utiliss Afficheur LCD 2 lignes 16 caractres en mode 4 bits Circuit PCF8583 utilis en mode Horloge Mmoire EEPROM 24C64 Circuit MAX232
- Page 6
- Les fonctions utilises dans le projet projet
- Page 7
- void start() {sdaon;sclon;sdaoff;scloff;} void stop() {scloff;sdaoff;sclon;sdaon;} void ackesclave() { unsigned char A; scloff;sdaon;sclon;A=PORTC.F4; if(A==0) scloff; } void transmission(unsigned char d) { unsigned char M=0X80; int i; for(i=0;i>1; M=M>>1;}} unsigned char reception() { unsigned char v=0x00,m=0x80; unsigned char v=0x00,m=0x80; int i; int i; sdaon; sdaon; for(i=0;i1; m=m>>1;} return (v); }
- Page 8
- Ses fonctions servent communiquer les composants du schma de la carte connects au bus i2C avec le microcontrleur
- Page 9
- void ecrirehorloge(unsigned char adrm,unsigned char d) {start();transmission(0xA0);ackesclave();transmission(adrm);ackesclave();transmission(d);ackesclave();stop();} unsigned char lire_horloge(unsigned char adresse) { unsigned char donnee; I2C_Start(); I2C_Start(); I2C_Wr(0xA0); I2C_Wr(0xA0); I2C_Wr(adresse); I2C_Wr(adresse); I2C_Repeated_Start(); I2C_Repeated_Start(); I2C_Wr(0xA1); I2C_Wr(0xA1); donnee = I2C_Rd(0u); donnee = I2C_Rd(0u); I2C_Stop(); I2C_Stop(); return donnee; return donnee; delay_ms(100); delay_ms(100);} >5; j"> >4)+48); Lcd_Chr(1,8,(mois>>4)+48); Lcd_Chr(1,9,(mois&0x0F)+48); Lcd_Chr(1,9,(mois&0x0F)+48); Lcd_Chr(1,12,(h>>4)+48); Lcd_Chr(1,12,(h>>4)+48); Lcd_Chr(1,13,(h&0x0F)+48); Lcd_Chr(1,13,(h&0x0F)+48); Lcd_Out(1,14, ":"); Lcd_Out(1,14, ":"); Lcd_Chr(1,15,(m>>4)+48); Lcd_Chr(1,15,(m>>4)+48); Lcd_Chr(1,16,(m&0x0F)+48); Lcd_Chr(1,16,(m&0x0F)+48);}}">
- void pcf() { se=lire_horloge(0x02); m=lire_horloge(0x03); m=lire_horloge(0x03); h=lire_horloge(0x04); h=lire_horloge(0x04); j=lire_horloge(0x06)>>5; j=lire_horloge(0x06)>>5; mois=lire_horloge(0x06)& 0x1F; mois=lire_horloge(0x06)& 0x1F; date=lire_horloge(0x05)& 0x3F; date=lire_horloge(0x05)& 0x3F; Lcd_Out(1,1, t[j]); Lcd_Out(1,1, t[j]); Lcd_Chr(1,5,(date>>4)+48); Lcd_Chr(1,5,(date>>4)+48); Lcd_Chr(1,6,(date&0x0F)+48); Lcd_Chr(1,6,(date&0x0F)+48); Lcd_Out(1,7, "/"); Lcd_Out(1,7, "/"); Lcd_Chr(1,8,(mois>>4)+48); Lcd_Chr(1,8,(mois>>4)+48); Lcd_Chr(1,9,(mois&0x0F)+48); Lcd_Chr(1,9,(mois&0x0F)+48); Lcd_Chr(1,12,(h>>4)+48); Lcd_Chr(1,12,(h>>4)+48); Lcd_Chr(1,13,(h&0x0F)+48); Lcd_Chr(1,13,(h&0x0F)+48); Lcd_Out(1,14, ":"); Lcd_Out(1,14, ":"); Lcd_Chr(1,15,(m>>4)+48); Lcd_Chr(1,15,(m>>4)+48); Lcd_Chr(1,16,(m&0x0F)+48); Lcd_Chr(1,16,(m&0x0F)+48);}}
- Page 12
- Cette fonction permet de lire le jour,le mois,la date, lheure et les minutes dans lhorloge du circuit pcf8583 et de les afficher dans lafficheur LCD.
- Page 13
- void affiche(unsigned char Val,unsigned char l,unsigned char co) { val= Val%10; val= Val%10; Lcd_Chr(l,co, val+48); Lcd_Chr(l,co, val+48); Val=Val/10; Val=Val/10; val= Val%10; val= Val%10; Lcd_Chr(l,co-1, val+48); Lcd_Chr(l,co-1, val+48); Val=Val/10; Val=Val/10; val= Val%10; val= Val%10; Lcd_Chr(l,co-2, val+48); Lcd_Chr(l,co-2, val+48); Val=Val/10; Val=Val/10; val= Val%10; val= Val%10; Lcd_Chr(l,co-3, val+48); Lcd_Chr(l,co-3, val+48);}
- Page 14
- Cette fonction montre comment calculer les units et les dizaines de la valeur du compteur et les afficher.
- Page 15
- unsigned char compteur() {if(PORTC.F0==0){cpt1++;delay_ms(250);}if(PORTC.F1==0){cpt2++;delay_ms(250);}if(PORTC.F2==0){cpt3++;delay_ms(250);} return cpt1,cpt2,cpt3; }
- Page 16
- Cette fonction incrmente les 3 compteurs chaque fois quune impulsion est reue. et retourne leurs valeurs.
- Page 17
- void afficher_cpt() { if(PORTD.F0==0) if(PORTD.F0==0) { Lcd_Out(2,1, "Compt1 :"); Lcd_Out(2,1, "Compt1 :"); affiche(cpt1,2,12); affiche(cpt1,2,12); } if(PORTD.F1==0) if(PORTD.F1==0) { Lcd_Out(2,1, "Compt2 :"); Lcd_Out(2,1, "Compt2 :"); affiche(cpt2,2,12); affiche(cpt2,2,12); } if(PORTD.F2==0) if(PORTD.F2==0) { Lcd_Out(2,1, "Compt3 :"); Lcd_Out(2,1, "Compt3 :"); affiche(cpt3,2,12); affiche(cpt3,2,12); }}
- Page 18
- Cette fonction affiche le compteur puis sa valeur. exemple: compteur1 : 0009 cest--dire le compteur1 contient la valeur 9. Alors 9 pices sont pass devant le capteur 1
- Page 19
- void interrupt() { if (PIR1.TMR1IF==1) if (PIR1.TMR1IF==1) { TMR1L=0XB0; TMR1L=0XB0; TMR1H=0X3C; TMR1H=0X3C; n++; n++; if(n==20000) if(n==20000) { n=0; n=0; PORTB.F7=!PORTB.F7; PORTB.F7=!PORTB.F7; EEprom_Write(0,date+48); EEprom_Write(0,date+48); EEprom_Write(1,mois+48); EEprom_Write(1,mois+48); EEprom_Write(2,h+48); EEprom_Write(2,h+48); EEprom_Write(3,m+48); EEprom_Write(3,m+48); EEprom_Write(4,cpt1); EEprom_Write(4,cpt1); EEprom_Write(5,cpt2); EEprom_Write(5,cpt2); EEprom_Write(6,cpt3); EEprom_Write(6,cpt3); } PIR1.TMR1IF=0; PIR1.TMR1IF=0; } if(PIR1.RCIF==1) if(PIR1.RCIF==1) { K = RCREG; K = RCREG; PIR1.RCIF=0; PIR1.RCIF=0; }}
- Page 20
- Le TIMER1 est utilis en mode tempo A chaque fois que linterruption est active on incrmente une variable pour atteindre 1sec et on multiplie la valeur pour avoir le temps dsir Aprs 30 min on enregistre les donnes dans la mmoire EEPROM La 2 eme partie cest pour le test des caractres reus par le clavier sur le logiciel Hyper Terminal
- Page 21
- void Serial_Init(void) { SPBRG = 12 ; SPBRG = 12 ; TXSTA = 0b00100000 ; TXSTA = 0b00100000 ; RCSTA = 0b10010000 ; RCSTA = 0b10010000 ;}
- Page 22
- Cette fonction permet linitialisation du module USART du pic ( la communication en srie de type RS232).
- Page 23
- void Serial_Putchar(unsigned char V) { while(TXSTA.TRMT==0); while(TXSTA.TRMT==0); TXREG = V; TXREG = V;}
- Page 24
- Cette fonction permet lmission dun caractre sur lUSART, et de lafficher sur lecran du PC.
- Page 25
- La fonction globale :
- Page 26
- void main() { ecrirehorloge(0x02,0x55); ecrirehorloge(0x05,0xA5); ecrirehorloge(0x02,0x55); ecrirehorloge(0x05,0xA5); ecrirehorloge(0x03,0x59); ecrirehorloge(0x06,0x21); ecrirehorloge(0x03,0x59); ecrirehorloge(0x06,0x21); ecrirehorloge(0x04,0x09); ecrirehorloge(0x04,0x09); ANSEL=0x00; ANSEL=0x00; ANSELH=0x00; ANSELH=0x00; TRISB=0x00; PORTB=0X00; TRISB=0x00; PORTB=0X00; TRISC=0XFF; PORTC=0XFF; TRISC=0XFF; PORTC=0XFF; TRISD=0XFF; PORTD=0XFF; TRISD=0XFF; PORTD=0XFF; Serial_Init(); Serial_Init(); I2C_Init(100000); I2C_Init(100000); INTCON.GIE=1; T1CON.TMR1CS=0; INTCON.GIE=1; T1CON.TMR1CS=0; INTCON.PEIE=1; T1CON.T1CKPS0=1; INTCON.PEIE=1; T1CON.T1CKPS0=1; PIE1.TMR1IF=1; T1CON.T1CKPS1=0; PIE1.TMR1IF=1; T1CON.T1CKPS1=0; TMR1L=0XB0; T1CON.TMR1ON=1; TMR1L=0XB0; T1CON.TMR1ON=1; TMR1H=0X3C; TMR1H=0X3C; Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); Lcd_Cmd(LCD_CURSOR_OFF); Lcd_Cmd(LCD_CURSOR_OFF); Lcd_Cmd(Lcd_Clear); Lcd_Cmd(Lcd_Clear); while(1) { pcf(); pcf(); compteur(); compteur(); afficher_cpt(); afficher_cpt(); if((h==0x18)&&(se==0x00)) if((h==0x18)&&(se==0x00)) { cpt1=0;cpt2=0;cpt3=0; cpt1=0;cpt2=0;cpt3=0; //PORTB.F7=1; //PORTB.F7=1; } if(K=='?') if(K=='?') { for(l=0;l