找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1087|回复: 5
打印 上一主题 下一主题
收起左侧

单片机+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”的时序都不一样,但程序好像没有分开来写?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:353115 发表于 2023-3-2 14:51 | 只看该作者
没看代码,直接看你的疑问。你表述DS18B20会在某时间读取一位,又表述程序没有反映出15us后读0,这明显自相矛盾。DS18B20在什么时间读MCU在线上发出的电平状态,为何需要在程序上反映呢?DS18B20读线上电平关MCU在线上发电平状态什么事儿?MCU只需要干自己的事就好了
回复

使用道具 举报

板凳
ID:673647 发表于 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。
   
回复

使用道具 举报

地板
ID:161164 发表于 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. }
复制代码
回复

使用道具 举报

5#
ID:213173 发表于 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_();也无所谓。如果使用的高速单片机就要酌情加延时语句。
回复

使用道具 举报

6#
ID:673647 发表于 2023-3-3 09:30 | 只看该作者
wulin 发表于 2023-3-3 07:21
简单的讲,写0就是一段持续60us~ 120us的低电平,写1就是一个至少1us的低电平,随后紧接着60us~ 120us的 ...

谢谢解答,有点理解了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表