//----------------------------------------
// P6.0 P6.1
// | |
// | | | |NTC
// | | | |
// |_| |_|
// | ____ |
// |
// |
// P5.5---|
// |
// --- 104
// ---
// |
// |
// |
// _____ GND
// ___
// _
//----------------------------------------
unsigned char test_temperature(void)
{
uchar tamp=0;
Ttmp=0;
RC_num=0;
//1.用基准电阻充电、放电6次,记录6次的充电时间到test_temp[6]中;
do
{
P6CR&=0xfc; //0-output 1-input 设置P6.0, P6.1输出
Rp_TO_OUT; //P5.5-output
Rm=0;
Rc=0;
Rp=0;
for(dly=0xa00;dly;dly--)
{
WDTC();
} //3个管脚都置低,对104电容放电
Rm_t=0;
P6CR|=0x02; //P6.1输入
Rp_TO_IN; //P5.5输入
Rm=1; //用基准电阻充电
while(1)
{
if(Rp)
{
break;
}
Rm_t++;
}
WDTC();
test_temp[RC_num]=Rm_t;
RC_num++;
}
while(RC_num<6); //采样6次
//2.对记录的6个数据去掉min和max,其余的4个值求其平均值
// test_temp 0 1 2 3 4 5
// min max
RC_num=0;
Rmin_p=0;
Rmax_p=5;
Rmin_t=test_temp[0];
Rmax_t=test_temp[5];
do
{
if(test_temp[RC_num+1]<Rmin_t)
{
Rmin_t=test_temp[RC_num+1];
Rmin_p=RC_num+1;
}
if(test_temp[4-RC_num]>Rmax_t)
{
Rmax_t=test_temp[4-RC_num];
Rmax_p=4-RC_num;
}
RC_num++;
}
while(RC_num<5); //找出数组中的最大及最小值
RC_num=0;
Rm_t=0;
do
{
if(RC_num!=Rmin_p)
{
if(RC_num!=Rmax_p)
{
Rm_t+=test_temp[RC_num];
}
}
RC_num++;
}
while(RC_num<6); //去max,min,取平均值
Rm_t>>=2; //除于4 求平均值
//3.用热敏电阻充电、放电6次,记录6次的充电时间到test_temp[6]中;
RC_num=0;
do
{
P6CR&=0xfc;
Rp_TO_OUT;
Rm=0;
Rc=0;
Rp=0;
for(dly=0xa00;dly;dly--)
{
WDTC();
}
Rc_t=0;
P6CR|=0x01; //用NTC充电
Rp_TO_IN;
Rc=1;
while(1)
{
if(Rp)
{
break;
}
Rc_t++;
}
WDTC();
test_temp[RC_num]=Rc_t;
RC_num++;
}
while(RC_num<6);
//4.对记录的6个数据去掉min和max,其余的4个值求其平均值
RC_num=0;
Rmin_p=0;
Rmax_p=5;
Rmin_t=test_temp[0];
Rmax_t=test_temp[5];
do
{
if(test_temp[RC_num+1]<Rmin_t)
{
Rmin_t=test_temp[RC_num+1];
Rmin_p=RC_num+1;
}
if(test_temp[4-RC_num]>Rmax_t)
{
Rmax_t=test_temp[4-RC_num];
Rmax_p=4-RC_num;
}
RC_num++;
}while(RC_num<5);
RC_num=0;
Rc_t=0; //基准电阻算出的平均值放在Rm_t中
do
{
if(RC_num!=Rmin_p)
{
if(RC_num!=Rmax_p)
{
Rc_t+=test_temp[RC_num];
}
}
RC_num++;
}
while(RC_num<6);//去max,min,取平均值
Rc_t>>=2;
//5.根据公式计算温度值
//Vc = V0(1-e^(-T/RC)) ---> Trtc/Rrtc = Tm/Rm ---> Trtc = (Rrtc*Tm)/Rm
Ttmp=(unsigned long)Rc_t*9950;
Ttmp=Ttmp/Rm_t;//求ntc值
if(Ttmp>=32960)
{
return 0;
}
if(Ttmp<=3588)
{
return 0x50;
}
//6.查表微调的方法?
RC_num=0;
Rm_t=Ttmp;
do
{
if(Rm_t>=temp_table[RC_num+1]) //查表微调
{
/*Rm_t-=temp_table[RC_num+1];
Rc_t=temp_table[RC_num]-temp_table[RC_num+1];
Rm_t*=10;
Rm_t=Rm_t/Rc_t;
// RC_num++;*/
break;
}
RC_num++;
}
while(RC_num<48);
tamp=Bin1toBcd(RC_num);
//Rc_t<<=4;
//Rm_t|=Rc_t;
P6CR&=0xfC;
PORT6&=0xfC;
return tamp;
}
code unsigned short temp_table[49]=
{
32960,30004,28526,27048,25570, 24456,23342,22228,21114,
20000,19152,18304,17456,16608, 15760,15110,14460,13810,
13160,12510,12008,11506,11004, 10502,10000,9610,9220,
8830,8050,7742,7436,7130,6824,6517,6278,6039,5800,5561,
5322,5129,4936,4743,4550,4357,4203,4050,3897,3744,3588
};
大哥,有没有原理图啊,我的邮箱:peture@163.com,麻烦发我一份,多谢。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |