news 2026/1/22 13:04:21

C51_DS18B20数字温度传感器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C51_DS18B20数字温度传感器

文章目录

  • 一、DS18B20芯片
    • 1、引脚
    • 2、应用电路
    • 3、内部结构
      • 1)、64位激光ROM:
      • 2)、配置寄存器:
      • 3)、高速暂存器RAM:
  • 二、单总线
  • 三、DS18B20
    • 1、操作流程
    • 2、操作命令
      • 1)、初始化
      • 2)、ROM指令:Read ROM(读ROM)[33h]
      • 3)、ROM指令:Match ROM(“符合”ROM)[55h]
      • 4)、ROM指令:Skip ROM(“跳过”ROM)[CCh]
      • 5)、ROM指令:Alarm Search(告警搜索)[ECh]
      • 6)、读暂存存储器(Read Scratchpad) [BEh]
      • 7)、写暂存存储器(Write Scratchpad) [4Eh]
      • 8)、复制暂存存储器(Copy Scratchpad) [48h]
      • 9)、温度变换(Convert T) [44h]
      • 10)、重新调出E2(Recall E2) [B8h]
      • 11)、读电源(Read PowerSupply) [B4h]
    • 3、数据帧
    • 4、软件思路
      • 1)、复位
      • 2)、检测DS18B20是否存在
      • 3)、读取温度
      • 4)、温度转换
  • 四、代码实例
    • 1、ds18b20
    • 2、ds18b20
    • 3、mian.c

一、DS18B20芯片

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

1、引脚

2、应用电路

3、内部结构

1)、64位激光ROM:

ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址序列号。
64 位光刻 ROM 的排列是:
开始 8 位(28H)是产品类型标号,接着的48 位是该 DS18B20 自身的序列号,最后 8 位是前面 56 位的循环冗余校验码。

光刻 ROM 的作用是使每一个 DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。

2)、配置寄存器:

是配置不同的位数来确定温度和数字的转化.
配置寄存器结构:

低5位:
低5位一直是“1”
TM:
TM是测试模式位,用于设置DS18B20在工作模式还是测试模式。
R1和R0:
用来设置DS18B20的精度(分辨率),可以设置为9,10,11,12位,对应的分辨率温度是0.5℃,0.25℃,0.125℃和 0.0625℃。

3)、高速暂存器RAM:

初始状态下默认的精度是 12 位,即 R0=1、R1=1。
高速暂存存储器由 9 个字节组成,其分配如下:

当温度转换命令(44H)发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第 0 和第 1 个字节。

存储的两个字节,高字节的前 5 位是符号位S,单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
如果SSSSS为“0”,为温度不小于0,将测得数值乘以0.0625即可得到实际温度。
如果SSSSS为“1”,为温度小于0,将测得数值取反加1再乘以0.0625即可得到实际温度。

二、单总线

参考《通讯协议–OneWire单总线》

三、DS18B20

1、操作流程

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

2、操作命令

1)、初始化

单线总线上的所有处理沟从初始化序列开始。
初始化序列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。

2)、ROM指令:Read ROM(读ROM)[33h]

此命令允许总线主机读DS1820的8位产品系列编码,唯一的48位序列号,以及8位的CRC。
此命令只能在总线上仅有一个DS1820的情况下可以使用。

3)、ROM指令:Match ROM(“符合”ROM)[55h]

“符合”ROM命令。
后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS1820寻址。
只有与 64位ROM序列严格相符的DS1820才能对后继的存贮器操作命令作出响应。

4)、ROM指令:Skip ROM(“跳过”ROM)[CCh]

在单点总线系统中,此命令通过允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。

5)、ROM指令:Alarm Search(告警搜索)[ECh]

此命令的流程与搜索ROM命令相同。
但是,仅在最近一次温度测量出现告警的情况下,DS1820才对此命令作出响应。
告警的条件定义为温度高于TH或低于L。
只要DS1820一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值,或者改变TH或T的设置使得测量值再一次位于允许的范围之内。
贮存在EEPROM内的触发器值用于告警。

6)、读暂存存储器(Read Scratchpad) [BEh]

此命令读暂存存储器的内容。读开始于字节0,并继续经过暂存存储器,直至第九个字节(字节8,CRC)被读出为止。
如果不是所有位置均可读,那么主机可以在任何时候发出一复位以中止读操作。

7)、写暂存存储器(Write Scratchpad) [4Eh]

