DS18B20学习笔记

DS18B20---------半双工异步通信

  • 向ds18b20发送数据

        写时间片:

        写时序包括写0时序和写1时序。

        所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。

        写1时序:主机输出低电平,延时2us,然后释放总线,延时60us。

        写0时序:主机输出低电平,延时60us,然后释放总线,延时2us。

  • 读取ds18b20的数据

        读时间片:

        单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。

        所有读时序至少需要60us,且在2次读时序之间至少需要1us的恢复时间。

        每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us内采样总线状态

  •  采集流程

        0 复位-----初始化

        1发送0xcc------跳过ds18b20内部寄存器,定位

        2发送0x44-----温度变换,ADC模拟量转换成数字量需要一定时间,所以要加延时

        3发送0xcc------重新通信

        4发送0xbe-----开始读取温度数据,连续读取2个字节的数据

  • question:若51单片机将电平拉高,ds18b20将电平拉低,引脚到底是高电平,还是低电平?(重要)

        引脚是低电平。在总线上有上拉电阻(4.7k-10k),上拉电阻的作用是帮助拉高电平,在单片机和ds18b20同时要拉高电平的时候,能保证一定是高电平,但无法改变引脚低电平这一事实。

51

Ds18b20

result

1

1

1

1

0

0

0

1

0

0

0

0

释放总线:

        线与:顾名思义就是“与操作”,那么当总线上只要存在一个低电平,整个总线上的电平都会被拉低,而只有保持总线所有设备都为高电平,整个总线的电平才会为高电平,这也是高电平被定义默认电平的原因。因此高电平表示释放。只有释放总线之后,ds18b20才能够占据总线发送数据。

注:51单片机端口是“准双向”,内部有弱上拉,输出高电平就是关掉下拉,也就是输入状态。51单片机端口置高电平,因其上拉很弱,故仍然可以由外部(18B20)拉低。

  • 复位过程  

  • DS18B20裸机驱动程序

#define DS18B20CLR (P3 &= ~(1<<7))     //把p37拉低
#define DS18B20SET (P3 |= (1<<7))     //把p37拉高
#define DS18B20TST ((P3 & (1<<7)) != 0)         //检测p37电平

void delay10us(unsigned int n)  //延时10us * n
{
     unsigned char data i;

     while(n--)
     {
         i = 2;
         while(--i);
     }
}

int reset18b20(void)  //复位
{
    int t;
    DS18B20CLR;        //拉低电平         
    delay10us(70);    //延时700us
    DS18B20SET;        //释放总线,拉高
    
    t = 0;
    while(t <= 24 && DS18B20TST)     //等240us,等其低电平
    {
        delay10us(1);
        ++t;
    }
    if(t > 24)        //判断是否等待超时,超时说明ds18b20故障
    {
        return 0;
    }

    t = 0;
    while(t <= 24 && !DS18B20TST)     //等待ds18b20释放总线,等其高电平
    {
        delay10us(1);
        ++t;
    }
    if(t > 24)        //若没有,故障
    {
        return 0;
    }

    return 1;       //成功返回1
}

void sendchar(unsigned char n)    //发送比特 ,一个字节
{
    int i;
    for(i = 0;i < 8;++i)
    {
        if((n & 0x01) != 0)      //先发低位数据,!=0按写1时序发
        {
            DS18B20CLR;          //拉低
            _nop_();          //延时
            _nop_();
            DS18B20SET;          //拉高
            delay10us(3);      //延时30us
        }
        else            //否则按写0时序发
        {
            DS18B20CLR;          //拉低
            delay10us(5);      //延时50us
            DS18B20SET;          //拉高,释放总线
        }
        n >>= 1;
    }
}

unsigned char readchar(void)  //读取比特,一个字节
{
    unsigned char ret = 0;
    int i;
    for(i = 0;i < 8;++i)
    {
        DS18B20CLR;       //拉低
        _nop_();       //空指令,消耗一个时钟周期1us
        _nop_();
        DS18B20SET;       //拉高,释放总线
        _nop_();       //延时
        _nop_();
        _nop_();
        _nop_();
        ret |= DS18B20TST << i;         //ret是读取到的一个字节
        delay10us(5);
    }

    return ret;
}

float get_temprature(void)    //按照采集流程获取温度
{
     unsigned char t1, t2;
     int ret;
     reset18b20();
     sendchar(0xCC);
     sendchar(0x44);
     delay10us(60000);
     reset18b20();
     sendchar(0xCC);
     sendchar(0xBE);
     t1 = readchar();
     t2 = readchar();
     ret = t2 << 8 | t1;

     return ret * 0.0625;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值