微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求高手关于DS18B20的

求高手关于DS18B20的

时间:10-02 整理:3721RD 点击:
为什么测量的温度比实际高呢?求解释啊搞个十几度感觉

也许你的18B20焊接位置离一些发热的原件比较近 然后温度就会受到影响,

贴你的程序上来看看

#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型
}   

程序没问题的话你就把18B20换个位置。

数据处理有问题

'' TCL=read_18b20();            //低八位
     TCH=read_18b20();            //高八位
     temp1=TCH;
     temp1<<=8;              //高八位右移8位
           temp1=temp1|TCL;            //合并
     temperature=temp1*0.625+0.5;  //得到真实温度  ''
再看看吧

不明白

学习了

求赐教

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top