Measuring Temperature using LM74 temperature sensor by Texas Instruments and Pic18f452 Microcontroller

In this post i am going to interface LM74 temperature sensor with Pic18f452 microcontroller. LM74 is a temperature sensor by Texas Instruments. It comes with an SPI (Serial Peripheral Interface) interface. You can operate it in SPI (Serial Peripheral Interface) mode. A processor/microcontroller can read temperature reading from LM74 at any time. LM74 provides resolution of up to 0.0625 degree Centigrade. It can operate between -55 degree to +150 degree centigrade. It works only as slave in a system. When interfaced with processor / microcontroller in SPI mode it can only be a slave to a host.

I assume that you are already familiar with the SPI interface. If not then first took some tutorials on SPI (Serial Peripheral Interface) interface before going through this project.

Measuring Temperature using LM74 temperature sensor by Texas Instruments and Pic18f452 Microcontroller

LM74 Temperature Sensor Pin Out

The only important pins are SI/O (Slave Input/Output) and SC (Slave Clock). CS is Chip select and its active low,  the sensor will not work if you don’t make CS Low(0). So make sure to make CS low before using the sensor.

LM74 Temperature Sensor Pin Out

SI/O is Slave input/output. All the commands, control signals and data, travels in and out of the sensor from this pin.Data is clocked out from the sensor on the falling edge of the serial clock (SC), while data is clocked in on the rising edge of SC. A complete transmit/receive communication will consist of 32 serial clocks. The first 16 clocks comprise the transmit phase of communication, while the second 16 clocks are the receive phase. SC is Slave clock. In SPI mode clock is essential to carry out the task. 

LM74 Temperature Sensor Registers

LM74 temperature sensor has three registers. All three registers are 16-bit wide.

LM74 Temperature Sensor Configuration Register

Configuration register sets the LM74 in shutdown or continuous conversion mode. Continuous conversion means continuously convert the temperature. Its a 16-bit wide register. To enable shutdown mode or continuous conversion mode see the data bits configuration in the pic from datasheet below.
LM74 Temperature Sensor Configuration Register

LM74 Temperature Register

LM74 measures temperature and places the equivalent digital value in the Temperature register. Now host can read  the temperature from temperature register. Its a 16-bit wide register. First 2 bits are void. Third bit is always high. Bits from 4 to 16 (DB3 to DB15) are data bits. Temperature digital values are stored in these DB3 to DB15 bits. 

Note: On first power up LM74 will output arbitrary data don’t worry its for the first time power up. Then its start working perfectly.

LM74 Temperature Register

LM74 Manufacturer’s Device ID Register

This register works only when LM74 is in shutdown mode. It outputs manufacture device ID. You don’t need to care about this register.
LM74 Manufacturer’s Device ID Register
LM74 temperature sensor Manufacturer’s Device ID Register

SPI communication with Pic8f452 Microcontroller

Four pins of Pic18f452 are dadicated for SPI communication. It is assumed that you are already familiar with the  SPI communication protocol and their is no need to explain these pins and their functions.
  • Serial Data Out (SDO) – RC5/SDO
  • Serial Data In (SDI) – RC4/SDI
  • Serial Clock (SCK) – RC3/SCK
  • Slave Select (SS) – RA5/SS

Three registers are associated with SPI communication. To carry out successful SPI communication we have to configure them correctly.

SSPSTAT SPI status register

Individual bits of register with their fuctions are below. I uploaded SSPSTAT=0x00 which means SPI in Master Mode, Data transmitted on falling clock.
SSPSTAT SPI status register

SSPCON1 SPI Control Register

Individual bits of register with their functions are below. I uploaded SSPCON1=0x20 which means Serial port not enabled and Clock=Fosc/4.
SSPCON1 SPI Control Register

SSPBUF (Serial Receive and Transmit Register)

This register is not directly accessible. The data which goes out and comes in is dropped in this register and user can pick data from this register.

Project Circuit Diagram

Project Circuit Diagram

LM74 temperature sensor by Texas instruments interfacing with Pic18f452 Microcontroller

Project Code

