Temperature Sensors MCP9700/9700A/9701/9701A


The MCP9700, MCP9700A, MCP9701 and MCP9701A Temperature Sensors from Microchip offer exceptional performance for the price of the ICs. Each have different temperature ratings and accuracy parameters. Here's a list of features:

  • Tiny Analog Temperature Sensor
  • Available Packages: SC70-5, SOT-23-5, TO-92-3
  • Wide Temperature Measurement Range:
    • -40°C to +125°C (Extended Temperature)
    • -40°C to +150°C (High Temperature) (MCP9700/9700A)
  • Accuracy:
    • ±2°C (max.), 0°C to +70°C (MCP9700A/9701A)
    • ±4°C (max.), 0°C to +70°C (MCP9700/9701)
  • Optimized for Analog-to-Digital Converters (ADCs):
    • 10.0 mV/°C (typical) MCP9700/9700A
    • 19.5 mV/°C (typical) MCP9701/9701A

The datasheet can be found here: MCP9700/9700A/9701/9701A Datasheet.


Device Packages + Interfacing


As shown on the right, the MCP97xxx sensors are available in different packaging and are very simple to interface with.

Vdd, GND and Vout are all that are required.

You should check the datasheet to get a better idea of the paramaters for the device you decide to use, though keep in mind that the user module listed below will automatically calculate the temperature depending on the device in use.


Example Code

A recent discussion with Burt on the forums lead to some code snippets that would make interfacing with the MCP97xxx devices very easy. The user module is listed at the end of this article, and here's an example of using the module:

(this example will sample the temperature sensor and display the result in Word and Integer format every 500mS)

Swordfish MCP9701A Code Example
Device = 18F2520
Clock =  32
Config MCLRE = OFF
Include "InternalOscillator.bas"                // configures the internal oscillator
Include "Utils.bas"                             // used for the 'Digit' function
Include "ADC.bas"                               // ADC routines
Include "Convert.bas"                           // convert numbers to strings
Include "USART.bas"                             // for UART support
Include "MCP97.bas"                             // MCP97xxx sensor routines
// display the temperature via USART
Sub DisplayTemperature()    
    USART.Write("_____________________",13,10) // separate each output with a line
    // this code demonstrates the use of various public variables that are 
    // pre-calculated by MCP97.ReadTemperature
    USART.Write("Word Output: ")
    If Temperature.Positive Then
    USART.Write(DecToStr((Temperature.WordVal/10),3))  // write the first two digits of the temperature    
    USART.Write(".",DecToStr(Digit(Temperature.WordVal,1)), " C",13,10)  // display the "." and decimal place, followed by " C"
    // this code demonstrates use of the public integer variable pre-calculated
    // by MCP97.ReadTemperature 
    // note - can't use 'Digit' as it does not support Integer type variables
    USART.Write("Integer Output:  ")
    USART.Write(DecToStr((Temperature.IntVal),4),13,10)  // write the whole integer value
End Sub
USART.SetBaudrate(br57600)                      // initialise UART for 57600 baud
ADCON1 = $E                                     // configure AN0 as an input
// main program loop...
While True
    MCP97.ReadTemperature(0)                    // sample the sensor on CH0 and calculate the results
    DisplayTemperature()                        // display the temperature
    DelayMS(500)                                // delay 500mS between samples


Points of Note

  • The pin connected from the PIC to Vout should be configured as analogue before calling the user module. I have done this in the above example with the statement "ADCON1 = $E".
  • Once "MCP97.ReadTemperature(pChannel)" has been called, the temperature results are stored in a public structure with multiple variable types. This makes it easy to quickly use the type of variable for different scenarios (for example, "Utils.Digit" can only parse byte, word and longword type variables - not integers.
    • Temperature.WordVal - stores the temperature result as a word type variable with a scale of 10 (-12.1 = 121, +25 = 250)
    • Temperature.Positive - if the WordVal is postive, then this flag is set true. Otherwise it is set false. (-12.1 = false, +25 = true)
    • Temperature.IntVal - stores the temperature result as an integer type variable with a scale of 10 (-12.1 = -121, +25 = 250)
  • You can use different devices by including the option definition like so: #option MCP97_Device = MCP9701A
    Valid options are MCP9700, MCP9700A, MCP9701, MCP9701A.


The Module

Save the following code to the Swordfish "UserLibrary" folder, and call it "MCP97.bas"

User Module MCP9700/9700A/9701/9701A
MCP9700/9700A/9701/9701A Temperature Sensor Module
Version 1.0 By Graham Mitchell
For usage and updates, please visit
Important Notes
 * Ensure the ADC Port.Pin is configured as analogue before calling ReadTemperature
Module MCP97
#option MCP97_Device = MCP9701A
#if Not(MCP97_Device in (MCP9700, MCP9700A, MCP9701, MCP9701A))
    #error MCP97_Device, "Unknown device. Please define either MCP9700, MCP9700A, MCP9701, MCP9701A"
Structure TTemperature
    IntVal As Integer
    WordVal As Word
    Positive As Boolean
End Structure
// public structure to store different variable types of temperature results
Public Dim Temperature As TTemperature
Include "ADC.bas"
// convert the temperature result into various types for simple use in main
Sub LoadStructure(ByVal pResult As Integer)
    Temperature.IntVal = pResult                    // store integer type result
    If pResult < 0 Then                             // check if less than zero (negative)
        Temperature.Positive = False                // yes, clear positive flag
        Temperature.WordVal = 65536 - Word(pResult) // and load word type variable
    Else                                            //
        Temperature.Positive = True                 // no, set positive flag   
        Temperature.WordVal = Word(pResult)         //and load word type variable
End Sub
// read the ADC port + and convert to degrees C (scaled integer math)
// if temperature = 25.3 then it will calculate 253
// if temperature = -13.4 then it will calculate -134
Public Sub ReadTemperature(ByVal pChannel As Byte)
    Dim tmpInt As Integer
    Dim tmpLongInt As LongInt
    tmpInt = (ADC.Read(pChannel))                   // make a 10-bit sample of the ADC.0
    #if MCP97_Device in (MCP9701, MCP9701A)         // check which device is in use
        tmpInt = tmpInt - 82                        // calculate difference from zero offset
        tmpInt = tmpInt - 102                       // calculate difference from zero offset
    tmpLongInt = tmpInt * 1000                      // scale up by 1,000
    #if MCP97_Device in (MCP9701, MCP9701A)         // check which device is in use
        tmpInt = tmpLongInt / 400                   // convert +/- degrees C       
        tmpInt = tmpLongInt / 205                   // convert +/- degrees C           
End Sub

Forum Activity

Member Access