此命令写至DS1820的暂存存储器,以地址2开始。
接着写的两个字节将被保存在暂存存储器地址2和3之间中。
发出一个复位便可在任何处终止写操作。

8)、复制暂存存储器(Copy Scratchpad) [48h]

此命令把暂存存储器复制入DS1820的E存储器,把温度触发器字节存贮入非易失性存储器。
如果总线主机在此命令之后发出读时间片,那么只要DS1820正忙于把暂存存储器复制入E,它就会在总线上输出“0”:当复制过程完成之后,它将反回“1”。
如果由寄生电源供电,总线主机在发出此命令之后必须能立即强制上拉至少10ms。

9)、温度变换(Convert T) [44h]

此命令开始温度变换。不需要另外的数据。
温度变换将被执行,接着DS1820便保持在空闲状态。
如果总线主机在此命令之后发出读时间片,那么只要DS1820正忙于进行温度变换,它将在总线上输出“0”;当温度变换完成时,它便返回“1”。
如果由寄生电源供电,那么总线主机在发出此命令之后必须立即强制上拉至少2秒。

10)、重新调出E2(Recall E2) [B8h]

此命令把贮存在E中温度触发器的值重新调至暂存存储器,这种重新调出的操作在对DS1820上电时也自动发生,因此只要器件一接电,暂存存储器内就有有效的数据可供使用。
在此命令发出之后,对于所发出的第一个读数据时间片,器件都将输出其忙的标志“0”=忙,“1”=准备就绪。

11)、读电源(Read PowerSupply) [B4h]

对于在此命令送至DS1820之后所发出的第一读出数据的时间片,器件都会给出其电源方式的信号:“0”=寄生电源供电,“1”=外部电源供电。

3、数据帧

温度变换:
初始化→跳过ROM →开始温度变换。

温度读取:
初始化→跳过ROM →读暂存器→连续的读操作。

4、软件思路

1)、复位

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

2)、检测DS18B20是否存在

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

3)、读取温度

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

4)、温度转换

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

四、代码实例

1、ds18b20

#ifndef_ds18b20_H#define_ds18b20_H#include"public.h"//管脚定义sbit DS18B20_PORT=P3^7;//DS18B20数据口定义//函数声明u8ds18b20_init(void);floatds18b20_read_temperture(void);#endif

2、ds18b20

#include"ds18b20.h"#include"intrins.h"/******************************************************************************* * 函 数 名 : ds18b20_reset * 函数功能 : 复位DS18B20 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/voidds18b20_reset(void){DS18B20_PORT=0;//拉低DQdelay_10us(75);//拉低750usDS18B20_PORT=1;//DQ=1delay_10us(2);//20US}/******************************************************************************* * 函 数 名 : ds18b20_check * 函数功能 : 检测DS18B20是否存在 * 输 入 : 无 * 输 出 : 1:未检测到DS18B20的存在,0:存在 *******************************************************************************/u8ds18b20_check(void){u8 time_temp=0;while(DS18B20_PORT&&time_temp<20)//等待DQ为低电平{time_temp++;delay_10us(1);}if(time_temp>=20)return1;//如果超时则强制返回1elsetime_temp=0;while((!DS18B20_PORT)&&time_temp<20)//等待DQ为高电平{time_temp++;delay_10us(1);}if(time_temp>=20)return1;//如果超时则强制返回1return0;}/******************************************************************************* * 函 数 名 : ds18b20_read_bit * 函数功能 : 从DS18B20读取一个位 * 输 入 : 无 * 输 出 : 1/0 *******************************************************************************/u8ds18b20_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,否则为0elsedat=0;delay_10us(5);returndat;}/******************************************************************************* * 函 数 名 : ds18b20_read_byte * 函数功能 : 从DS18B20读取一个字节 * 输 入 : 无 * 输 出 : 一个字节数据 *******************************************************************************/u8ds18b20_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);}returndat;}/******************************************************************************* * 函 数 名 : ds18b20_write_byte * 函数功能 : 写一个字节到DS18B20 * 输 入 : dat:要写入的字节 * 输 出 : 无 *******************************************************************************/voidds18b20_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_();}}}/******************************************************************************* * 函 数 名 : ds18b20_start * 函数功能 : 开始温度转换 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/voidds18b20_start(void){ds18b20_reset();//复位ds18b20_check();//检查DS18B20ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0x44);//转换命令}/******************************************************************************* * 函 数 名 : ds18b20_init * 函数功能 : 初始化DS18B20的IO口 DQ 同时检测DS的存在 * 输 入 : 无 * 输 出 : 1:不存在,0:存在 *******************************************************************************/u8ds18b20_init(void){ds18b20_reset();returnds18b20_check();}/******************************************************************************* * 函 数 名 : ds18b20_read_temperture * 函数功能 : 从ds18b20得到温度值 * 输 入 : 无 * 输 出 : 温度数据 *******************************************************************************/floatds18b20_read_temperture(void){floattemp;u8 dath=0;u8 datl=0;u16 value=0;ds18b20_start();//开始转换ds18b20_reset();//复位ds18b20_check();ds18b20_write_byte(0xcc);//SKIP ROMds18b20_write_byte(0xbe);//读存储器datl=ds18b20_read_byte();//低字节dath=ds18b20_read_byte();//高字节value=(dath<<8)+datl;//合并为16位数据if((value&0xf800)==0xf800)//判断符号位,负温度{value=(~value)+1;//数据取反再加1temp=value*(-0.0625);//乘以精度}else//正温度{temp=value*0.0625;}returntemp;}

