用pt10和ad7715实现温度的高精度测量,温度范围可以-200-700℃。精度0.1℃,数据 稳定。
原理图
部分程序见下。
void paixu(unsigned int a[],unsigned char n) /*无返回值,数组a[]排序,从小到大排列,n为数组长度*/
{
unsigned char i,j;
unsigned int t;
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}
}
unsigned int junzhi(unsigned int data a[],unsigned char k) //数组a[]求极值平均,k为去掉的极值个数,返回平均值aver
{
unsigned char i,j;
unsigned long sum=0;
i=k/2;
for(j=i;j<k-i;j++) sum=sum+a[j];
return sum/(k-2*i);
}
unsigned int shujuzhengli(void)
{ unsigned int shuju[10],av;
unsigned char i;
for(i=0;i<8;i++)
{
shuju[i]=read7715();
}
paixu(shuju,8);
av=junzhi(shuju,2);
return av;
}
void wendu()
{
unsigned int data_7715;
float t;
inint_ad7715();
// data_7715=shujuzhengli();
data_7715=read7715();
xianshi_shuzi(0x20,data_7715);
t=(float)(data_7715/3.7);
xianshi_shuzi(0x24,t) ;
v_LcdWriteNumber_f(0x36,2,t);
v_LcdWriteChar_f(0x37,"℃");
}
void delay_10ns(unsigned char i)
{ unsigned char j;
while(i--)
for(j=0;j<10; j++);
}
void delay_1ms(unsigned char i)
{ unsigned char j;
while(i--)
for(j=0;j<125; j++);
}
delay_1s(unsigned char p)
{ while(p--)
delay_1ms(100);
}
unsigned int read_ad7715()
{
unsigned char i;
unsigned int da;
data_ad7715=1;
clk_ad7715=0;
for(i=0;i<16;i++)
{ clk_ad7715=0;
da<<=1;
if(data_ad7715)
da|=0x01;
clk_ad7715=1;
}
return da;
}
void write_ad7715(unsigned char a)
{ unsigned char i;
delay_10ns(3);
for(i=0;i<8;i++)
{ clk_ad7715=0;
data_ad7715=(a<<i)&0x80;
clk_ad7715=1;
}
}
void init()
{
unsigned char i;
data_ad7715=1;
for(i=0;i<60;i++)
{ clk_ad7715=0;
clk_ad7715=1;
}
}
inint_ad7715()
{
init();
write_ad7715(0x12);
write_ad7715(0x40);
}
unsigned int read7715()
{ unsigned int data_ad7715;
delay_1s(1);
write_ad7715(0x3a); data_ad7715=read_ad7715();
return data_ad7715;
}
部分内容因商用性质被隐藏。