单总线协议解析(1-wire)

一、单总线协议(1-wire)

1.定义:主机和从机通过1根线进行通信,在一条总线上可挂接的从器件数量几乎不受限制。

2.特点:这是由达拉斯半导体公司推出的一项通信技术。它采用单根信号线,既可传输时钟,又能传输数据,而且数据传输是双向的。

3.优点:单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等。

二、单总线通信过程

1.初始化

初始化过程 = 复位脉冲 + 从机应答脉冲。

主机通过拉低单总线480 ~ 960 us产生复位脉冲,然后释放总线,进入接收模式。主机释放总线时,会产生低电平跳变为高电平的上升沿,单总线器件检测到上升沿之后,延时15 ~ 60 us,单总线器件拉低总线60 ~ 240 us来产生应答脉冲。主机接收到从机的应答脉冲说明单总线器件就绪,初始化过程完成。

初始化时序图如下所示:

2.写间隙

写间隙有两种,包括写0的时间隙和写1的时间隙。

当数据线拉低后,在15 ~ 60 us的时间窗口内对数据线进行采样。如果数据线为低电平,就是写0,如果数据线为高电平,就是写1。主机要产生一个写1时间隙,就必须把数据线拉低,在写时间隙开始后的15 us内允许数据线拉高。主机要产生一个写0时间隙,就必须把数据线拉低并保持60 us。

写时间隙时序图如下所示:

3.读时间隙

当主机把总线拉低是,并保持至少1 us后释放总线,必须在15 us内读取数据。

读时间隙时序图如下所示:

三、单总线通信设备

比如DS18B20、DHT11等都是使用的单总线协议通信。

一、DS18B20简介

1.DS18B20是由达拉斯半导体公司生产的可编程分辨率的单总线数字温度计。

2.特征

a>通过单总线协议进行通信。

b>每个器件有唯一的64位的序列号存储在内部存储器中。

c>多点分布式测温应用。

d>通过数据线供电,供电范围为3.0 ~ 5.5 V。

e>测温范围为-55 ~ +125℃,其中在-10 ~ +85℃范围内精确度为 ±5 ℃。

f>温度计分辨率可以被使用者选择为 9 ~ 12位。

g>最多在750 ms内将温度转换为12位数字。

3.工作状态下的两种供电方式

4.内部结构图

DS18B20内部 = 64位ROM(地址序列码) + 9字节暂存器。

9字节暂存器包括:温度传感器、上限触发TH高温报警器、下限触发TL低温报警器、高速暂存器、8位CRC产生器。

9字节暂存器结构图如下所示,

byte 0 : 温度 LSB (50h)

byte 1 : 温度 MSB(05h)                   EEPROM

byte 2 : TH用户定义字节1     <--->    TH用户字节1 

byte 3 : TL用户定义字节2     <--->     TL用户字节2 

byte 4 : 配置寄存器                <--->      配置寄存器

byte 5 : 保留位(FFh)

byte 6 : 保留位(0Ch)

byte 7 : 保留位(10h)

byte 8 : CRC校验位

64位ROM结构 = 8位CRC + 48位序列号 + 8位系列码(CRC产生器产生)。

5.转换精度

9-bit:  0.5 ℃

10-bit:0.25 ℃

11-bit: 0.125 ℃

12-bit: 0.0625 ℃(默认) 

二、DS18B20的使用

1.启动温度转化的步骤:复位、发出跳过ROM命令(CCH)、发出启动温度转换命令(44H)。

2.DS18B20的使用代码如下:(仅供参考)

 

#include <reg52.h>
#include "./delay/delay.h"
#include <intrins.h>
#include <stdio.h>
#include "./LCD1602/LCD1602.h"

bit ack = 0;
sbit ds = P1^0;

void ds_reset()
{
    ds = 1;
    ds = 0;
    delay_us(200);
    delay_us(200);   
    ds = 1;         
    delay_us(30);
    if(0 == ds)
    {
        ack = 1;
    }
    else
    {
        ack = 0;
    }
    delay_us(200);
    delay_us(100);
}

void ds_send_byte(unsigned char byte)
{
    unsigned char i;
    
    for(i = 0; i < 8; i++)
    {
        ds = 0;
        _nop_();
        _nop_();
        ds = byte & 0x01;
        byte >>= 1;
        delay_us(30);
        ds = 1;
    }
}

bit ds_read_bit()
{
    bit tmp;
    ds = 1;
    ds = 0;
    _nop_();
    _nop_();
    ds = 1;
    tmp = ds;
    delay_us(30);
    return tmp;
}

unsigned char ds_read_byte()
{
    unsigned char i,j,k;
    
    for(i = 0; i < 8; i++)
    {
        j = ds_read_bit();
        k = (j << 7) | (k >> 1);
    }
    
    return k;
}

void main()
{
    unsigned char a;
    unsigned int b,tmp;
    float temperature;
    unsigned char disbuf[20];
    lcd1602_init();
    while(1)
    {
        ds_reset();
        ds_send_byte(0xcc);
        ds_send_byte(0x44);
        
        ds_reset();
        ds_send_byte(0xcc);
        ds_send_byte(0xbe);
        a = ds_read_byte();
        b = ds_read_byte();
        tmp = (b << 8) | a;
        temperature = (float)tmp * 0.0625;
        sprintf(disbuf,"temp is %.3f",temperature);
        
        lcd1602_dis_str(0,0,disbuf);
    }
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值