其实就是瞠序和判断的问题,我发过一个类似的贴,你找找。 |
主机拉低总线480-960us后释放总线,由上拉电阻拉高总线,过15-60us 18b20会拉低总行 所以延时68us后等待18b20拉低, |
wzl570 发表于 2021-9-15 08:02 不是啊,你仔细看看你的代码: DQ_ON;//1 DQ_IN;//输入 delay_us(68); if(PINA & 0X80) flag = 0; else flag = 1;//初始化成功 delay_us(420); return flag; 你是直接 68 us 后 判断,是不是高电平, 你压根没有管, 68us 之前,有没有过 低电平。换句话说,就算前面一直是高电平,你也是判断的初始化成功, 而初始化成功的关键是, 68us 之前,必须出现过低电平,这么说你能理解么? 所以,你的判断逻辑 应该是, 拉高电平后,1us 之后 等待低电平,接受到低电平后,计时60us 后再判断是否变高电平,是的话,才算初始化成功。 |
好久了还是卡在读到的高位和低位数据是一样的,在25°C时MSB是144,LSB也是![]() ![]() ![]() |
188610329 发表于 2021-9-14 20:31 我读了啊 if(PINA&0x80)//68us后还是高电平的话没有初始成功返回0 flag = 0; else flag = 1;//若是低电平,成功,返回1 //如果延时没有太大误差那么第一次拉低电平>480us再次拉高电平的68us后这段时间是DS18B20返回初始信息的时间。实际我也单独测试了初始化函数,确实返回成功标志flag = 1; //是不是我哪里了解错了 |
你初始化的判断, 有点问题…… DQ_IN;//输入 delay_us(68); if(PINA & 0X80) flag = 0; else flag = 1;//初始化成功 delay_us(420); return flag; 你没有去读 18B20 的低点平……,你怎么确认初始化成功了? 也许压根没有拉低过呢?要先读到低电平然后他又变高电平,才是他告诉你,初始化已经成功,你傻等60微妙直接读到高电平没用的。 |