18b20 一直读出来是85度,求解?

2020-01-30 13:47发布

本帖最后由 Ethen 于 2013-3-6 15:19 编辑

50 05 4B 46 7F FF 0C 10 1C 这组数据是内部寄存器读取出来的,我3S采样并读取,发现一直都是这组数据,就是85度,读取了18b20的默认值,不知道是什么原因?
以下是程序代码:


//11.0592晶振 51单片机
void mDelay(uint num)
{
        uint i;
        for(;num>0;num--)
        {        for(i=0;i<124;i++)
                        {;}
        }
}


void TempDelay(unsigned int n)
{
  do
  {
   _nop_();_nop_();_nop_();_nop_();
   _nop_();_nop_();_nop_();_nop_();
   _nop_();_nop_();_nop_();_nop_();
   _nop_();
   n--;
  }while(n);
}



/*****************DS18B20******************/

void Init_Ds18b20(void)     
{
DQ=1;
_nop_();
DQ=0;
TempDelay(35);  
_nop_();
DQ=1;
TempDelay(10);   
if(DQ==0)
  detect = 1;   
else
  detect = 0;   
TempDelay(1);      
_nop_();
_nop_();  
DQ = 1;

}

uchar Read_One_Byte (void)     //读取单字节
{
uchar i,u=0;
for(i=0;i<8;i++)
{
  DQ = 0;
  u >>= 1;
  _nop_();_nop_();_nop_();
  DQ = 1;
  TempDelay (1);
  if(DQ==1)
  u |= 0x80;
  TempDelay (4);                                       
  //_nop_();
}
return(u);
}




void Write_One_Byte (uchar wr)  //单字节写入
{
uchar i;
for (i=0;i<8;i++)
{
  DQ = 0;
  _nop_();_nop_();_nop_();
  DQ=wr&0x01;
  TempDelay(3);   
  //_nop_();
  //_nop_();
  DQ=1;
  wr >>= 1;
}
}


void read_bytes (uchar j)
{
  uchar i;
  for(i=0;i<j;i++)  
  {
    *p = Read_One_Byte();
    p++;
  }
}
uchar CRC (uchar j)
{
    uchar i,crc_data=0;
   
                for(i=0;i<9;i++)
                 {
                 tx_byte(temp_buff);
                 }          
   for(i=0;i<j;i++)
      crc_data = CrcTable[crc_data^temp_buff];
    return (crc_data);
}

uint Get_Tmp()                   //获取温度get the temperature
{
    float tt;
    EA=0;
        Init_Ds18b20();                //初始化
        Write_One_Byte(0xcc);          //忽略ROM指令
        Write_One_Byte(0x44);          //温度转换指令
    mDelay(200);
        Init_Ds18b20();                 //初始化
        Write_One_Byte(0xCC);          //忽略ROM指令
        Write_One_Byte(0xBE);          //读暂存器指令
        p = temp_buff;
    read_bytes (9);
    EA=1;
   if (CRC(9)==0) //校验正确
   {
   
        temp = temp_buff[1];
        temp <<= 8;
        temp = temp|temp_buff[0];
        if (temp&0XF800)//判定temp 的高五位是否為 1
        {
        temp=~temp + 1;//若temp 的高五位為1,則取temp 的補碼
        fuhao=1;
        }
    else
    {
      fuhao=0;
    }
        tt = temp*0.0625;//得到真实十进制温度值 //因为DS18B20可以精确到0.0625度 //所以读回数据的最低位代表

的是0.0625度
    temp = tt*10+0.5;  //放大十倍//这样做的目的将小数点后第一位也转换为可显示数字//同时进行一个四舍五入操作

。               
    if(fuhao==1)
    {
      temp=-1*temp-1;
    }              
   }                              
   else
   {
    temp=0;

   }
         
return temp;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
siyeb
1楼-- · 2020-02-01 11:04
这货的时序要求很严格,要有示波器的话最好照着波形调试。也不要轻易从网上down程序,不同的单片机速度是不一样,导致时序混乱。
一片落叶
2楼-- · 2020-02-01 13:33
延时也很重要,是不是多了一个nop

一周热门 更多>