垂柳工作室 发表于 2024-2-27 09:41:32

冲哥视频之DS18B20测温度读取函数的改进建议

冲哥视频之DS18B20测温度读取函数的改进建议


   冲哥的教学视频讲解清晰逻辑明了,特适合零基础人士自学。但有少数地方省略做项目工程时需要考虑的代码。比如第26集DS18B20测温度,其中读取函数
   “while(!DQ);//4.等待DQ变成高电平”这一句就会因为DS18B20器件损坏卡壳。
   我个人觉得应该在初始化这里弄一个判断,如果DS18B20器件损坏或者没应答直接返回错误值,以便更换元件调试。
      下面就列出修改的代码供参考,也是用于抛砖引玉,向大咖赐教。
      字体红色部分是修改的地方。

bit DS18b20_Reset(void) //复位
{
   bit DS18B20_Online = 1;
   while( flag )
      {
             DQ = 0; //输出低电平
             Delay480us();
             DQ = 1; //输出高电平
             Delay60us(); //DS18B20检测高电平等待15-60us发出应答
if(DQ==1)               //读取当前电平
   DS18B20_Online =0;
            Delay480us();
       }
return DS18B20_Online;
}

u16 DS18b20_ReadTemp(void) //读取并且换算温度,并返回
{
      u8 TempH;
      u8 TempL;
   u16 temperture;

   if(DS18b20_Reset()==0) //1.复位
   return 999; //返回999度,给出错误提示
   DS18b20_WriteByte(0XCC);//2.跳过ROM指令
   DS18b20_WriteByte(0X44);//3.开始转化
   while(!DQ); //4.等待DQ变成高电平

   DS18b20_Reset(); //5.复位
   DS18b20_WriteByte(0XCC);//6.跳过ROM指令
   DS18b20_WriteByte(0XBE);//7.读取

   TempL = DS18b20_ReadByte();
   TempH = DS18b20_ReadByte();

   if( TempH & 0XF8 ) //有1出现就是负数
   {
      MinusFlag = 1; //标志位负数
      temperture = ((TempH<<8) | TempL); //将温度换算成16位
      temperture = (~temperture) +1; //按位取反+1
      temperture = temperture*10*0.0625; //最终温度保留一位小数
   }
   else
   {
      MinusFlag = 0; //标志位正数
      temperture = ((TempH<<8) | TempL); //将温度换算成16位
      temperture = temperture*10*0.0625; //最终温度保留一位小数
   }
   Temp = temperture;
   return temperture; //保留一位小数的温度
}

电子DIY小家 发表于 2024-2-27 10:37:02

{:lol:}前期会用即可,后面会有工程示例的,要说做工程的话这个代码要改的地方可多了,

垂柳工作室 发表于 2024-2-27 11:52:55

已经搬好凳子,期待学习工程代码。

Tuier 发表于 2024-4-19 08:15:44

太感谢你的分享。我就是程序卡在这里,程序死活不运行读取程序,还找不到原因{:4_205:}按照你的代码修改,确认是18B20坏了{:4_205:}

垂柳工作室 发表于 2024-5-3 15:40:39

太感谢你的分享。我就是程序卡在这里,程序死活不运行读取程序,还找不到原因按照你的代码修改,确认是18B20坏了谢谢鼓励

QQ624353765 发表于 2024-5-3 17:12:35

加个等待超时就退出,万一在使用的过程中坏了呢
页: [1]
查看完整版本: 冲哥视频之DS18B20测温度读取函数的改进建议