This is a circuit of a microcontroller AT89S52 Thermometer and 12-bit ADC LTC1298, programs written in the language c program with digital filtering and interface the LED display. The reading provides 0.1C sensitivity.
The
hardware block and circuit diagram is shown in Fig below. The sensor is
epoxy molded thermistor. The circuit for signal conditioning is a
simple voltage divider. The ADC is 12-bit SPI interface LTC1298
analog-to-digital converter. The microcontroller is Atmel 89S52. The
display has four digits 0.5 inches 7-segment LED. The segment driver provides 32-bit CMOS output.
Download Skema :
Based Microcontroller AT89S52 Thermometer
Password : asinan
Thermometer Block Diagram
The
ADC is 12-bit (LTC1298 or MC3202) are two channels, CH0 and CH1. The
input signal from thermistor for ADC channel 0 is simple voltage
divider. Channel1 is available for other sensor. The sample shown in
schematic is HIH-3160 Honeywell Relative Humidity Sensor. The ADC chip
is interfaced with MCU, 89S52 with P1.1, P1.2 and P1.3. The display has
4-digit LED. The 4094 CMOS shift register drives the LED directly.
Software
The main function is time triggered by 10ms timer0 running. The ADC is updated on LED every 10 ticks.
while(1)
{
while(!cputick)
continue;
cputick=0;
print_ADC();
}
The function that reads 12-bit data from ADC is read_ADC(char n). The function has two loops. First loop is to send 4-bit command. And the second loop is 12-bit to shift the data from ADC.
sbit Data = P1^1;
sbit CLK = P1^2;
sbit CS = P1^3;
int read_ADC(char n)
{ int k;
char i,channel;
k=0;
CS=0;
if(n==0) channel=0x0d;
else channel=0x0f;
for(i=0;i<4;i++) clk =" 0;" data =" 1;" data =" 0;" clk =" 1;" data =" 1;" clk =" 0;" i="0;i<12;i++)" clk="1;" clk="0;" cs =" 1;">
To
provide smooth reading, I added the 5-point moving average to the raw
data. The function low_pass_filte1( ) is used to filter the high
frequency noise. The reading is calibrated to degree Celsius with Platinum 100 standard thermometer. We found the equation y=0.0323x-15.122.
int low_pass_filter1(void)
{
x5=x4;
x4=x3;
x3=x2;
x2=x1;
x1=read_ADC(0);
return(x1+x2+x3+x4+x5)/5;
}
float read_temp1_filter(void)
{
return(0.0323*low_pass_filter1()-15.122);
}