求助:DS18B20读温度失败,请大神相助。附上部分代码。

2020-01-19 19:37发布

本帖最后由 无心星矢 于 2015-10-12 20:40 编辑

单片机读取DS18B20温度失败,显示“0001”。
图片如下:
IMG_20151012_203256.jpg (2.72 MB, 下载次数: 0) 下载附件 2015-10-12 20:35 上传
2.5ms的定时时标,2.5ms调用一次以下代码及刷新一次显示,代码如下:
  1. tWord v_Ds18b20ReadTemp_f( void )
  2. {
  3.         tWord TempH, TempL ;
  4.         tWord ReturnTemp ;
  5.         tByte Temp_G=0;
  6.                
  7.         if (++Temp_G == 6)
  8.       {
  9.       Temp_G = 0;
  10.       }

  11.    switch (Temp_G)
  12.       {
  13.       case 0:
  14.          {      
  15.          v_Ds18b20Init_f() ;
  16.          break;
  17.          }

  18.       case 1:
  19.          {
  20.                  _nop_();      
  21.          v_Ds18b20Write_f( 0xcc ) ; //Ìø¹ýROM
  22.          break;
  23.          }

  24.       case 2:
  25.          {      
  26.          v_Ds18b20Write_f( 0x44 ) ;
  27.          break;
  28.          }

  29.       case 3:
  30.          {      
  31.          v_Ds18b20Init_f() ;
  32.                  break;
  33.          }
  34.           case 4:
  35.                   {
  36.                 _nop_();
  37.                   v_Ds18b20Write_f( 0xcc ) ;
  38.                 break;
  39.                  }
  40.           case 5:
  41.            {
  42.            v_Ds18b20Write_f( 0xbe ) ;
  43.            }
  44.       }
  45.         TempL = v_Ds18b20Read_f() ;
  46.         TempH = v_Ds18b20Read_f() ;
  47.         ReturnTemp = TempH ;
  48.         ReturnTemp <<= 8 ;
  49.         ReturnTemp |= TempL ;
  50.         return ReturnTemp ;
  51. }
复制代码
  1. void v_TemperatureUpdate_f( void )
  2. {
  3.         tWord Tflag = 0 ;
  4.         tWord TempDat ,a,b,c;
  5.         float Temp ;
  6.         TempDat = v_Ds18b20ReadTemp_f() ;
  7.         if( TempDat & 0xf000 )
  8.         {
  9.                 Tflag = 1 ;
  10.                 TempDat = ~TempDat + 1 ;
  11.         }
  12.         Temp = TempDat *0.0625;
  13.         TempDat = Temp * 10+0.5 ;
  14.          a=TempDat / 100;
  15.          b=TempDat % 100 ;
  16.          b=b/ 10 ;
  17.          c=TempDat% 10 ;
  18.         Temperature[ 3 ] = 0x3F ;
  19.         Temperature[ 2 ] = LED_Table_G[a] ;
  20.         Temperature[ 1 ] = LED_Table_G[b] ;
  21.         Temperature[ 0 ] = LED_Table_G[c] ;
  22. }
复制代码
坐等解决。谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
lcl
1楼-- · 2020-01-19 23:17
你这是一次性挂几个B20?还是就一个?
lxa0
2楼-- · 2020-01-20 02:26
多读几次嘛~~~~~~~~~~~~~~~~
无心星矢
3楼-- · 2020-01-20 07:27
 精彩回答 2  元偷偷看……
无心星矢
4楼-- · 2020-01-20 09:30
lxa0 发表于 2015-10-12 21:44
多读几次嘛~~~~~~~~~~~~~~~~

不明白,我是每2.5ms调一次void v_TemperatureUpdate_f( void )。只要不断电,就一直读。
ts-fjw
5楼-- · 2020-01-20 09:32
别读那么快
techbaby
6楼-- · 2020-01-20 14:27
记得读一次温度大概几百ms吧,你这时序根本就不对嘛!

一周热门 更多>