51单片机DS18B20的使用

简介: 51单片机DS18B20的使用

前言

本篇文章将带大家学习DS18B20的使用,并将DS18B20显示到数码管中。


一、DS18B20介绍

DS18B20是一种数字温度传感器,可直接将温度转换为数字信号输出。它是一种高精度、低功耗、单总线温度传感器,具有以下特点:


精度高:DS18B20的温度测量精度为±0.5℃,可满足大多数应用的需求。


低功耗:DS18B20的工作电压范围为3V-5.5V,工作电流仅为1mA,非常适合应用于低功耗设备中。


单总线协议:DS18B20采用单总线协议,只需要一条数据线即可实现数据传输和电源供应,简化了电路设计。


高精度:DS18B20内置16位ADC,可以在-55℃到+125℃的温度范围内进行测量,且具有高抗干扰性能。


体积小:DS18B20的封装形式为TO-92、TO-92S、SOT-223等,体积小巧,方便集成到各种应用中。

DS18B20应用广泛,可用于温度测量、温度控制、温度报警等各种场合。常见的应用包括室内温度控制、电子温度计、冰箱温度监测、工业自动化等。由于其低功耗、高精度、体积小等特点,DS18B20在物联网等领域也得到了广泛应用。


二、单总线协议

单总线协议是一种串行通信协议,它可以通过一根线实现数据传输和电源供应。在单总线协议中,数据和时钟信号共用一根线,因此只需要一条线就可以实现数据传输和设备控制,简化了电路设计,降低了成本。

在单总线协议中,每个设备都有一个唯一的地址,通过地址可以对设备进行选择。当主设备需要与从设备通信时,它会向总线上发送一个请求信号,同时指定通信的从设备地址。从设备接收到请求信号后,会向总线上发送应答信号,并在一段时间内提供数据。主设备在接收到应答信号后,就可以接收从设备提供的数据。

在单总线协议中,数据的传输速率较慢,一般在几千位每秒到几十万位每秒之间。因此,它主要应用于一些对通信速度要求不高的场合,例如温度传感器、湿度传感器等。同时,单总线协议具有低成本、低功耗、可靠性高等优点,在物联网、家庭自动化等领域也得到了广泛的应用。

这里我们使用的DS18B20所使用的就是单总线协议。


三、DS18B20引脚说明

DS18B20只需要三个引脚即可读取温度数据。

接线方式

GND-----51单片机的GND

VDD-----51单片机的电源引脚

DQ-------数据的读取和写入引脚

image.png


四、DS18B20程序编写

1.DS18B20复位函数

image.png

image.png

/*******************************************************************************
* 函 数 名         : ds18b20_reset
* 函数功能       : 复位DS18B20  
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20_reset(void)
{
  DS18B20_PORT=0; //拉低DQ
  delay_10us(75); //拉低750us
  DS18B20_PORT=1; //DQ=1
  delay_10us(2);  //20US
}

2.DS18B20存在检测

image.png

首先需要等待一个低电平,当等待到低电平后就等待一个高电平,当同时满足这两个条件时就说明DS18B20是存在的。

/*******************************************************************************
* 函 数 名         : ds18b20_check
* 函数功能       : 检测DS18B20是否存在
* 输    入         : 无
* 输    出         : 1:未检测到DS18B20的存在,0:存在
*******************************************************************************/
u8 ds18b20_check(void)
{
  u8 time_temp=0;
  while(DS18B20_PORT&&time_temp<20) //等待DQ为低电平
  {
    time_temp++;
    delay_10us(1);  
  }
  if(time_temp>=20)return 1;  //如果超时则强制返回1
  else time_temp=0;
  while((!DS18B20_PORT)&&time_temp<20)  //等待DQ为高电平
  {
    time_temp++;
    delay_10us(1);
  }
  if(time_temp>=20)return 1;  //如果超时则强制返回1
  return 0;
}

3.DS18B20读取一个bit和一个byte函数

DS18B20通过使用时间片来读出和写入DS18B20数据。详细介绍如下。

image.pngimage.png


image.png

根据上面的讲解我们可以写出读一个bit的函数出来。

读取一个位函数

