有个朋友给的资料,觉得讲的不错分享给大家。 |
DSPORT = dat & 0x01; // 这里决定写0 还是写1 i=6; while(i--); //延时68us,持续时间最少60us DSPORT = 1; //这里是释放总线 |
pull1121 发表于 2020-3-3 12:11 是这样的,理解正确。 |
“我的理解是这样,是不是此时的高电平是被单片机被动拉高的,所以不用去处理?” 看来你对这时序还不是太明白,DSPORT = dat & 0x01; 这句的意义是数据dat最低位如果是1,与上0x01就是1,即DSPORT=1,单片机主动拉高电平;如果最低位是0,则DSPORT=0,单片机主动拉低电平。不管是拉低还是拉高,一直保持该电平到45us,这是给18b20读数据的时间,这期间DSPORT=1则18b20读到1,为0则读到0,不一定非要延时45us,我试过延时80us也正常工作 |
f556 发表于 2020-3-3 10:20 首先非常感谢您的详细解释,还手画了图。我能理解这几个关键点。就是在采样的45微秒的时候,不是数据线拉高了么?我的理解是这样,是不是此时的高电平是被单片机被动拉高的,所以不用去处理? |
odfggf 发表于 2020-3-2 20:55 嗯嗯 很感谢您的详细解释 之前是不太明白 为啥不区分写0和1 。有跟帖的师傅解释的很清楚了 谢谢! |
重新画个图,来解释。图中有3处相同,所以正如你所说,大部分人不区分是写1还是写0。我所见过的程序各写的程序是不区分的。 你图中写1采样是15+20us,不对,原版上还是15+30us。 由于采样都是在15us后才开始的,不论写1、写0,所以关键点1:15us以内操作好DQ线。 由于采样时间都是45us,关键点2:不能在15+45us期间变换DQ,一定要保持足够时间让采样完成。 由于数据位的分隔是最小1us的高电平,关键点3:必须要有1us以上的分隔拉低再拉高电平。 区分写1写0的程序明显要复杂一点,没用延时函数较差劲(编译后要多),建议采纳大家都用的不区分方式。 |
pull1121 发表于 2020-3-1 11:46 程序写法千万种,每个人的写法不同,意义一样。 写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后dat & 0x01,若为0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若为1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。 这就是第一种写法的意思。 |
Y_G_G 发表于 2020-3-1 14:50 感谢哈 还是不太明白 |
这是美信的官方PDF,你参考一下 18B20时序实际上是比较简单的,基本是以延时为主的,你多看一下别人的程序,或者是中文版的PDF数据手册就可以了 |
cccc888 发表于 2020-2-29 19:05 我看到了 即使你的时序图是对的 那个写1的时候DS被拉高了 为啥我上面别人写的程序怎么不区分哈 还是按拉低了处理的 根本不区分写0和1? |
cccc888 发表于 2020-2-29 19:05 从郭天祥老师写的书里面看来得 ,错了哈,你有英文原版的资料么 发我一份 pull1121@163.com 谢谢 |
技术贴值得mark mark mark |
你这张图从哪里找的。
|