求高手关于DS18B20的

2019-07-16 05:35发布

为什么测量的温度比实际高呢???求解释啊搞个十几度感觉
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
w717342899
2019-07-16 11:52
578145930 发表于 2012-6-3 14:34
贴你的程序上来看看

#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^1;          //数据总线接口定义
uchar i,TCL,TCH;
uint temp1,temperature;
/*****延时函数*********/
void delay_ds18b20(uchar z)
{
    uchar i,j;
for(i=z;i--;i>0)
for(j=10;j>0;j--);
}
/*****初始化DS18B20*****/   
bit init_18b20()
{
     bit ack;
     DQ=1; delay_ds18b20(1);   //释放总线延时10us
  DQ=0; delay_ds18b20(50);  //拉低总线延时500us
  DQ=1; delay_ds18b20(1);   //释放总线稍作延时等待响应
   
  ack=DQ;     
  delay_ds18b20(50);     //延时500us
  return ack;
}
/*****读一个字节*****/
uchar read_18b20()
{
     uchar date=0;
     for(i=0;i<8;i++)
  {
     DQ=0;   //拉低总线
  date>>=1;  //左移数据给总线
  DQ=1;   //释放总线
  if(DQ)
      date|=0x80;
  delay_ds18b20(1);
  }
  return date;
}
/*****写一个字节*****/
void write_18b20(uchar date)
{
     for(i=0;i<8;i++)
  {
      DQ=0;
   DQ=date&0x01;
   delay_ds18b20(1);     //注意延时时间
   DQ=1;
   date=date>>1;
  }
}
uint get_18b20()
{
      if(!init_18b20())              //如果初始化成功继续进行         
      {
           write_18b20(0xcc);           //跳过序列号命令
     write_18b20(0x44);           //发送温度转换命令
     delay_ds18b20(2);
     init_18b20();             //初始化
     write_18b20(0xcc);           //跳过序列号命令
     write_18b20(0xbe);           //发送读取数据命令
    // delay_ds18b20(20)  ;
     TCL=read_18b20();            //低八位
     TCH=read_18b20();            //高八位
     temp1=TCH;
     temp1<<=8;              //高八位右移8位
           temp1=temp1|TCL;            //合并
     temperature=temp1*0.625+0.5;  //得到真实温度   
     
    }
     return temperature;     //返回转化后的温度
  //注:返回温读必须为uint型
}   

一周热门 更多>