Mesure de la température est l'une des tâches les plus courantes effectuées par le microcontrôleur. Un capteur DS1822 est utilisé pour la mesure. Il est capable de mesurer la température dans la plage de -55 ° C à +125 ° C avec la précision 0,5 ° C. Pour le but de transférer des données vers le microcontrôleur .
Programmation en mikroC
[lock]/* *************************************************************************** Mesure de la température à l'aide du capteur DS1822 *************************************************************************** */ // Configuration des connections d'afficheur LCD avec PIC sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB0_bit; sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; // Fin de configuration /* Configurer TEMP_RESOLUTION à la résolution correspondante du capteur utilisé DS1822: 12 (réglage par défaut peut être : 9,10,11 ou 12)*/ const unsigned short TEMP_RESOLUTION = 12; char *text = "000.0000"; unsigned temp ; void Display_Temperature(unsigned int temp2write ) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole; unsigned int temp_fraction; Lcd_Chr(2,4,'+'); if (temp2write & 0x8000) /* Vérification si la température est négative?*/ { Lcd_Chr(2,4,'-'); // Correction de signe si oui temp2write = ~temp2write + 1; // Complémenter à deux } // Extraire de la partie entière (temp_whole) de température temp_whole = temp2write >> RES_SHIFT; text[0] = '0'; // Conversion temp_whole en caractères if (temp_whole/100) text[0] = temp_whole/100 + 48; // Extrait d'un chiffre des centaines else text[0] = '0'; text[1] = (temp_whole/10)%10 + 48; // Extrait d'un chiffre des dizaines text[2] = temp_whole%10 + 48; // Extrait d'un chiffre des unités /* Extraire de la partie fractionnaire (temp_fraction) de tempe'ratureand et convertion en unsigned int*/ temp_fraction = temp2write << (4-RES_SHIFT); temp_fraction &= 0x0F; temp_fraction *= 625; // Conversion temp_fraction en caractères text[4] = temp_fraction/1000 + 48; /* Extrait d'un chiffre des milliers*/ text[5] = (temp_fraction/100)%10 + 48; /* Extrait d'un chiffre des centaines*/ text[6] = (temp_fraction/10)%10 + 48; /* Extrait d'un chiffre des dizaines*/ text[7] = temp_fraction%10 + 48; /* Extrait d'un chiffre des unités*/ // Affichage de la température sur l'écran LCD Lcd_Out(2,5, text); } void main() { ANSEL = 0; // Configurer E/S en numérique ANSELH = 0; Lcd_Init(); // Initialiser LCD Lcd_Cmd(_LCD_CLEAR); // Effacer l'affichage sur LCD Lcd_Cmd(_LCD_CURSOR_OFF); // Mettre invisible le curseur Lcd_Out(1, 1, " Temperature: "); // Afficher le caractère, 'C' pour degrés Celsius Lcd_Chr(2,13,223); /*si vous voyez la lettre grecque alpha essayez de taper 178 au lieu de 223*/ Lcd_Chr(2,14,'C'); //--- boucle principale-------- do { //--- effectuer la lecture de température----- Ow_Reset(&PORTA, 5); /* Signal de remise a` zéro sur le bus OneWire */ Ow_Write(&PORTA, 5, 0xCC); // Envoi de commandes SKIP_ROM Ow_Write(&PORTA, 5, 0x44); // Envoi de commandes CONVERT_T Delay_us(120); Ow_Reset(&PORTA, 5); Ow_Write(&PORTA, 5, 0xCC); // Envoi de commandes SKIP_ROM Ow_Write(&PORTA, 5, 0xBE); // Envoi de commandes READ_SCRATCHPAD Delay_ms(400); temp = Ow_Read(&PORTA, 5); temp = (Ow_Read(&PORTA, 5) << 8)+ temp; //--- Affichage de la température sur l’écran Lcd ---- Display_Temperature(temp); Delay_ms(500); } while (1); }[/lock]
Enregistrer un commentaire