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

2019-08-11 18:57发布

各位大佬,我在看原子哥的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啊,都是把数据低位取出来直接写入的,是能成功实的 {MOD},如下:

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;
}

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


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
正点原子
1楼-- · 2019-08-11 22:37
 精彩回答 2  元偷偷看……
Acuity
2楼-- · 2019-08-12 00:02
数据线设置为开漏模式,无须切换输入输出。
风景第三
3楼-- · 2019-08-12 03:28
Acuity 发表于 2017-8-3 19:48
数据线设置为开漏模式,无须切换输入输出。

我问的不是这个问题,而是写数据的时候32把低位取出来,还要区分写0还是写1,但是51是低位取出来直接写入,这是为什么呢
风景第三
4楼-- · 2019-08-12 05:57
有大佬知道咋回事吗
风景第三
5楼-- · 2019-08-12 08:18
zhanminlove
6楼-- · 2019-08-12 14:16
 精彩回答 2  元偷偷看……

一周热门 更多>