Ethen 发表于 2013-3-6 15:16:58

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

本帖最后由 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];
    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;
        temp <<= 8;
        temp = temp|temp_buff;
        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;
}

leavic 发表于 2013-3-6 16:11:07

85表示芯片没有启动温度的模数转换,你看一下就知道85其实是芯片启动后那个寄存器的默认值。
但是I2C总线应该是通的,看一下具体的命令,然后把delay什么的加长看一下吧。

wkman 发表于 2013-3-6 16:13:51

如下
1、 芯片坏了
2、 程序错了

或者两个都有

brahen 发表于 2013-3-6 16:26:51

leavic 发表于 2013-3-6 16:11 static/image/common/back.gif
85表示芯片没有启动温度的模数转换,你看一下就知道85其实是芯片启动后那个寄存器的默认值。
但是I2C总线应 ...

+1
时序问题的可能性很大

Arrowzhang 发表于 2013-3-6 16:30:17

据说是电源接反烧掉了之后的典型现象

xiaobendan001 发表于 2013-3-6 17:39:23

时序有问题

JamesErik 发表于 2013-3-6 17:45:21

曾经有一片18B20调了一个星期,经常抽风85度,换了一片果断正常{:lol:}{:lol:}

Ethen 发表于 2013-4-16 13:34:11

时序问题,把时序调整一下就好了。片子没那么容易坏,

mbass51 发表于 2013-4-16 14:38:24

多找一片

comeover 发表于 2013-4-16 16:09:54

片子烧了的话,就会一直是85.建议换一片试下。

clarkewayne 发表于 2013-4-16 18:56:27

调程序 换器件

significance201 发表于 2013-4-16 18:59:49

自己好好调试一下,搞懂协议。。。。

significance201 发表于 2013-4-16 19:00:14

慢慢来,慢慢调试

siyeb 发表于 2013-4-16 20:22:13

这货的时序要求很严格,要有示波器的话最好照着波形调试。也不要轻易从网上down程序,不同的单片机速度是不一样,导致时序混乱。

一片落叶 发表于 2013-4-16 20:44:37

延时也很重要,是不是多了一个nop
页: [1]
查看完整版本: 18b20 一直读出来是85度,求解?