最近在搞防水的ds18b20传感器驱动代码,本想着参考原子哥的代码移植一下,不料却遇到了一些棘手的问题,程序读出来的温度一直为0xff,温度读取错误;将传感器直接放在原子哥的stm32开发板子上也读出也是0xff;顿时有点怀疑传感器是不是坏了,然后又换了一个还是这样,所以就开始重新研究一下这个传感器了。
网上搜ds18b20的数据手册,如下为ds18b20的时序图,和时序时间参考表(时序参考表一直上传失败,就不贴了)
第一个时序为写1的时序为低电平持续tlow1(1~15us),高电平持续tslot-trec-tlow1(58~105us)
第二个时序为写0的时序为低电平持续tlow0(60~120us),高电平持续trec(>1us)
第三个时序为读0的时序为低电平持续trdv(<15us),高电平持续tslot-trdv(60~105us)
第四个时序为复位的时序trstl(>480us),trsth(>480us)
第五个时序为传感器检测的时序,在复位被拉高后,需要拉高tpdhigh(15~60us),再拉低tpdlow(60>240us)
接下来看程序源码,原子哥写1和写0的时序为
if (testb)
{
DS18B20_DQ_OUT=0;// Write 1
delay_us(2);
DS18B20_