/*******************************************************************************
* 函 数 名         : ds18b20_read_bit
* 函数功能       : 从DS18B20读取一个位
* 输    入         : 无
* 输    出         : 1/0
*******************************************************************************/
u8 ds18b20_read_bit(void)
{
  u8 dat=0;
  DS18B20_PORT=0;
  _nop_();_nop_();
  DS18B20_PORT=1; 
  _nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据
  if(DS18B20_PORT)dat=1;  //如果总线上为1则数据dat为1,否则为0
  else dat=0;
  delay_10us(5);
  return dat;
} 

读取一个字节函数其实就是循环8次读取bit将8个bit组合成一个byte。

这里特别要注意的就是每次读取一位,且先读低位再读高位。

读取一个字节函数

/*******************************************************************************
* 函 数 名         : ds18b20_read_byte
* 函数功能       : 从DS18B20读取一个字节
* 输    入         : 无
* 输    出         : 一个字节数据
*******************************************************************************/
u8 ds18b20_read_byte(void)
{
  u8 i=0;
  u8 dat=0;
  u8 temp=0;
  for(i=0;i<8;i++)//循环8次,每次读取一位,且先读低位再读高位
  {
    temp=ds18b20_read_bit();
    dat=(temp<<7)|(dat>>1);
  }
  return dat; 
}

4.DS18B20写一个字节函数

image.png

image.png

/*******************************************************************************
* 函 数 名         : ds18b20_write_byte
* 函数功能       : 写一个字节到DS18B20
* 输    入         : dat:要写入的字节
* 输    出         : 无
*******************************************************************************/
void ds18b20_write_byte(u8 dat)
{
  u8 i=0;
  u8 temp=0;
  for(i=0;i<8;i++)//循环8次,每次写一位,且先写低位再写高位
  {
    temp=dat&0x01;//选择低位准备写入
    dat>>=1;//将次高位移到低位
    if(temp)
    {
      DS18B20_PORT=0;
      _nop_();_nop_();
      DS18B20_PORT=1; 
      delay_10us(6);
    }
    else
    {
      DS18B20_PORT=0;
      delay_10us(6);
      DS18B20_PORT=1;
      _nop_();_nop_();  
    } 
  } 
}

5.开始温度转换函数

image.png

/*******************************************************************************
* 函 数 名         : ds18b20_start
* 函数功能       : 开始温度转换
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void ds18b20_start(void)
{
  ds18b20_reset();//复位
  ds18b20_check();//检查DS18B20
  ds18b20_write_byte(0xcc);//SKIP ROM
    ds18b20_write_byte(0x44);//转换命令 
}

6.DS18B20初始化函数

初始化是非常简单的我们只需要使用之前编写好的函数,首先将DS18B20复位,然后检查DS18B20是否存在。

/*******************************************************************************
* 函 数 名         : ds18b20_init
* 函数功能       : 初始化DS18B20的IO口 DQ 同时检测DS的存在
* 输    入         : 无
* 输    出         : 1:不存在,0:存在
*******************************************************************************/ 
u8 ds18b20_init(void)
{
  ds18b20_reset();
  return ds18b20_check(); 
}

7.DS18B20读取温度函数

在DS18B20中,温度数据是以16位的方式存储的,分为高8位和低8位。因此,在读取温度数据时,需要先读取低8位数据,再读取高8位数据,然后将它们合并为16位数据。

image.png

通过这里我们可以知道正温度的符号位和负温度的符号位是不相同的。所以下面我们需要判断读取出来的温度是正温度还是负温度。

/*******************************************************************************
* 函 数 名         : ds18b20_read_temperture
* 函数功能       : 从ds18b20得到温度值
* 输    入         : 无
* 输    出         : 温度数据
*******************************************************************************/
float ds18b20_read_temperture(void)
{
  float temp;
  u8 dath=0;
  u8 datl=0;
  u16 value=0;
  ds18b20_start();//开始转换
  ds18b20_reset();//复位
  ds18b20_check();//检测是否存在DS18B20
  ds18b20_write_byte(0xcc);//SKIP ROM
    ds18b20_write_byte(0xbe);//读存储器
  datl=ds18b20_read_byte();//低字节
  dath=ds18b20_read_byte();//高字节
  value=(dath<<8)+datl;//合并为16位数据
  if((value&0xf800)==0xf800)//判断符号位,负温度
  {
    value=(~value)+1; //数据取反再加1
    temp=value*(-0.0625);//乘以精度 
  }
  else //正温度
  {
    temp=value*0.0625;  
  }
  return temp;
}

