DS18B20操作步骤

文件目录

  • 一、DS18B20
    • 1. DS18B20介绍
    • 2. 电路设计图
    • 3. 内部构造
      • 内部结构详细构造框架图
      • 储存器构造
  • 二、总线结构(1-Wire BUS)
    • 1. 总线结构介绍
    • 2. 电源电路标准
    • 3. 总线结构的时钟频率构造
    • 4. DS18B20操作步骤
    • 5. DS18B20数据帧
    • 6. 环境温度的储存文件格式
  • 三、编号完成
    • 1. 总线结构一部分
    • 2. DS18B20控制模块
    • 3. main.c一部分

一、DS18B20

1. DS18B20介绍

DS18B20是一种普遍的数字化温度感应器,其操纵指令和数据信息是以模拟信号的方法I/O,相较为于仿真模拟温度感应器,具备功能齐全、硬件配置简易、易拓展、抗干扰能力强等特性

  • 温度测量范畴:-55°C 到 125°C
  • 串行通讯接口:1-Wire(总线结构)
  • 其他特点:可产生系统总线、内嵌环境温度警报作用、可生存配电

2. 电路设计图

image-20210909130231679

在其中1和3号管脚各自联接GNDVCC,而二号管脚则用以应用1-Wire(总线结构)插口开展通讯。

即:

image-20210909131028390

3. 内部构造

内部结构详细构造框架图

image-20210909155650282

  • 64-BIT ROM:做为元器件详细地址,用以系统总线通讯的寻址方式
  • SCRATCHPAD(暂存器):用以系统总线的数据信息互动
  • EEPROM:用以储存环境温度开启阀值和配备主要参数

在其中配备存储器可以配备环境温度转变的精密度值。

储存器构造

image-20210909160511275

在我们期待改动EEPROM中存放的具体内容时,大家必须先将数据信息载入到暂存器中,随后再推送一条命令使从机将暂存器中的数据信息载入到EEPROM中。

二、总线结构(1-Wire BUS)

因为DS18B20应用的串行通讯接口是1-Wire,因而大家必须学习培训1-Wire有关的通讯协议,那样能够使单片机设计和它开展通讯。

1. 总线结构介绍

总线结构(1-Wire BUS)是由Dallas企业开发设计的一种通用性系统总线

  • 一根通信电缆:DQ
  • 多线程、半双工
  • 总线结构只必须一根通信电缆就可以完成数据信息的双重传送,当选用生存配电时,还能够省掉机器设备的VDD路线,这时,配电加通讯只必须DQ和GND二根线

2. 电源电路标准

  • 机器设备的DQ均要配备成开漏输出方式
  • DQ加上一个上拉电阻,电阻值一般为4.7KΩ上下
  • 若此系统总线的从机采用生存配电,则服务器还需配一个硬上拉导出电源电路

image-20210909161424463

3. 总线结构的时钟频率构造

① 复位

  • 服务器将系统总线拉低最少480us
  • 随后释放出来系统总线,等候15~60us
  • 存有的从机拉低系统总线60~240us以回应服务器
  • 最终从机将释放出来系统总线

相匹配的数据信号状态图:

image-20210909161912440

② 推送一位

  • 服务器将系统总线拉低60~120us,随后释放出来系统总线,表明推送0
  • 服务器将系统总线拉低1~15us,随后释放出来系统总线,表明推送1
  • 从机将在系统总线拉低30us后(典型值)载入脉冲信号,全部时长片应超过60us

相匹配的数据信号状态图:

image-20210909162154023

