The LM35 output has linear +10mV/°C scale factor means the following:
If the output voltage = 10mV ---> temperature = 1°C
If the output voltage = 100mV ---> temperature = 10°C
If the output voltage = 200mV ---> temperature = 20°C
If the output voltage = 370mV ---> temperature = 37°C
and so on.
This article shows the interfacing of the LM35 temperature sensor with PIC16F887 microcontroller.
The PIC16F887 microcontroller has one 10-bit ADC module with up to 14 channels. In this example one channel for the LM35 output is needed.
Hardware Required:
- PIC16F887 microcontroller
- LM35 temperature sensor -- datasheet
- 16x2 LCD screen
- 10K ohm variable resistor
- Breadboard
- 5V voltage source
- Jumper wires
In this project the PIC16F887 microcontroller uses its internal oscillator which is set in the C code and MCLR pin function is disabled.
Interfacing PIC16F887 with LM35 temperature sensor CCS C code:
Reading voltage quantity using the ADC gives us a number between 0 and 1023 (10-bit resolution), 0V is represented by 0 and 5V is represented by 1023. Converting back the ADC digital value is easy and we can use the following equation for that conversion:
Voltage (in Volts) = ADC reading * 5 / 1023
Multiplying the previous result by 100 (LM35 scale factor is 10mV/°C = 0.01V/°C) will gives the actual temperature:
Temperature(°C) = ADC reading * 0.489
where 0.489 = 500 / 1023
/* Interfacing PIC16F887 with LM35 analog temperature sensor CCS C code The LM35 sensor has linear +10mV/°C scale factor Internal oscillator used @ 8MHz http://ccspicc.blogspot.com/ electronnote@gmail.com */ //LCD module connections #define LCD_RS_PIN PIN_D0 #define LCD_RW_PIN PIN_D1 #define LCD_ENABLE_PIN PIN_D2 #define LCD_DATA4 PIN_D3 #define LCD_DATA5 PIN_D4 #define LCD_DATA6 PIN_D5 #define LCD_DATA7 PIN_D6 //End LCD module connections #include <16F887.h> #fuses NOMCLR NOBROWNOUT NOLVP INTRC_IO #device ADC = 10 #use delay(clock = 8MHz) #include <lcd.c> char temperature[] = " 00.0 C"; unsigned int16 temp; void main(){ setup_oscillator(OSC_8MHZ); // Set the internal oscillator to 8MHz setup_adc(ADC_CLOCK_INTERNAL); // ADC Module uses its internal oscillator setup_adc_ports(sAN0); // Configure AN0 pin as analog set_adc_channel(0); // Select channel 0 (AN0) lcd_init(); // Initialize LCD module lcd_putc('\f'); // Clear LCD lcd_gotoxy(3, 1); // Go to column 3 row 1 printf(lcd_putc, "Temperature:"); while(TRUE){ delay_ms(1000); temp = read_adc() * 0.489; // Read analog voltage and convert it to degree Celsius (0.489 = 500/1023) if (temp > 99) temperature[0] = 1 + 48; // Put 1 (of hundred) else temperature[0] = ' '; // Put space temperature[1] = (temp / 10) % 10 + 48; temperature[2] = temp % 10 + 48; temperature[5] = 223; // Degree symbol lcd_gotoxy(5, 2); // Go to column 5 row 2 printf(lcd_putc, temperature); // Display LM35 temperature result } }The following small video shows simulation of PIC16F887 with LM35 sensor using Proteus:
Proteus simulation file can be downloaded from the following URL:
Download