学习使用的开发板:STC89C52RC/LE52RC
编程软件:Keil5
烧录软件:stc-isp

开发板实图:
在这里插入图片描述

DS18B20

DS18B20在开发板位置如下:
在这里插入图片描述

模拟温度传感器是通过检测热敏电阻电压变化,通过模电转化,得到温度及温度变化。

DS18B20 是一种常见的数字温度传感器,数字温度传感器集成了模拟温度传感器芯片和控制电路,其控制命令和数据都是以数字信号的方式输入输出,相比较模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点

DS18B20 是由美信/达拉斯公司生产,相关特征如下:

  • 测温范围:-55℃ ~ +125℃
  • 通信接口:1-Wire(单总线)
  • 可形成总线结构、内置温度报警功能、可寄生供电

在这里插入图片描述

其引脚及应用电路如下

在这里插入图片描述

  • VDD:内部芯片正极
  • GND:内部芯片电源地,相当于负极
  • DQ:单总线通信接口

因为要构成总线结构,所以DQ外接一颗上拉电阻,防止多设备通信可能造成的影响或损坏,详细可参看【51单片机】I2C总线 + AT24C02


DS18B20 内部结构框图如下:

在这里插入图片描述

  • 地址匹配:

64位激光ROM,只读存储器。
每一个 DS18B20 包括一个唯一的 64 位长的 ROM 编码。开始的8位是单线产品系列编码(DS1820 编码是 10h)。
接着的 48 位是唯一的系列号。
最后的8 位是开始 56 位 CRC(见下图)。
单线总线主机必须首先操作五种 ROM 操作命令之一:
1)Read ROM(读ROM)
2)Match ROM(配 ROM)
3)Search ROM(搜索 ROM)
4)Skip ROM(跳过 ROM)
5)Alarm Search(告警搜索)。
在成功地执行了 ROM 操作序列之后,DS1820特定的功能便可访问,然后总线上主机可提供六个存贮器和控制功能命令之一。
在这里插入图片描述

  • Temperature Sensor:模拟温度传感器芯片,提供温度数据
  • 地址控制逻辑:接收DQ通信接口输入的指令或命令,根据命令对暂存器和存储器进行操作
  • 暂存器:高速暂存RAM。数据首先写入暂存器,此时可以被读回;当数据被校验之后,复制存储器的命令把数据传送到左侧的存储器,有助于确保存储器数据的完整性

存储器结构如下:

在这里插入图片描述

1-Wire 单总线介绍

  • 单总线(1-Wire BUS) 是由达拉斯公司开发的一种通用数据总线
  • 一根通信线:DQ
  • 异步、半双工
  • 单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供电时,还可以省去设备的 VDD 线路,此时供电加通信只需要 DQ 和 GDN 两根线

电路规范

设备的 DQ 均要配置成开漏输出模式,防止多设备通信可能造成的设备损坏

DQ 添加一个上拉电阻,阻值一般在 4.7KΩ左右,用于输出高电平

开漏输出和上拉电阻的介绍,参看【51单片机】I2C总线 + AT24C02

若此总线的从机采取寄生供电,则主机还应配一个强上拉输出电路

时序结构

初始化(通信开始)

主机将总线拉低至少480us,然后释放总线,等待15 ~ 60us后,存在的从机会拉低总线 60 ~ 240us以响应主机,之后从机释放总线

在这里插入图片描述

发送一位数据

主机将总线拉低 60 ~ 120us,然后释放总线,表示发送0;
主机将总线拉低1 ~ 15us,然后释放总线,表示发送1。
从机将在总线拉低30us后(典型值)读取电平,整个时间片应大于 60us

在这里插入图片描述

接收一位数据

主机将总线拉低1 ~ 15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的末尾),读取为低电平则为接收0;读取为高电平则为接收1,整个时间片应大于60us

在这里插入图片描述

发送一个字节数据&接收一个字节数据

连续调用 8 次发送/接收一位的时序,低位在前

在这里插入图片描述

操作DS18B20

DS18B20有三种操作:

  • 初始化:从机复位,主机判断从机是否响应
  • ROM操作:ROM指令 + 本指令需要的读写操作
  • 功能操作:功能指令 + 本指令需要的读写操作

初始化对应时序结构的初始化操作
ROM指令 和 功能操作如下:

在这里插入图片描述

1)Read ROM(读ROM)
2)
3)Search ROM(搜索 ROM)
4)
5)Alarm Search(告警搜索)。

ROM指令

  1. Search ROM:搜索 ROM
  2. Read ROM:读 ROM
  3. Match ROM:匹配 ROM
  4. Skip ROM:跳过 ROM
  5. Alarm Search:告警搜索

功能指令

  1. Convert T:温度转变。控制模拟温度传感器获取温度,存储在存储器和暂存器中
  2. Write Scratchpad:写暂存器
  3. Read Scratechpad:读暂存器
  4. Copy Scratechpad:将存储器的内容拷贝到暂存区
  5. Recall E2:将暂存器的数据写入存储器
  6. Read Power Supply:判断当前是电源供电还是寄生供电

