TC72 SPI Thermometer
TC72 is a SPI slave device reading and converting analog temperature to digital formats. The temperature reading ranges from -55 to +125 degree Celsius. With these temperature values, it also has a fraction temperature value. The fraction is 0.25 degree Celsius per step. Fraction reading has only 3 points, 0.25, 0.50 and 0.75 degree Celsius.I don't cover its technical detail here. In the previous post, I put some detail of this device with programming interface to PIC16F818.
In this example, I use ATMega32 functioning as a master SPI reading temperature from TC72 and displays the temperature.
![]() |
a sample of this program The temperature reading is -32.00 degree Celsius. |
Programming For TC72
- Set up the SPI to master mode
- Select SPI clock and data sampling mode
- Set up digital output for display
- Send the command to TC72
- Read temperature from TC72
- Display the result
/* | |
* spi_tc72_ssd.c | |
* | |
* Created: 7/25/2020 4:13:58 PM | |
* Author : aki-technical | |
*/ | |
#include <avr/io.h> | |
#define F_CPU 4000000UL | |
#include <util/delay.h> | |
void masterInit(void){ | |
/*Set MOSI, SCK and SS Output*/ | |
DDRB=(1<<7)|(1<<5)|(1<<4); | |
/*Enable SPI Master set clock rate fck/128 data is | |
sample at falling edge*/ | |
SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)|(1<<CPHA); | |
//SPSR|=(1<<0); | |
} | |
void masterTransmit(char spiData){ | |
//PORTB&=~(1<<5); | |
/*Start the transmission*/ | |
SPDR=spiData; | |
/*Wait for completion*/ | |
while(!(SPSR&(1<<SPIF))); | |
//PORTB&=~(1<<5); | |
} | |
char masterReceive(void){ | |
/*Wait for the SPI buffer's full*/ | |
while(!(SPSR&(1<<SPIF))); | |
/*return SPI Buffer*/ | |
return SPDR; | |
} | |
void tc72Init(void){ | |
PORTB|=(1<<4); | |
/*Select Control Register*/ | |
masterTransmit(0x80); | |
/*Select Continuous temperature Conversion*/ | |
masterTransmit(0x04); | |
PORTB&=~(1<<4); | |
_delay_ms(150); | |
} | |
void displayTemperature(char msb,char lsb){ | |
char ssd[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D, | |
0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; | |
char sign; | |
lsb>>=6; | |
if(msb&0x80) { | |
msb=(~msb)+1; | |
sign=1; | |
if(lsb!=0) lsb=75/lsb; | |
} | |
else { | |
sign=0; | |
lsb*=25; | |
} | |
PORTD=0x00; | |
if(sign==1) PORTC=0x40; | |
else if(msb>=100) PORTC=ssd[msb/100]; | |
else PORTC=0x00; | |
PORTD=(1<<0); | |
_delay_ms(5); | |
PORTD=0x00; | |
if(msb>=10) | |
PORTC=ssd[(msb%100)/10]; | |
else PORTC=0; | |
PORTD=(1<<1); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=ssd[msb%10]|0x80; | |
PORTD=(1<<2); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=ssd[lsb/10]; | |
PORTD=(1<<3); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=ssd[lsb%10]; | |
PORTD=(1<<4); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=0x63; | |
PORTD=(1<<5); | |
_delay_ms(5); | |
PORTD=0x00; | |
PORTC=ssd[12]; | |
PORTD=(1<<6); | |
_delay_ms(5); | |
} | |
int main(void) | |
{ | |
char msb,lsb; | |
DDRC=0xFF; | |
DDRD=0xFF; | |
DDRA=0xFF; | |
masterInit(); | |
tc72Init(); | |
_delay_ms(150); | |
while (1) | |
{ | |
PORTB|=(1<<4); | |
/*Read the MSB*/ | |
masterTransmit(0x02); | |
/*Issue one more clock frame | |
to force data out*/ | |
masterTransmit(0x00); | |
PORTB&=~(1<<4); | |
_delay_ms(1); | |
msb=masterReceive(); | |
PORTB|=(1<<4); | |
/*Read The LSB*/ | |
masterTransmit(0x01); | |
/*Issue one more clock frame | |
to force data out*/ | |
masterTransmit(0x00); | |
PORTB&=~(1<<4); | |
_delay_ms(1); | |
lsb=masterReceive(); | |
PORTA=lsb; | |
displayTemperature(msb,lsb); | |
} | |
} |
![]() |
Schematic Diagram of this example |