找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6534|回复: 2
打印 上一主题 下一主题
收起左侧

关于温度传感器试验ds18b20芯片资料不正确

[复制链接]
跳转到指定楼层
楼主
ID:24072 发表于 2010-5-27 23:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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数码管不停闪烁,不知道是什么原因?

[此贴子已经被作者于2010-5-27 23:31:03编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2010-5-27 23:36 | 只看该作者

   资料难道有误?待我仔细看看.

 

   我一共了提供了 3个以上的 ds18b20 程序,其中有一个c语言写的精度是0.5度,其他的精度都是0.1摄氏度晶振 都是11.0592 或者是12m 的 .

[此贴子已经被作者于2010-5-27 23:39:51编辑过]
回复

使用道具 举报

板凳
ID:24072 发表于 2010-5-28 08:40 | 只看该作者

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位
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表