标题: 单片机+DS18B20写入一个字节数据程序的疑问 [打印本页]

作者: cwb2038    时间: 2023-3-2 12:51
标题: 单片机+DS18B20写入一个字节数据程序的疑问
DS18B20 的位读写时序,如图:




当要给 DS18B20 写入 0 的时候,单片机直接将引脚拉低,持续时间大于 60us 小于 120us
就可以了。图上显示的意思是,单片机先拉低 15us 之后,DS18B20 会在从 15us 到 60us 之间
的时间来读取这一位,DS18B20 最早会在 15us 的时刻读取,典型值是在 30us 的时刻读取,
最多不会超过 60us,DS18B20 必然读取完毕,所以持续时间超过 60us 即可。
当要给 DS18B20 写入 1 的时候,单片机先将这个引脚拉低,拉低时间大于 1us,然后马
上释放总线,即拉高引脚,并且持续时间也要大于 60us。和写 0 类似的是,DS18B20 会在
15us 到 60us 之间来读取这个 1。

发送即写入一个字节的数据程序如下。
void Write18B20(unsigned char dat)
{
unsigned char mask;

EA = 0; //禁止总中断
for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次移出 8 个 bit
{
IO_18B20 = 0; //产生 2us 低电平脉冲
_nop_();
_nop_();
if ((mask&dat) == 0) //输出该 bit 值
IO_18B20 = 0;
else
IO_18B20 = 1;
DelayX10us(6); //延时 60us
IO_18B20 = 1; //拉高通信引脚
}
EA = 1; //重新使能总中断
}

疑问:“单片机先拉低 15us 之后,DS18B20 会在从 15us 到 60us 之间
的时间来读取这一位,DS18B20 最早会在 15us 的时刻读取,典型值是在 30us 的时刻读取,
最多不会超过 60us,DS18B20 必然读取完毕,所以持续时间超过 60us 即可。”但程序没有反映出15us后读取0啊?按18B20要求,控制器写“0“和“1”的时序都不一样,但程序好像没有分开来写?

作者: qsssuv    时间: 2023-3-2 14:51
没看代码,直接看你的疑问。你表述DS18B20会在某时间读取一位,又表述程序没有反映出15us后读0,这明显自相矛盾。DS18B20在什么时间读MCU在线上发出的电平状态,为何需要在程序上反映呢?DS18B20读线上电平关MCU在线上发电平状态什么事儿?MCU只需要干自己的事就好了
作者: cwb2038    时间: 2023-3-2 15:05
标题: 谢谢解答,有点理解了!
本帖最后由 cwb2038 于 2023-3-3 09:29 编辑
qsssuv 发表于 2023-3-2 14:51
没看代码,直接看你的疑问。你表述DS18B20会在某时间读取一位,又表述程序没有反映出15us后读0,这明显自相 ...

这两句话怎么理解?程序好像并没有反应出来啊?
       1、当要给 DS18B20 写入 0 的时候,单片机直接将引脚拉低,持续时间大于 60us 小于 120us
就可以了。
       2、 当要给 DS18B20 写入 1 的时候,单片机先将这个引脚拉低,拉低时间大于 1us,然后马
上释放总线,即拉高引脚,并且持续时间也要大于 60us。
   
作者: lkc8210    时间: 2023-3-2 21:06
本帖最后由 lkc8210 于 2023-3-3 09:27 编辑
cwb2038 发表于 2023-3-2 15:05
这两句话怎么理解?程序好像并没有反应出来啊?
       1、当要给 DS18B20 写入 0 的时候,单片机直接将 ...
  1. void Write18B20(unsigned char dat)
  2. {
  3. unsigned char mask;

  4. EA = 0; //禁止总中断
  5. for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次移出 8 个 bit
  6. {
  7. IO_18B20 = 0; //产生 2us 低电平脉冲
  8. _nop_();
  9. _nop_();
  10. if ((mask&dat) == 0) //输出该 bit 值
  11. IO_18B20 = 0;//<<<<<<<<<<<1
  12. else
  13. IO_18B20 = 1;//<<<<<<<<<<<2
  14. DelayX10us(6); //延时 60us
  15. IO_18B20 = 1; //拉高通信引脚
  16. }
  17. EA = 1; //重新使能总中断
  18. }
复制代码

作者: wulin    时间: 2023-3-3 07:21
cwb2038 发表于 2023-3-2 15:05
这两句话怎么理解?程序好像并没有反应出来啊?
       1、当要给 DS18B20 写入 0 的时候,单片机直接将 ...

简单的讲,写0就是一段持续60us~ 120us的低电平,写1就是一个至少1us的低电平,随后紧接着60us~ 120us的高电平。程序好像并没有反应出来1us的低电平延时是因为CPU执行两条语句的时间至少1us,不必单独写1us的低电平延时,如果加了一条_nop_();也无所谓。如果使用的高速单片机就要酌情加延时语句。
作者: cwb2038    时间: 2023-3-3 09:30
wulin 发表于 2023-3-3 07:21
简单的讲,写0就是一段持续60us~ 120us的低电平,写1就是一个至少1us的低电平,随后紧接着60us~ 120us的 ...

谢谢解答,有点理解了!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1