OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3886|回复: 7

关于stm32f103的DS18B20数字温度传感器

[复制链接]

10

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2017-4-8
在线时间
23 小时
发表于 2017-8-3 19:24:59 | 显示全部楼层 |阅读模式
1金钱
各位大佬,我在看原子哥的DS18B20列程时发现,写数据时还分写0和写1,如下:
void DS18B20_Write_Byte(u8 dat)     
{            
    u8 j;
    u8 testb;
          DS18B20_IO_OUT();           //SET PG11 OUTPUT;
    for (j=1;j<=8;j++)
          {
        testb=dat&0x01;    //先写低位
        dat=dat>>1;
        if (testb)
        {
            DS18B20_DQ_OUT=0;        // Write 1
            delay_us(2);                           
            DS18B20_DQ_OUT=1;
            delay_us(60);            
        }
        else
        {
            DS18B20_DQ_OUT=0;        // Write 0
            delay_us(60);            
            DS18B20_DQ_OUT=1;
            delay_us(2);                          
        }
    }
}



即if...else中的内容
但是我当初学51的时候DS18B20的写操作并没用区分写0还是写1啊,都是把数据低位取出来直接写入的,是能成功实的色,如下:

uchar Ds18b20ReadByte()
{
        uchar byte, bi;
        uint i, j;       
        for(j=8; j>0; j--)
        {
                DSPORT = 0;//先将总线拉低1us
                i++;
                DSPORT = 1;//然后释放总线
                i++;
                i++;//延时6us等待数据稳定
                bi = DSPORT;         //读取数据,从最低位开始读取
                /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
                byte = (byte >> 1) | (bi << 7);                                                  
                i = 4;                //读取完之后等待48us再接着读取下一个数
                while(i--);
        }                               
        return byte;
}

感觉这里差别还是蛮大的,这是为什么呢?求好心大佬解答


QQ截图20170803191459.png
QQ截图20170803192052.png

最佳答案

查看完整内容[请看2#楼]

必须有写0,写1,你自己看数据手册
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-8-3 19:25:00 | 显示全部楼层
必须有写0,写1,你自己看数据手册
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-8-3 19:48:39 | 显示全部楼层
数据线设置为开漏模式,无须切换输入输出。
回复

使用道具 举报

10

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2017-4-8
在线时间
23 小时
 楼主| 发表于 2017-8-3 20:02:42 | 显示全部楼层
Acuity 发表于 2017-8-3 19:48
数据线设置为开漏模式,无须切换输入输出。

我问的不是这个问题,而是写数据的时候32把低位取出来,还要区分写0还是写1,但是51是低位取出来直接写入,这是为什么呢
回复

使用道具 举报

10

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2017-4-8
在线时间
23 小时
 楼主| 发表于 2017-8-4 09:42:04 | 显示全部楼层
有大佬知道咋回事吗
回复

使用道具 举报

10

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2017-4-8
在线时间
23 小时
 楼主| 发表于 2017-8-6 10:34:51 | 显示全部楼层
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
192
金钱
192
注册时间
2017-9-17
在线时间
19 小时
发表于 2017-10-27 16:34:24 | 显示全部楼层
比如你要写开始转换命令0x44,对应二进制0100 0100  写进去不就是有1有0么
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2017-10-27 17:00:38 来自手机 | 显示全部楼层
   DS18B20_DQ_OUT=1;             delay_us(60);    这才是写1操作
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-23 19:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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