Thursday, October 25, 2012

Temperature Sensor (MCP9700 + PIC16F877A)

Here's a temperature sensor (thermometer) circuit that you can easily build. It uses the popular PIC 16F877A microcontroller. The temperature sensor is MCP9700. The MCP9700 outputs an analog voltage corresponding to the temperature. The PIC reads the analog voltage, processes it and displays temperature on the LCD. The temperature range of this circuit is -40'C to +125'C.

The methods of processing the output of the MCP9700 can be found in the datasheet: 

The analog to digital conversion is done by the PIC ADC module. In the code, I've used the mikroC library function for ADC. You can view the library file here:

However, you should have a knowledge of how the ADC module works and how to use it. I had written a tutorial on modalities of operation of the PIC 16F877A ADC. You can find the tutorial here:

For LCD interfacing, I used the mikroC LCD library. You can view the library file here:

Here is the code for the PIC16F877A:

(You can download the source file from:

//Programmer: Syed Tahmid Mahbub
//Compiler: mikroC PRO for PIC v4.60
//Target PIC: PIC16F877A
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;

void main() {
     unsigned long int Temp;
     unsigned int ADRead;
     unsigned int vDisp[3];
     unsigned char Display[7];
     PORTA = 0;
     TRISA = 0X01;
     PORTB = 0;
     TRISB = 0;
     LCD_Out(1, 1, "Temp:");
     //Display = "+125 'C";
     Display[4] = 39; //'
     Display[5]= 'C';
     ADCON1 = 0x0E;
     while (1){
           ADRead = ADC_Get_Sample(0);
           if (ADRead > 102){// 'If temperature is positive
              Temp = (100 * ( (10 * ADRead) - 1024 ) ) >> 11; //'Get temperature
              Display[0] = '+';
           else{ // 'If temperature is negative
              Temp = ( (1024 - (10 * ADRead) ) * 100 ) >> 11; //'Get temperature
              Display[0] = '-';
           vDisp[0] = Temp / 100;
           vDisp[1] = (Temp / 10) % 10;
           vDisp[2] = Temp % 10;
           Display[1] = vDisp[0] + 48;
           Display[2] = vDisp[1] + 48;
           Display[3] = vDisp[2] + 48;
           LCD_Out(1, 8, Display); // 'Show temperature

Reference documents:

MCP9700 datasheet:
PIC16F877A datasheet:
mikroC LCD library:
mikroC ADC library:
Modalities of Using the ADC module of the PIC 16F877A:


  1. This is very good, can you email me the proteus simulation file?

  2. hi dear its blog very nice and helpful thanks from inverter