找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2058|回复: 0
收起左侧

[更好用的单片机]Stduino学习(三十)DS18B20模块

[复制链接]
ID:786043 发表于 2020-8-18 20:31 | 显示全部楼层 |阅读模式
本帖最后由 Stduino 于 2020-8-18 20:34 编辑

说明:
1DS18B20是由 DALLAS 半导体公司推出的一种的单总线接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。
30-DS18B20-展示图.jpg
单总线结构具有简洁且经济的特点,可使用户轻松地组建传感器网络,从而为测量系统的构建引入全新概念,测量温度范围为-55+125℃,精度为±0.5℃。现场温度直接以单总线的数字方式传输,大大提高了系统的抗干扰性。它能直接读出被测温度,并且可根据实际要求通过简单的编程实现 9-12 位的数字值读数方式。它工作在 3~5.5V 的电压范围,采用多种封装形式,从而使系统设计灵活、方便,设定分辨率及用户设定的报警温度存储在 EEPROM 中,掉电后依然保存。
DS18B20的操作步骤如下:
1.初始化单总线对象;
2.搜索单总线上的仆从设备,并返回其ROM地址;
3.ROM地址进行处理,包括CRC校验、判断芯片类型,无误后进行下一步;
4. 读取温度,具体过程包括:
  4.1 复位,向DS18B20 发温度转换命令(0X44
  4.2 重置,发读取存储命令(0XBE
  4.3 对连续校正的两个字节数据进行转换。
5. 将温度通过串口打印

实验目的:
在本例中,我们将利用 DS18B20模块测定温度。

器材:
Stduino UNO / Nano; 杜邦线;数字温度传感器(DS18B20 )模块

电路连接:
30DS18B20电路连接.png

代码展示:
#include <OneWire.h>


OneWire  ds(10);  // 选择I/O,实例化对象

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr, HEX);
  }

  
if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();

  // 利用ROM最低8位判断是否属于DS18B20系列,以及具体的种类
  switch (addr[0]) {
    case 0x28:
      Serial.println("  Chip = DS18B20");
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  }

//4读取温度,具体过程包括:
//4.1复位、向DS18B20发温度转换命令(0X44)
  ds.reset();            
  ds.select(addr);
  ds.write(0x44, 1);        // 开始温度转换, 并保持电源接通单总线

  delay(1000);   

//4.2复位、发读取存储器命令(0XBE)
  present = ds.reset();      
  ds.select(addr);   
  ds.write(0xBE);         // 读取暂存器

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // 将暂存器里的九字节数据存储给data
    data = ds.read();
    Serial.print(data, HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");          //CRC校验
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // 4.3对连续读出的两个字节数据进行转换。

    int16_t raw = (data[1] << 8) | data[0];//由于最终结果是16位整形数据,因此被存储为“int16_t”类型

  // 通过data第四字节判断保留的温度数据位数,将多余的位数置0
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;  // 9位, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10位, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11位, 375 ms
                                 // 默认为12位,不需要处理,转换时间750 ms

  celsius = (float)raw / 16.0;  //将数据转化为实际温度,即把数据乘以0.0625
  fahrenheit = celsius * 1.8 + 32.0;  //摄氏度转华氏温度

  //4.4串口打印
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}


实验效果:
如串联监视器所示,现在的温度位 34.50 ℃。
30-ds18b20效果图.png

Stduino IDE是一款面向32位处理器快速入门学习的集成开发平台,目前已经支持Arduino_Core_STM32框架,集聚快捷、高效、免费、开源、易得于一身,软件还集成了GDB调试功能。IDE当前支持的功能有:

    GDB调试
    封装库下载安装
    代码自动补全提示
    中英文模式
    UTF-8\GBK编码格式
    代码快速格式化
    SWD\串口程序下载&调试(已验证)
    DFU程序下载方式(待验证)
    USB HID程序下载方式(待验证)
    maple DFU程序下载方式(待验证)
    maple DFU2程序下载方式(待验证)
    MassStorage程序下载方式(待验证)

更多功能细节请点击图片上水印显示的网址进行了解

已经支持的芯片&板型列表:

    Stduino UNO&Nano
    Nucleo 144 boards
    Nucleo 64 boards
    Nucleo 32 boards
    Discovery boards
    Eval boards
    STM32MP1 series coprocessor boards
    Generic STM32F0 boards
    Generic STM32F1 boards
    Generic STM32F3 boards
    Generic STM32F4 boards
    Generic STM32H7 boards
    Generic STM32L0 boards
    3D printer boards
    LoRa boards
    Electronic Speed Controller boards
    Generic flight controllers
    Garatronics boards
    Midatronics boards

更多功能集成正在进行中~

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表