1.5k
In this example we connect the ever popular DS18B20 temperature sensor to our PIC, we will then display the temperature on our LCD
We used the DS18S20 in our example this was connected to PORT E pin 2 of our PIC16F877, once again we had a 16×2 LCD connected to PORT B.
Schematic
Code
sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor: // 18S20: 9 (default setting; can be 9,10,11,or 12) // 18B20: 12 unsigned short TEMP_RESOLUTION = 9; unsigned temp; char *text = "000.00"; int i; int colona; void Read_Temperature() { // Perform temperature reading Ow_Reset(&PORTE, 2); // Onewire reset signal Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTE, 2, 0x44); // Issue command CONVERT_T Delay_us(120); Ow_Reset(&PORTE, 2); Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTE, 2, 0xBE); // Issue command READ_SCRATCHPAD temp = Ow_Read(&PORTE, 2); temp = (Ow_Read(&PORTE, 2) << 8) + temp; } void Display_Temperature() { unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole; unsigned int temp2write; unsigned int temp_fraction; temp2write = temp; // Check if temperature is negative if (temp2write & 0x8000) { text[0] = '-'; temp2write = ~temp2write + 1; } // Extract temp_whole temp_whole = temp2write >> RES_SHIFT ; // Convert temp_whole to characters if (temp_whole/100) text[0] = temp_whole/100 + 48; text[1] = (temp_whole/10)%10 + 48; // Extract tens digit text[2] = temp_whole%10 + 48; // Extract ones digit text[3] = '.'; // Extract temp_fraction and convert it to unsigned int temp_fraction = temp2write << (4-RES_SHIFT); temp_fraction &= 0x000F; temp_fraction *= 625; // Convert temp_fraction to characters text[4] = temp_fraction/1000 + 48; // Extract thousands digit // Print temperature on LCD Lcd_Out(1, 1, text); // Print degree character and'C' for Celsius Lcd_Chr_CP(0xDF); // 223 ASCII for degree symbol on my LCD Lcd_Chr_CP('C'); } void main() { CMCON |=7; ADCON1 = 0x0D; TRISE.B2 = 1; // Configure RE2 pin as input Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear LCD Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off // Main loop do { Read_Temperature(); Display_Temperature(); Delay_ms(100); } while (1); }
Links
DS1820 20pcs