③ 接受一位

  • 服务器将系统总线拉低1~15us,随后释放出来系统总线
  • 随后服务器在拉低后15us内载入系统总线脉冲信号(尽可能接近15us的结尾
  • 载入为低电频则为接受0,载入为高电平则为接受1 ,全部时长片应超过60us

相匹配的数据信号状态图:

image-20210909162353560

④ 推送一个byte和接受一个byte

这一流程和应用I2C推送和接受一个字节的数据资料的全过程相近,全是反复推送一位或接纳一位8次就可以推送或接纳一个byte的数据信息了:

image-20210909162805563image-20210909162748561

留意推送和接受到的数据信息全是底位在前的。

4. DS18B20操作步骤

  • 复位:从机校准,服务器分辨从机是不是回应
  • ROM实际操作:ROM命令 本命令必须的存取数据
  • 作用实际操作:作用命令 本命令必须的存取数据

相匹配的ROM实际操作和作用实际操作的命令如下所示:

ROM命令 作用命令
SEARCH ROM [0xF0] CONVERT T [0x44]
READ ROM [0x33] WRITE SCRATCHPAD [0x4E]
MATCH ROM [0x55] READ SCRATCHPAD [0xBE]
SKIP ROM [0xCC] COPY SCRATCHPAD [0x48]
ALARM SEARCH [0xEC] RECALL E2 [0xB8]
READ POWER SUPPLY [0xB4]

每个作用命令的功效:

  1. CONVERT T:应用温度感应器升级环境温度值
  2. WRITE SCRATCHPAD:将每个EEPROM中的值载入到暂存器中
  3. READ SCRATCHPAD:载入暂存器中的值
  4. COPY SCRATCHPAD:将暂存器中的具体内容拷贝到EEPROM中
  5. RECALL E2:将EEPROM中的具体内容拷贝到暂存器中
  6. READ POWER SUPPLY:载入器的配电方式【单独配电|生存配电】

5. DS18B20数据帧

① 环境温度转换:复位→绕过ROM →逐渐环境温度转换

image-20210909163413495

② 环境温度载入:复位→绕过ROM →读暂存器→持续的读实际操作

image-20210909163445714

6. 环境温度的储存文件格式

里边的气温是应用补码方式存放的,实际的事例如下所示:

image-20210909162154023

温度表示的范畴是-55到 125度

三、编号完成

1. 总线结构一部分

大家将这一部分撰写到OneWire控制模块中

最先是DQ管脚,依据电路设计图我们可以了解他相匹配的是集成ic的P37管脚,因而先把它界定出去:

sbit OneWire_DQ = P3 ^ 7;

① 复位

image-20210909161912440

unsigned char OneWire_Init() {    unsigned char i;    unsigned char Ack;    EA=0;    {        OneWire_DQ = 1;        OneWire_DQ = 0;         // 拉低        i = 227; while (--i);   // delay 500μs        OneWire_DQ = 1;         // 释放出来                i = 29; while (--i);    // delay 70μs,等候从机将脉冲信号拉低        // 获得从机回复        Ack = OneWire_DQ;        i = 227; while (--i);   // delay 500μs 等候时钟频率走完    }    EA=1;    // 将从机回复回到,0表明有回复,1表明无应答    return Ack;}

可以发觉,大家的编码中出現了EA=0;EA=1;,这几句编码分别是实际操作终端设备操作系统的总闸开展关掉和打开中断系统的,由于在总线结构推送数据信号的环节中,假如忽然来啦终断,CPU转而运作终断程序流程,那样延迟便会遭受很大的危害

比如当今运作到delay 70μs的部位,这时来啦一个终断数据信号,当运作完终断程序流程回家的情况下,很有可能就早已延迟了10ms了,这对总线结构通讯的直接影响是致命性的,故我们在应用总线结构推送或接收数据信号时都必须先关掉终断

tips:在其中的延迟编码全是应用stc-isp软件开展转化成的,在转化成编码时必须留意晶振电路和8051指令系统的挑选:

image-20210910120545180

② 推送一位

image-20210909162154023

void OneWire_SendBit(unsigned char Bit) {    unsigned char i;    EA=0;    {        OneWire_DQ = 0;         // 拉低        i = 3; while (--i);     // delay 10μs          // 若为1则释放出来系统总线,意味着推送1;若为0一直为低电频,意味着推送0        OneWire_DQ = Bit;        i = 22; while (--i);    // delay 50μs        OneWire_DQ = 1;         // 最终释放出来系统总线    }    EA=1;}

③ 接受一位

image-20210909162353560

unsigned char OneWire_ReceiveBit() {    unsigned char i;    unsigned char Bit;    EA=0;    {        OneWire_DQ = 0;         // 拉低        i = 1; while (--i);     // delay 5μs        OneWire_DQ = 1;         // 释放出来        i = 1; while (--i);     // delay 5μs        Bit = OneWire_DQ;       // 取样        i = 22; while (--i);    // delay 50μs    }    EA=1;    return Bit;}

④ 推送一个byte和接受一个byte

image-20210909162748561

void OneWire_SendByte(unsigned char byte) {    unsigned char i;    for(i = 0; i < 8; i  ) {        OneWire_SendBit(byte & (0x01 << i));    }}

image-20210909162805563

unsigned char OneWire_ReceiveByte() {    unsigned char i;    unsigned char byte = 0x00;    for(i = 0; i < 8; i  ) {        if(OneWire_ReceiveBit()) {            byte |= (0x01 << i);        }    }    return byte;}

2. DS18B20控制模块

最先大家把必须的指令和依靠的控制模块(OneWire模块)加上进去:

#include \"OneWire.h\"#define DS18B20_SKIP_ROM 0xCC#define DS18B20_CONVERT_T 0x44#define DS18B20_READ_SCRATCHPAD 0xBE

① 温度换算

image-20210909163413495

void DS18B20_ConvertT() {    OneWire_Init();    OneWire_SendByte(DS18B20_SKIP_ROM);    OneWire_SendByte(DS18B20_CONVERT_T);}

② 环境温度载入

image-20210909163445714

float DS18B20_ReadT() {    unsigned char TLSB, THSB;    int Temp;    float T;    OneWire_Init();    OneWire_SendByte(DS18B20_SKIP_ROM);    OneWire_SendByte(DS18B20_READ_SCRATCHPAD);    TLSB = OneWire_ReceiveByte();  // 接受低八位    THSB = OneWire_ReceiveByte();  // 接受高八位    Temp = (THSB << 8) | TLSB;    T = Temp / 16.0;  // 转变成float种类    return T;}

3. main.c一部分

void main() {    float T, TShow;    LCD_Init();    DS18B20_ConvertT();    Delay(1000);    while (1) {        DS18B20_ConvertT();    // 温度换算        T = DS18B20_ReadT();   // 载入环境温度        // 表明标记位        if (T < 0) {            LCD_ShowString(2, 0, \"-\");            TShow = -T;        } else {            LCD_ShowString(2, 0, \" \");            TShow = T;        }        LCD_ShowNum(2, 2, TShow, 3);  // 整数金额一部分        LCD_ShowString(2, 5, \".\");    // 小数位        LCD_ShowNum(2, 6, (unsigned long) (TShow * 10) % 10, 1); // 小数部分,一位小数    }}

那样人们就可以即时地展现环境温度了。

tips:在开始开展一次温度换算并Delay(1000);的因素是:温度换算是必须一定的时长的,如果我们不开展延迟而立即取下环境温度值便会获得默认值25.0。