冲哥视频之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; //保留一位小数的温度
}
{:lol:}前期会用即可,后面会有工程示例的,要说做工程的话这个代码要改的地方可多了, 已经搬好凳子,期待学习工程代码。 太感谢你的分享。我就是程序卡在这里,程序死活不运行读取程序,还找不到原因{:4_205:}按照你的代码修改,确认是18B20坏了{:4_205:} 太感谢你的分享。我就是程序卡在这里,程序死活不运行读取程序,还找不到原因按照你的代码修改,确认是18B20坏了谢谢鼓励 加个等待超时就退出,万一在使用的过程中坏了呢
页:
[1]