DS18B20 常用的数据帧如下:

  • 温度变换:初始化 -> 跳过ROM -> 开始温度变换在这里插入图片描述

  • 温度读取:初始化 -> 跳过ROM -> 读暂存器 -> 连续的读操作在这里插入图片描述

读数据的顺序按照暂存器存储数据的顺序
在这里插入图片描述

其中,前两个字节存储温度信息,LSB存储低8位,MSB存储高8位,格式如下:
在这里插入图片描述
使用 LSB 的低4位存储小数信息

编程实例 —— 温度显示

将温度显示在 LCD1602 液晶显示屏上

首先封装时序结构

One_Wire.c

初始化

/**
  * @brief		单总线初始化
  * @parm		无
  * @retval		从机响应  0表示响应,1表示无响应
  */
unsigned char OneWire_Init()
{
	unsigned char Ack = 1, i = 0;
	OneWire_DQ = 1;			//确保从高拉低
	OneWire_DQ = 0;			//主机拉低总线至少480us
	i = 227;while (--i);	//延迟490us左右
	OneWire_DQ = 1;			//释放总线
	i = 18;while (--i);		//等待45us
	Ack = OneWire_DQ;		//获取从机响应
	i = 227;while (--i);	//延迟490us左右
	return Ack;
}

发送数据

/**
  * @brief		发送一位数据
  * @parm		Bit:发送的数据位
  * @retval		无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i = 0;
	OneWire_DQ = 0;			//主机拉低总线
	i = 4;while (--i);		//延迟10us左右
	OneWire_DQ = Bit;		//如果Bit为1,表示释放总线,为0则继续拉低
	i = 25;while (--i);		//延迟50us左右
	OneWire_DQ = 1;
}

/**
  * @brief		发送一位数据
  * @parm		Bit:发送的数据位
  * @retval		无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i = 0;
	OneWire_DQ = 0;			//主机拉低总线
	i = 4;while (--i);		//延迟10us左右
	OneWire_DQ = Bit;		//如果Bit为1,表示释放总线,为0则继续拉低
	i = 25;while (--i);		//延迟50us左右
	OneWire_DQ = 1;
}

接收数据

/**
  * @brief		接收一位数据
  * @parm		无
  * @retval		接收的数据 范围:0/1
  */
unsigned char OneWire_ReceiveBit()
{
	unsigned char i, Bit;
	OneWire_DQ = 0;			//主机拉低总线
	i = 2;while (--i);		//等待5us左右
	OneWire_DQ = 1;			//主机释放总线
	i = 2;while (--i);		//等待5us左右
	Bit = OneWire_DQ;		//接收数据
	i = 25;while (--i);		//延迟50us左右
	return Bit;
}

/**
  * @brief		单总线接收字节数据(低位在前)
  * @parm		无
  * @retval		接收的数据
  */
unsigned char OneWire_ReceiveByte()
{
	unsigned char i, Byte = 0;
	for(i = 0; i < 8; ++i)
		if(OneWire_ReceiveBit())
			Byte |= (0x01 << i);
	return Byte;
}

注意!!!:因为单总线通信其中的时延较短且较严格,如果被中断打断,会导致传输数据错误。可以在每个时序结构前关闭中断EA = 0,时序结束后再打开中断EA = 1


再封装 DS18B20的操作

DS18B20.c

温度转换

/**
  * @brief		温度转化一次
  * @parm		无
  * @retval		无
  */
void DS18B20_ConventT()
{
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);	//跳过ROM
	OneWire_SendByte(DS18B20_CONVENT_T);	//温度转化
}

读取温度

float DS18B20_ReadT()
{
	unsigned char HTemp, LTemp;
	int Temp = 0;
	float T;
	OneWire_Init();
	OneWire_SendByte(DS18B20_SKIP_ROM);			//跳过ROM
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);	//读存储器
	LTemp = OneWire_ReceiveByte();				//低位
	HTemp = OneWire_ReceiveByte();				//高位
	Temp = (HTemp << 8) | LTemp;				//HTemp左移8为拼接在LTemp前
	T = Temp / 16.0;							//Temp右移4位
	return T;
}

主程序——读取温度并显示在 LCD1602

#include <REGX52.h>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"

float Temp;

void main()
{
	
	DS18B20_ConventT();
	Delayms(1000);
	LCD_Init();
	LCD_ShowString(1, 1, "Temperature:");
    while(1)
    {
		DS18B20_ConventT();
        Temp = DS18B20_ReadT();
		if(Temp < 0)
		{
			LCD_ShowChar(2, 1, '-');
			Temp = -Temp;
		}
		else
			LCD_ShowChar(2, 1, '+');
		LCD_ShowNum(2, 2, Temp, 3);
		LCD_ShowChar(2, 5, '.');
		LCD_ShowNum(2, 6, (unsigned long)(Temp * 10000) % 10000, 4);
    }
}

完整项目链接:【51单片机】DS18B20温度显示


以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