3、mian.c

#include"public.h"#include"smg.h"#include"ds18b20.h"/******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/voidmain(){u8 i=0;inttemp_value;u8 temp_buf[5];ds18b20_init();//初始化DS18B20while(1){i++;if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间temp_value=ds18b20_read_temperture()*10;//保留温度值小数后一位if(temp_value<0)//负温度{temp_value=-temp_value;temp_buf[0]=0x40;//显示负号}elsetemp_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);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/20 10:13:10

3种快速安装readr数据读取工具的方法:从入门到精通

3种快速安装readr数据读取工具的方法&#xff1a;从入门到精通 【免费下载链接】readr 项目地址: https://gitcode.com/gh_mirrors/rea/readr readr是R语言生态系统中专门用于高效数据读取和文件解析的核心工具包&#xff0c;能够快速处理CSV、TSV等多种分隔格式的数据…

作者头像 李华
网站建设 2026/1/7 20:52:24

对比实测:传统vs自动化VMware安装,效率提升300%

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个自动化工具&#xff0c;能够批量部署VMware虚拟机并自动完成操作系统安装和基础配置。要求支持无人值守安装&#xff0c;提供与手动安装方式的详细对比报告&#xff0c;包括…

作者头像 李华
网站建设 2026/1/22 8:40:16

跨平台字体革命:PingFangSC字体包的终极解决方案

跨平台字体革命&#xff1a;PingFangSC字体包的终极解决方案 【免费下载链接】PingFangSC PingFangSC字体包文件、苹果平方字体文件&#xff0c;包含ttf和woff2格式 项目地址: https://gitcode.com/gh_mirrors/pi/PingFangSC 还在为不同设备上的字体显示差异而烦恼吗&am…

作者头像 李华
网站建设 2026/1/21 21:19:14

14 类圣诞核心 SVG 交互方案拆解(附案例 + 资源)

1. 选择类交互&#xff1a;精准匹配礼物需求 交互方案核心逻辑品牌案例关键组件 / 操作要点学习资源挤压伸长以 “选择” 为核心&#xff0c;通过挤压交互引导用户筛选礼物类型OPARTMENT《圣诞爱意》、尚美《你的礼想型》「挤压伸长」&#xff08;UGC 组件&#xff09;&#x…

作者头像 李华
网站建设 2026/1/19 4:35:12

7个技巧轻松搞定Node.js版本升级:从16.x到20.x的无痛迁移指南

7个技巧轻松搞定Node.js版本升级&#xff1a;从16.x到20.x的无痛迁移指南 【免费下载链接】PowerShell PowerShell/PowerShell: PowerShell 是由微软开发的命令行外壳程序和脚本环境&#xff0c;支持任务自动化和配置管理。它包含了丰富的.NET框架功能&#xff0c;适用于Window…

作者头像 李华
网站建设 2026/1/22 0:30:14

MCP SC-400配置避坑手册(一线专家亲授10大常见错误)

第一章&#xff1a;MCP SC-400量子安全配置实务概述在当前量子计算快速发展的背景下&#xff0c;传统加密体系面临前所未有的破解风险。MCP SC-400作为新一代量子安全通信协议配置标准&#xff0c;专为抵御量子攻击设计&#xff0c;提供前向安全性、抗量子算法支持及动态密钥协…

作者头像 李华