Project code is written in c language and is compiled in MP-Lab using high tech C compiler. Simulation is made in proteaus 8.0.
  #include <p18f452.h>
  #include <stdio.h>
  #define _XTAL_FREQ 4000000 //Frequency of Oscillator 4MHz
  #define RD5 LATDbits.LATD5 //Define as PORT D Pin 6
  #define RD5Tris TRISDbits.TRISD5 //Define as TRISD Pin 6
  #define RD6 LATDbits.LATD6 //Define as PORT D Pin 6
  #define RD6Tris TRISDbits.TRISD6 //Define as TRISD Pin 6
  #define RD7 LATDbits.LATD7 //Define as PORT D Pin 7
  #define RD7Tris TRISDbits.TRISD7 //Define as TRISD Pin 7
  #define SS LATAbits.LATA5 //Define as PORT A Pin 4 as SS Slave Select
  #define SSTris TRISAbits.TRISA5 //Define as TRISA Pin 4
  #define SDO LATCbits.LATC5 //Define as PORT C Pin 5 as Slave data out
  #define SDOTris TRISCbits.TRISC5 //Define as TRISC Pin 5
  #define SDI LATCbits.LATC4 //Define as PORT C Pin 4 as Slave data in
  #define SDITris TRISCbits.TRISC4 //Define as TRISC Pin 4
  #define SCK LATCbits.LATC3 //Define as PORT C Pin 3 as CLock
  #define SCKTris TRISCbits.TRISC3 //Define as TRISA Pin 3
  void delay(unsigned int time) //Time delay function
  unsigned int i,j;
  for(i=0;i< time;i++)
  for(j=0;j< 5;j++);
  //Function for sending values to the command register of LCD
  void lcdcmd(unsigned char value)
  RD6= 0; //register select-rs
  RD5 = 0; //read-write-rd
  RD7 = 1; //enable-e
  RD7=0; //enable-e
  //Function for sending values to the data register of LCD
  void display(unsigned char value)
  RD6= 1; //register select-rs
  RD5= 0; //read-write-rd
  RD7= 1; //enable-e
  RD7=0; //enable-e
  //function to initialize the registers and pins of LCD
  //always use with every lcd of hitachi
  void lcdint(void)
  lcdcmd(0x38); //5×7 Font text will be displayed on lcd
  lcdcmd(0x0C); //Display on Cursor off
  lcdcmd(0x01); //Clear LCD (DDRAM)
  lcdcmd(0x06); //Entry Mode
  lcdcmd(0x80); //Put Cursor at first line first character space
  void main(){
  int i=0,j=0,k=0,count=0;
  float temp=0;
  char a,b,c;
  char t[]=Temp = ;
  unsigned int cc=0;
  TRISB=0x00; //Port B is used as output port
  RD5Tris=0; //Port-D bit 5 as output
  RD6Tris=0; //Port-D bit 6 as output
  RD7Tris=0; //Port-D bit 7 as output
  SSTris=0; //Slave select as output
  SDOTris=0; //SDO not used, Make it input
  SDITris=1; //SDI as input
  SCKTris=0; //Clock as Output
  lcdint(); //Initialize lcd
  SSPSTAT=0x00; //SPI in Master Mode, Data transmitted on falling clock
  SSPCON1=0x20; //Serial port not enabled, Clock=Fosc/4
  SS=1; //LM74 inactive
  SSPCON1bits.SSPEN = 1; // Enable the SPI
  SS=0; //LM74 Active
  SSPBUF=0x00; //Write Dummy data to Slave
  while(SSPSTATbits.BF!=0); //Poll Flag
  while(!SSPSTATbits.BF); //Poll Flag
  i=SSPBUF; //Save data sent from Slave
  SSPSTATbits.BF=0; //Reset Flag
  SSPBUF=0x00; //Write Dummy Data to Slave
  while(SSPSTATbits.BF!=0);//Poll Flag
  while(!SSPSTATbits.BF); //Poll Flag
  j=SSPBUF; //Save data sent from slave
  SS=1; //LM74 Deactivated
  cc=(unsigned int)temp;
  display( );
Download the Project files, folder includes the project code(Hex, C++) and simulation in Proteaus 8.0. If you have any questions regarding the post please leave your queries below in the comments section.

About The Author

Muhammad Bilal

I am highly skilled and motivated individual with a Master's degree in Computer Science. I have extensive experience in technical writing and a deep understanding of SEO practices.