五、代码测试

/*******************************************************************************
* 函 数 名       : main
* 函数功能     : 主函数
* 输    入       : 无
* 输    出       : 无
*******************************************************************************/
void main()
{ 
  u8 i=0;
  int temp_value;
  u8 temp_buf[5];
  ds18b20_init();//初始化DS18B20
  while(1)
  {       
    i++;
    if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间
      temp_value=ds18b20_read_temperture()*10;//保留温度值小数后一位
    if(temp_value<0)//负温度
    {
      temp_value=-temp_value;
      temp_buf[0]=0x40;//显示负号 
    }
    else
    temp_buf[0]=0x00;//不显示
    temp_buf[1]=gsmg_code[temp_value/1000];//百位
    temp_buf[2]=gsmg_code[temp_value%1000/100];//十位
    temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;//个位+小数点
    temp_buf[4]=gsmg_code[temp_value%1000%100%10];//小数点后一位
    smg_display(temp_buf,4);
  }   
}

总结

DS18B20的总结和驱动代码编写就到这里了,希望大家下去自己能够多看数据手册多多总结经验。

相关文章
|
传感器 芯片
51单片机读取DS18B20温度传感器
51单片机读取DS18B20温度传感器
252 0
|
传感器 芯片
基于51单片机的智能热水器STC89C52水位检测传感器DS18B20温度探头传感器
基于51单片机的智能热水器 由STC89C52单片机+水位检测传感器+DS18B20温度探头传感器+按键模块+继电器模块+报警及指示模块+LCD1602显示模块+电源构成。 具体功能: 1、LCD1602显示屏第一行显示温度及定时时间,第二行显示温度上限和下限值; 2、按键可以设置温度的上下限值及定时时间;定时时间到开始加热 3、用两个水位检测传感器检测水位:当水位下限传感器检测到有水时,继电器开始控制加水;当水位上限传感器检测到有水时,停止加水; 4、当温度低于设置的下限温度值时,继电器开始控制加热;当温度高于设置的上限温度值时,停止加热。
145 0
|
传感器 存储 编解码
51单片机&15单片机 温度传感器DS18B20
51单片机&15单片机 温度传感器DS18B20
361 0
|
编解码 数据处理
蓝桥杯之单片机学习(十五)——DS18B20的基本应用
蓝桥杯之单片机学习(十五)——DS18B20的基本应用
359 0
蓝桥杯之单片机学习(十五)——DS18B20的基本应用
复习单片机:温度计DS18B20代码部分(内含代码部分详解+示意图)
复习单片机:温度计DS18B20代码部分(内含代码部分详解+示意图)
848 0
复习单片机:温度计DS18B20代码部分(内含代码部分详解+示意图)
|
传感器 存储 编解码
复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)
复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)
302 0
复习单片机:温度检测 DS18B20(内含:1 DS18B20 介绍+2 硬件设计+3 软件设计+4 实验现象)
|
传感器 编解码 芯片
单片机:DS18B20温度传感器(内含芯片介绍+硬件设计+软件设计+配置环境)
单片机:DS18B20温度传感器(内含芯片介绍+硬件设计+软件设计+配置环境)
324 0
单片机:DS18B20温度传感器(内含芯片介绍+硬件设计+软件设计+配置环境)
|
传感器 存储 编解码
4.5 51单片机-DS18B20温度传感器
4.5 51单片机-DS18B20温度传感器
346 0
4.5 51单片机-DS18B20温度传感器
|
传感器 语音技术 C语言
单片机温度控制系统DS18B20
 单片机温度控制系统核心 由895X系列单片机来控制来驱动18b20温度传感器模块,通过编写C语言代码,来实现对模块的控制驱动,不断的接收读取18b20传过来的温度信号。将传过来的高低位字节经过个人代码的处理计算转换成10进制数,来显示到LCD中。
1446 0
|
5月前
|
编译器 C语言 开发者
单片机原理与应用:探索微型计算机世界
单片机原理与应用:探索微型计算机世界
50 1

热门文章

最新文章