hi
我发现在温度试验中,根据给的ds18b20芯片资料,其应该是8位传感器,其给出的温度的例子为:
温度 高位 低位
+125 0x00 0xFA
+25 0x00 0x32
+0.5 0x00 0x01
0 0x00 0x00
-0.5 0xFF 0xFF
-25 0xFF 0xCE
-55 0xFF 0x92
根据上表,程序似乎采集温度程序似乎应该这样写:
if (temph > 0) // 负号处理
{
templ = (~templ)+1;
f = 1;
}
tempdf = templ & 0x1; // tempdf > 0 代表0.5度
tempint = templ>>1;
但是这样在实际板子上显示结果不正确。
通过读程序,发现templ的低4位是小数,temph的低4位加上templ的高4位组成温度值的整数部分,因此应该是十二位的温度传感器,不知道我的理解对不对?
如果正确请提供板子上温度传感器的正确资料,谢谢!
另外,程序在22.1184MHz晶振下工作正常,在11.0592MHz下LED数码管不停闪烁,不知道是什么原因?
资料难道有误?待我仔细看看.
我一共了提供了 3个以上的 ds18b20 程序,其中有一个c语言写的精度是0.5度,其他的精度都是0.1摄氏度晶振 都是11.0592 或者是12m 的 .
hi
温度试验的源程序:
void read_ds1820() //读
{
uchar delay,i,j,k,temp,temph,templ;
j=2; //读2位字节数据
do
{
for(i=8;i>0;i--) //一个字节分8位读取
{
temp>>=1; //读取1位右移1位
TMDAT=0; //数据线置低电平
delay=1;
while(--delay); //延时2us
TMDAT=1; //拉高总线
delay=4;
while(--delay); //延时8us
if(TMDAT)temp|=0x80; //读取1位数据
delay=25;
while(--delay); //读取1位数据后延时50us
}
if(j==2)templ=temp; //读取的第一字节存templ
else temph=temp; //读取的第二字节存temph
}while(--j);
f=0; //初始温度标志为正
if((temph&0xf8)!=0x00) //若温度为负的处理,对二进制补码的处理
{
f=1; //为负温度f置1
temph=~temph;
templ=~templ;
k=templ+1; // 下面几行代码应该在判断是否溢出,当templ取反恰好等于255时,加1将溢出,此时templ将为零
templ=k;
//我觉得是否可以根据PSW.Cy来判断溢出,if (CY != 0)作为判断条件
if(k>255) // 当k>255时判断为溢出情况,所以k似乎应该声明为short型
{
temph++;
}
}
tempdf=templ&0x0f; //将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf,这里可以看出,小数部分是低字节的低4位
templ>>=4;
temph<<=4;
tempint=temph|templ; // 温度整数部分是高字节的低4位在加上低字节的高4位
}
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |