求助: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条回答
无心星矢
1楼-- · 2020-01-20 20:13
ts-fjw 发表于 2015-10-12 21:58
别读那么快

为什么?我是长任务按多级任务处理的,2.5ms初始化一下,2.5ms忽略ROM,2.5ms温度转换,2.5ms初始化一下,2.5ms忽略ROM,2.5ms读温度,如此循环。
无心星矢
2楼-- · 2020-01-20 20:26
 精彩回答 2  元偷偷看……
lcl
3楼-- · 2020-01-20 22:42
本帖最后由 lcl 于 2015-10-12 22:19 编辑

QQ图片20151012221927.png (52.74 KB, 下载次数: 0)

下载附件

2015-10-12 22:19 上传


刚看了下个阶段转换时间  楼主参考下
无心星矢
4楼-- · 2020-01-21 02:19
lcl 发表于 2015-10-12 22:17
刚看了下个阶段转换时间  楼主参考下

谢谢呀!这么晚了还给回贴子,不孤单了。
lcl
5楼-- · 2020-01-21 03:47
记得感觉你的时间有点紧,读的纸估计不准    记得当初用51的时候,转换好像有个步骤不能被打断,要把中断触发关了  我只记得这么多了  当时做的温度报警,几年了忘了
无心星矢
6楼-- · 2020-01-21 06:51
lcl 发表于 2015-10-12 22:21
记得感觉你的时间有点紧,读的纸估计不准    记得当初用51的时候,转换好像有个步骤不能被打断,要把中断触 ...

有道理,我的程度在转换时就会初始化,我再试试,谢了。

一周热门 更多>