找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2722|回复: 14
收起左侧

根据时序图来写关于 DS18B20的写数据

[复制链接]
ID:535242 发表于 2020-2-29 14:35 | 显示全部楼层 |阅读模式
图片当中的写法看不明白,有没有能帮忙稍微详细解答下,新手一枚!我看很多师傅的写法不区分写1还是写0?又是为哈?
* 函 数 名         : Ds18b20WriteByte
* 函数功能                   : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Ds18b20WriteByte(uchar dat)
{
        uint i, j;

        for(j=0; j<8; j++)
        {
                DSPORT = 0;                       //每写入一位数据之前先把总线拉低1us
                i++;
                DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
                i=6;
                while(i--); //延时68us,持续时间最少60us
                DSPORT = 1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
                dat >>= 1;
        }
}

51hei截图20200229143237.png
51hei截图20200229143330.png
回复

使用道具 举报

ID:258566 发表于 2020-2-29 19:05 | 显示全部楼层
你这张图从哪里找的。 18b20图不一样.PNG
回复

使用道具 举报

ID:130435 发表于 2020-2-29 20:42 | 显示全部楼层
技术贴值得mark mark mark
回复

使用道具 举报

ID:535242 发表于 2020-3-1 11:41 | 显示全部楼层
cccc888 发表于 2020-2-29 19:05
你这张图从哪里找的。

从郭天祥老师写的书里面看来得 ,错了哈,你有英文原版的资料么 发我一份 pull1121@163.com 谢谢
回复

使用道具 举报

ID:535242 发表于 2020-3-1 11:46 | 显示全部楼层
cccc888 发表于 2020-2-29 19:05
你这张图从哪里找的。

我看到了 即使你的时序图是对的 那个写1的时候DS被拉高了 为啥我上面别人写的程序怎么不区分哈 还是按拉低了处理的 根本不区分写0和1?
回复

使用道具 举报

ID:401564 发表于 2020-3-1 14:50 | 显示全部楼层
这是美信的官方PDF,你参考一下
18B20时序实际上是比较简单的,基本是以延时为主的,你多看一下别人的程序,或者是中文版的PDF数据手册就可以了 DS18B20.pdf (382.99 KB, 下载次数: 13)
回复

使用道具 举报

ID:535242 发表于 2020-3-1 16:20 | 显示全部楼层
Y_G_G 发表于 2020-3-1 14:50
这是美信的官方PDF,你参考一下
18B20时序实际上是比较简单的,基本是以延时为主的,你多看一下别人的程序,或 ...

感谢哈 还是不太明白
回复

使用道具 举报

ID:642838 发表于 2020-3-2 20:55 | 显示全部楼层
pull1121 发表于 2020-3-1 11:46
我看到了 即使你的时序图是对的 那个写1的时候DS被拉高了 为啥我上面别人写的程序怎么不区分哈 还是按拉 ...

程序写法千万种,每个人的写法不同,意义一样。
写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后dat & 0x01,若为0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若为1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
这就是第一种写法的意思。
回复

使用道具 举报

ID:282850 发表于 2020-3-3 10:20 | 显示全部楼层
重新画个图,来解释。图中有3处相同,所以正如你所说,大部分人不区分是写1还是写0。我所见过的程序各写的程序是不区分的。
你图中写1采样是15+20us,不对,原版上还是15+30us。
由于采样都是在15us后才开始的,不论写1、写0,所以关键点1:15us以内操作好DQ线。
由于采样时间都是45us,关键点2:不能在15+45us期间变换DQ,一定要保持足够时间让采样完成。
由于数据位的分隔是最小1us的高电平,关键点3:必须要有1us以上的分隔拉低再拉高电平。
区分写1写0的程序明显要复杂一点,没用延时函数较差劲(编译后要多),建议采纳大家都用的不区分方式。
IMG_20200303_100130.jpg
回复

使用道具 举报

ID:535242 发表于 2020-3-3 12:06 | 显示全部楼层
odfggf 发表于 2020-3-2 20:55
程序写法千万种,每个人的写法不同,意义一样。
写周期一开始做为主机先把总线拉低1微秒表示写周期开始 ...

嗯嗯  很感谢您的详细解释 之前是不太明白 为啥不区分写0和1 。有跟帖的师傅解释的很清楚了 谢谢!
回复

使用道具 举报

ID:535242 发表于 2020-3-3 12:11 | 显示全部楼层
f556 发表于 2020-3-3 10:20
重新画个图,来解释。图中有3处相同,所以正如你所说,大部分人不区分是写1还是写0。我所见过的程序各写的 ...

首先非常感谢您的详细解释,还手画了图。我能理解这几个关键点。就是在采样的45微秒的时候,不是数据线拉高了么?我的理解是这样,是不是此时的高电平是被单片机被动拉高的,所以不用去处理?
回复

使用道具 举报

ID:407089 发表于 2020-3-3 14:14 | 显示全部楼层
“我的理解是这样,是不是此时的高电平是被单片机被动拉高的,所以不用去处理?”
看来你对这时序还不是太明白,DSPORT = dat & 0x01; 这句的意义是数据dat最低位如果是1,与上0x01就是1,即DSPORT=1,单片机主动拉高电平;如果最低位是0,则DSPORT=0,单片机主动拉低电平。不管是拉低还是拉高,一直保持该电平到45us,这是给18b20读数据的时间,这期间DSPORT=1则18b20读到1,为0则读到0,不一定非要延时45us,我试过延时80us也正常工作
回复

使用道具 举报

ID:282850 发表于 2020-3-3 14:15 | 显示全部楼层
pull1121 发表于 2020-3-3 12:11
首先非常感谢您的详细解释,还手画了图。我能理解这几个关键点。就是在采样的45微秒的时候,不是数据线拉 ...

是这样的,理解正确。
回复

使用道具 举报

ID:419968 发表于 2020-3-3 14:44 | 显示全部楼层
    DSPORT = dat & 0x01;  // 这里决定写0 还是写1
                i=6;
                while(i--); //延时68us,持续时间最少60us
                DSPORT = 1;        //这里是释放总线
回复

使用道具 举报

ID:709595 发表于 2020-4-16 18:33 | 显示全部楼层
有个朋友给的资料,觉得讲的不错分享给大家。
写时序图.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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