用K型热电偶和max6675检测温度,显示值与实际值相差非常大,请各位大侠指教

sck 时钟引脚
so 数据输出
cs 片选
uint 无符号整型
read2(void)
{
uint j;
r2=adh2=adl2=0;
///////////////////////数据复位
cs2=1;
sck=1;
so=1;
//////////////////////读无用位
cs2=0;
sck=0;
sck=1;
/////////////////////读高4位数据
for(j=0;j<4;j++)
{
sck=0;
adh2<<=1;
if(so)
adh2=adh2|0x01;
else
adh2=adh2&0xfe;
sck=1;
}
/////////////////////读低8位数据
for(j=0;j<8;j++)
{
sck=0;
adl2<<=1;
if(so)
adl2=adl2|0x01;
else
adl2=adl2&0xfe;
sck=1;
}
/////////////////////读断偶位
sck=0;
flag2=so;
sck=1;
/////////////////////读标识符
sck=0;
sck=1;
sck=0;
sck=1;
/////////////////////
cs2=1;
/////////////////////输出数据
r2=(adh2<<8)|adl2;
r2=r2*0.25; //得到真实十进制温度值,因为MAX6675可以精确到0.25度,所以读回数据的最低位代表的是0.25度。
r2=(r2*1023.75)/4096;//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
return(r2);
}

热电偶的测温是需要冷端温度补偿的,你需要在程序中加进冷端的温度补偿值(这值根据使用环境需要修改,所以应该是人机交互的)。
热电偶的引线长短不是问题,误差可以由补偿值来解决的。
实际使用的产品中,已经解决了。你可以参考一下市场销售的热电偶测温仪表等实际产品的内部程序。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-28
首先你的硬件要设计得很小心,热电偶到芯片的接线要尽可能短,否则会产生很大的误差!这个我有过体会。至于程序,你自己可以从读出的原始数据来判断是否有计算错误。追问

目前用proteus在做仿真,实际问题不用考虑,能给出你认为正确的程序吗

追答

这个是很久以前用实物做的(当时还没有PROTEUS),如果没记错的话,它是SPI接口的,在接收数据时有个前导0,你要注意这个问题,还有,要注意时钟的极性!!!

追问

有程序吗?

追答

当时用的是汇编,不同的单片机程序不同,也找不到了。。。

本回答被提问者和网友采纳
第2个回答  2012-05-23
能不能把你的程序给我发一份,我用上面的程序为什么测得结果显示温度总是0,热电偶检测信号是10mv
相似回答