有关DS18B20温度传感器时序问题

img

ds18b20的初始化时序可以明白
但是写入时序和读出时序和代码有问题

img

写数据的时序


* 函 数 名         : Ds18b20WriteByte
* 函数功能           : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无


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

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

写数据的代码

img

读数据的时序


```c

* 函 数 名         : Ds18b20ReadByte
* 函数功能           : 读取一个字节
* 输    入         : 无
* 输    出         : 无



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

读数据的代码

写数据的代码只编了写时序的前半段,读数据的代码只编了读时序的后半段,我不知道为什么这样