1-Wire(单总线)通信协议详解------DS18B20温度传感器驱动-------附代码详解

DS18B20介绍

1.DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点
2.测温范围:-55°C 到 +125°C
3.通信接口:1-Wire(单总线
4.其它特征:可形成总线结构、内置温度报警功能、可寄生供电

引脚及应用电路

在这里插入图片描述
VCC:电源(3.0V ---- 5.0V)
GND:电源地
DQ:单总线接口(单片机的引脚)

内部结构框图

在这里插入图片描述
64-BIT ROM:作为器件地址,用于总线通信的寻址
SCRATCHPAD(暂存器):用于总线的数据交互
EEPROM:用于保存温度触发阈值和配置参数

存储器结构

在这里插入图片描述

单总线介绍

1.单总线(1-Wire BUS)是由Dallas公司开发的一种通用数据总线
2.一根通信线:DQ
3.异步(没有时钟线)、半双工(接收和发送不能同时进行)
4.单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供电时,还可以省去设备的VDD线路,此时,供电加通信只需要DQ和GND两根线

单总线电路规范

1.设备的DQ均要配置成开漏输出模式
2.DQ添加一个上拉电阻,阻值一般为4.7KΩ左右
3.若此总线的从机采取寄生供电,则主机还应配一个强上拉输出电路
在这里插入图片描述
在这里插入图片描述

单总线时序结构

初始化主机总线拉低至少480us,然后释放总线等待15~ 60us后,存在的从机拉低总线60~240us响应主机,之后从机将释放总线
在这里插入图片描述

单总线时序结构

发送一位主机将总线拉低60~120us,然后释放总线,表示发送0;主机将总线拉低1 ~15us,然后释放总线,表示发送1从机将在总线拉低30us后(典型值)读取电平,整个时间片大于60us
在这里插入图片描述

单总线时序结构

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

单总线时序结构

发送一个字节:连续调用8次发送一位的时序,依次发送一个字节的8位(低位在前
在这里插入图片描述
接收一个字节:连续调用8次接收一位的时序,依次接收一个字节的8位(低位在前
在这里插入图片描述

DS18B20操作流程

初始化从机复位主机判断从机是否响应
ROM操作ROM指令+本指令需要的读写操作
功能操作功能指令+本指令需要的读写操作
在这里插入图片描述

DS18B20数据帧

温度变换初始化跳过ROM开始温度变换
在这里插入图片描述
温度读取初始化跳过ROM读暂存器连续的读操作
在这里插入图片描述

温度存储格式

在这里插入图片描述
在这里插入图片描述

单总线代码

#include <REGX52.H>

//引脚定义
sbit OneWire_DQ=P3^7;

/**
  * @brief  单总线初始化
  * @param  无
  * @retval 从机响应位,0为响应,1为未响应
  */
unsigned char OneWire_Init(void)
{
	unsigned char i;
	unsigned char AckBit;
	OneWire_DQ=1;	//释放总线(使得总线位于空闲状态)
	OneWire_DQ=0;	//拉低总线(至少480us)
	i = 247;while (--i);		//Delay 500us
	OneWire_DQ=1;	//释放总线(等待15~ 60us)
	i = 32;while (--i);			//Delay 70us
	AckBit=OneWire_DQ;//读取总线(从机响应会---拉低总线60~240us)
	i = 247;while (--i);		//Delay 500us
	return AckBit;
}

/**
  * @brief  单总线发送一位
  * @param  Bit 要发送的位
  * @retval 无
  */
void OneWire_SendBit(unsigned char Bit)
{
	unsigned char i;
	OneWire_DQ=0;	//拉低总线
	i = 4;while (--i);			//Delay 10us
	OneWire_DQ=Bit;//继续拉低为0,则为低电平,(否则为高电平(即拉低时间10us))
	i = 24;while (--i);			//Delay 50us
	OneWire_DQ=1;//释放总线
}

/**
  * @brief  单总线接收一位
  * @param  无
  * @retval 读取的位
  */
unsigned char OneWire_ReceiveBit(void)
{
	unsigned char i;
	unsigned char Bit;
	OneWire_DQ=0;	//拉低总线(1~15us)
	i = 2;while (--i);			//Delay 5us
	OneWire_DQ=1;	//释放总线
	i = 2;while (--i);			//Delay 5us
	Bit=OneWire_DQ;//读取总线电平(在拉低后15us之内读取)
	i = 24;while (--i);//完整时间片(大于60us)			//Delay 50us
	return Bit;//返回读取的值
}

/**
  * @brief  单总线发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void OneWire_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_SendBit(Byte&(0x01<<i));//循环8次(1字节)
	}
}

/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
  */
unsigned char OneWire_ReceiveByte(void)
{
	unsigned char i;
	unsigned char Byte=0x00;//定义接收变量
	for(i=0;i<8;i++)
	{
		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);}//如果接收为1,1左移,相与为1,否则为默认值(0)
	}
	return Byte;//返回接收值
}

DS18B20温度读取代码

#include <REGX52.H>
#include "OneWire.h"

//DS18B20指令
#define DS18B20_SKIP_ROM			0xCC
#define DS18B20_CONVERT_T			0x44
#define DS18B20_READ_SCRATCHPAD 	0xBE

/**
  * @brief  DS18B20开始温度变换
  * @param  无
  * @retval 无
  */
void DS18B20_ConvertT(void)
{
	OneWire_Init();		//先初始化
	OneWire_SendByte(DS18B20_SKIP_ROM);//跳过指令
	OneWire_SendByte(DS18B20_CONVERT_T);//温度转换指令
}

/**
  * @brief  DS18B20读取温度
  * @param  无
  * @retval 温度数值
  */
float DS18B20_ReadT(void)
{
	unsigned char TLSB,TMSB;//定义接收变量
	int Temp;//定义计算后的真实温度
	float T;
	OneWire_Init();	//初始化
	OneWire_SendByte(DS18B20_SKIP_ROM);//跳过指令
	OneWire_SendByte(DS18B20_READ_SCRATCHPAD);//读取指令
	TLSB=OneWire_ReceiveByte();	//先读取低字节
	TMSB=OneWire_ReceiveByte();//再读取高字节
	Temp=(TMSB<<8)|TLSB;	//高字节与低字节合并为整体
	T=Temp/16.0;	//将16进制转换为10进制
	return T;//返回温度
}

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

领悟电子界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值