DS18B20温度传感器与单总线通信协议详解
创作时间:
作者:
@小白创作中心
DS18B20温度传感器与单总线通信协议详解
引用
CSDN
1.
https://blog.csdn.net/qq_67808371/article/details/134484849
DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点。其测温范围为-55°C 到 +125°C,通信接口采用1-Wire(单总线)。
引脚及应用电路
- VCC:电源(3.0V ---- 5.0V)
- GND:电源地
- DQ:单总线接口(单片机的引脚)
内部结构框图
- 64-BIT ROM:作为器件地址,用于总线通信的寻址
- SCRATCHPAD(暂存器):用于总线的数据交互
- EEPROM:用于保存温度触发阈值和配置参数
存储器结构
单总线介绍
- 单总线(1-Wire BUS)是由Dallas公司开发的一种通用数据总线
- 一根通信线:DQ
- 异步(没有时钟线)、半双工(接收和发送不能同时进行)
- 单总线只需要一根通信线即可实现数据的双向传输,当采用寄生供电时,还可以省去设备的VDD线路,此时,供电加通信只需要DQ和GND两根线
单总线电路规范
- 设备的DQ均要配置成开漏输出模式
- DQ添加一个上拉电阻,阻值一般为4.7KΩ左右
- 若此总线的从机采取寄生供电,则主机还应配一个强上拉输出电路
单总线时序结构
初始化
主机将总线拉低至少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;//返回温度
}
热门推荐
石榴盆景的养殖方法和注意事项
送外卖怎么搞项目管理的
那些藏在行李箱里的家乡味道
探戈:联结历史与现实的文化符号
探戈:联结历史与现实的文化符号
中美日出生人口差距断崖:美国361万,日本72万,中国令人意外
光明日报:云南采菌子走红,带来对研学游的思考
如何预防冠心病?从生活细节做起,守护心脏健康
案件字号是什么?如何正确解读案件编号?
高温下,这份热射病“预防指南”请收好!
低空经济火爆:无人机培训机构工作开展详解
掌握投篮技巧:让你的兄弟从新手变成篮球高手
走进浙江楠溪江,领略千年古韵与现代风情
从零开始学习HTTP协议:理解HTTP重定向和请求方法
装修过程中必须警惕的7类假货,教你如何辨别真假!
电脑重启快捷键大全:通用、系统专属及应急重启方法
郭图:东汉末年的争议谋士
如何正确填写随附单以确保顺利通关
八珍丸和八珍益母丸区别在哪?选谁调理好
退休后,遇事顶级的处理方式,就这三句话
枷锁与突破:历史视角下的个人与社会关系研究
视频格式不兼容怎么办?三种方法解决不兼容问题!
三国志战略版黄忠阵容战法介绍 战法搭配推荐
王者荣耀黄忠攻略:定位与技能连招详解,助你提升胜率!
雪蛤在传统医学中的应用及其现代科学验证
雪蛤最经典的七种的做法与吃法 雪蛤怎么吃
什么是“好房子”?总理提出四项标准
5月乘用车市场走势:燃油车持续疲软 新能源车出口罕见下滑4%
威尔士为什么可以单独参加世界杯?
TMR技术的发展及其应用技术的介绍