零基础STM32单片机编程入门(十四) DS18B20温度传感器模块实战含源码

文章目录

    • 一.概要
    • 二.DS18B20主要性能参数
    • 三.DS18B20温度传感器内部框图
    • 四.DS18B20模块原理图
    • 五.DS18B20模块跟单片机板子接线和通讯时序
      • 1.单片机跟DS18B20连接示意图
      • 2.单片机跟DS18B20通讯流程与时序
      • 3.通讯流程中的9个数据字节内容格式
      • 4.温度数据寄存器LSB/MSB格式
    • 六.STM32单片机DS18B20温度传感器实验
    • 七.CubeMX工程源代码下载
    • 八.小结

一.概要

DS18B20是一款常用的高精度的单总线数字温度测量芯片,具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。
在这里插入图片描述

二.DS18B20主要性能参数

IC输出型:数字式
感应精度范围:± 0.5°C
温度检测范围:-55°C 到 +125°C
电源电流:1mA
电源电压范围:3V 到 5.5V
分辨率:12bit
封装类型:TO-92
针脚数:3
引脚定义:
DQ为数字信号输入/输出端
GND为电源地
VCC为外接供电电源输入端,电源供电 3.0~5.5V

在这里插入图片描述

三.DS18B20温度传感器内部框图

64位ROM存储了器件的唯一序列码。
暂存器包含了两个字节的温度寄存器,存储来自于温度传感器的数字输出。另外,暂存器提供了一高一低两个报警触发阈值寄存器(TH和TL)。配置寄存器允许用户设定温度数字转换的分辨率为9,10,11或12位。2个字节的用户可编程E2PROM是非易失性存储,器件掉电时数据不会失去。
DS18B20 使用单总线协议,总线通讯通过一根控制信号线实现。控制线需要一个弱上拉电阻这样所有的器件都通过DS18B20 的DQ引脚连接到总线上。在这个总线系统中,单片机(主机)通过每个器件的唯一64位编码识别并寻址总线上的器件。因为每个器件都有唯一的编码,实际上挂在总线上并可以被寻址的设备数量是无限的。
在这里插入图片描述

四.DS18B20模块原理图

在这里插入图片描述

五.DS18B20模块跟单片机板子接线和通讯时序

1.单片机跟DS18B20连接示意图

在这里插入图片描述

2.单片机跟DS18B20通讯流程与时序

在这里插入图片描述

单片机发复位指令及DS18B20发存在响应时序
在这里插入图片描述
单片机读写数据位时序
在这里插入图片描述

3.通讯流程中的9个数据字节内容格式

在这里插入图片描述

4.温度数据寄存器LSB/MSB格式

在这里插入图片描述

比如温度值是125度,按照上述格式存储,那LSB字节就是0xD0,MSB字节是0x07。
在这里插入图片描述

六.STM32单片机DS18B20温度传感器实验

硬件准备:

STLINK接STM32F103C8T6小系统板,STLINK接电脑USB口。

板子与OLED用杜邦线连接:
板子G----液晶GND
板子3.3–液晶VCC
板子B10—液晶SCL
板子B11—液晶SDA

用杜邦线把模块与开发板相连:
板子3.3----模块VCC
板子A0-----模块DQ
板子G------模块GND

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚
在这里插入图片描述
配置系统主频
在这里插入图片描述
配置PA0为输入,因为模块内部有上拉电阻,所以不需要配上拉
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加OLED驱动文件
在这里插入图片描述

添加温度传感器相关代码
在这里插入图片描述
在这里插入图片描述

主要代码

typedef unsigned char u8;
typedef unsigned long u32;
void Init18b20 (void);
void WriteByte (unsigned char wr);  //单字节写入
void read_bytes (unsigned char j);  //单字节读取
unsigned char Temp_CRC (unsigned char j);//计算CRC
void GemTemp (void);//获取温度
void Config18b20 (void);//配置18B20
void ReadID (void);//读取ID
void TemperatuerResult(void);
void SystemClock_Config(void);
unsigned long Count;
//等待us级
void Delay_us(unsigned long i)
{unsigned long j;for(;i>0;i--){for(j=12;j>0;j--);}
}
unsigned char  flag;
unsigned int   Temperature;//温度
unsigned char  temp_buff[9]; //存储读取的字节,read scratchpad为9字节,read rom ID为8字节
unsigned char  id_buff[8];
unsigned char  *p;
unsigned char  crc_data;//CRC表格
const unsigned char  CrcTable [256]={
0,  94, 188,  226,  97,  63,  221,  131,  194,  156,  126,  32,  163,  253,  31,  65,
157,  195,  33,  127,  252,  162,  64,  30,  95,  1,  227,  189,  62,  96,  130,  220,
35,  125,  159,  193,  66,  28,  254,  160,  225,  191,  93,  3,  128,  222,  60,  98,
190,  224,  2,  92,  223,  129,  99,  61,  124,  34,  192,  158,  29,  67,  161,  255,
70,  24,  250,  164,  39,  121,  155,  197,  132,  218,  56,  102,  229,  187,  89,  7,
219,  133, 103,  57,  186,  228,  6,  88,  25,  71,  165,  251,  120,  38,  196,  154,
101,  59, 217,  135,  4,  90,  184,  230,  167,  249,  27,  69,  198,  152,  122,  36,
248,  166, 68,  26,  153,  199,  37,  123,  58,  100,  134,  216,  91,  5,  231,  185,
140,  210, 48,  110,  237,  179,  81,  15,  78,  16,  242,  172,  47,  113,  147,  205,
17,  79,  173,  243,  112,  46,  204,  146,  211,  141,  111,  49,  178,  236,  14,  80,
175,  241, 19,  77,  206,  144,  114,  44,  109,  51,  209,  143,  12,  82,  176,  238,
50,  108,  142,  208,  83,  13,  239,  177,  240,  174,  76,  18,  145,  207,  45,  115,
202,  148, 118,  40,  171,  245,  23,  73,  8,  86,  180,  234,  105,  55,  213, 139,
87,  9,  235,  181,  54,  104,  138,  212,  149,  203,  41,  119,  244,  170,  72,  22,
233,  183,  85,  11,  136,  214,  52,  106,  43,  117,  151,  201,  74,  20,  246,  168,
116,  42,  200,  150,  21,  75,  169,  247,  182,  232,  10,  84,  215,  137,  107,  53}; /************************************************************
*Function:18B20初始化
*parameter:
*Return:
*Modify:
*************************************************************/
void Init18b20 (void)
{HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_SET);Delay_us(2); //延时2微秒HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);Delay_us(490);   //delay 530 uS//80HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);Delay_us(100);   //delay 100 uS//14if(HAL_GPIO_ReadPin(GPIOA ,GPIO_PIN_0)== 0)flag = 1;   //detect 1820 success!elseflag = 0;    //detect 1820 fail!Delay_us(480);        //延时480微秒HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_SET);
}/************************************************************
*Function:向18B20写入一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
void WriteByte (unsigned char  wr)  //单字节写入
{unsigned char  i;for (i=0;i<8;i++){HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);Delay_us(2);if(wr&0x01)	 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_SET);else   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);Delay_us(45);   //delay 45 uS //5HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_SET);wr >>= 1;}
}/************************************************************
*Function:读18B20的一个字节
*parameter:
*Return:
*Modify:
*************************************************************/
unsigned char ReadByte (void)     //读取单字节
{unsigned char  i,u=0;for(i=0;i<8;i++){		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_RESET);Delay_us (2);u >>= 1;HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0,GPIO_PIN_SET);Delay_us (4);if(HAL_GPIO_ReadPin(GPIOA , GPIO_PIN_0) == 1)u |= 0x80;Delay_us (65);}return(u);
}/************************************************************
*Function:读18B20
*parameter:
*Return:
*Modify:
*************************************************************/
void read_bytes (unsigned char  j)
{unsigned char  i;for(i=0;i<j;i++){*p = ReadByte();p++;}
}/************************************************************
*Function:CRC校验
*parameter:
*Return:
*Modify:
*************************************************************/
unsigned char Temp_CRC (unsigned char j)
{unsigned char  i,crc_data=0;for(i=0;i<j;i++)  //查表校验crc_data = CrcTable[crc_data^temp_buff[i]];return (crc_data);
}/************************************************************
*Function:读取温度
*parameter:
*Return:
*Modify:
*************************************************************/
void GemTemp (void)
{read_bytes (9);if (Temp_CRC(9)==0) //校验正确{Temperature = temp_buff[1]*0x100 + temp_buff[0];Temperature /= 16;Delay_us(10);}
}/************************************************************
*Function:内部配置
*parameter:
*Return:
*Modify:
*************************************************************/
void Config18b20 (void)  //重新配置报警限定值和分辨率
{Init18b20();WriteByte(0xcc);  //skip romWriteByte(0x4e);  //write scratchpadWriteByte(0x19);  //上限WriteByte(0x1a);  //下限WriteByte(0x7f);     //set 12 bit (0.125)Init18b20();WriteByte(0xcc);  //skip romWriteByte(0x48);  //保存设定值Init18b20();WriteByte(0xcc);  //skip romWriteByte(0xb8);  //回调设定值
}/************************************************************
*Function:读18B20ID
*parameter:
*Return:
*Modify:
*************************************************************/
void ReadID (void)//读取器件 id
{Init18b20();WriteByte(0x33);  //read romread_bytes(8);
}/************************************************************
*Function:18B20读温度流程
*parameter:
*Return:
*Modify:
*************************************************************/
void TemperatuerResult(void)
{p = id_buff;ReadID();Config18b20();Init18b20 ();HAL_Delay(20);WriteByte(0xcc);   //skip romWriteByte(0x44);   //Temperature convertInit18b20 ();HAL_Delay(20);WriteByte(0xcc);   //skip romWriteByte(0xbe);   //read Temperaturep = temp_buff;GemTemp();
}void GetTemp()
{       if(Count == 2) //每隔一段时间读取温度{  Count=0;TemperatuerResult();}Count++;}int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//8M外部晶振,72M主频/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */OLED_Init();//OLED初始化  OLED_Clear();//清屏GetTemp();               //获取温度GetTemp();               //再次获取温度/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */GetTemp();               //再次获取温度OLED_Clear();            //OLED清屏  OLED_ShowCHinese(18,0,0);//光OLED_ShowCHinese(36,0,1);//子OLED_ShowCHinese(54,0,2);//物OLED_ShowCHinese(72,0,3);//联OLED_ShowCHinese(90,0,4);//网OLED_ShowString(6,3,"DS18B20 Test");OLED_ShowString(0,6,"Temperature:");  OLED_ShowNum(100,6,Temperature,3,16);//显示温度	   HAL_Delay(1000);//等待1S}/* USER CODE END 3 */
}

七.CubeMX工程源代码下载

链接:https://pan.baidu.com/s/1XQyG-EprZrgUbiQpUxmQug
提取码:yk9n
如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

八.小结

DS18B20数字式温度传感器,与传统的热敏电阻有所不同的是,使用集成芯片,采用单总线技术,其能够有效的减小外界的干扰,提高测量的精度。同时,它可以直接将被测温度转化成串行数字信号供单片机处理,接口简单, 使数据传输和处理简单化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HarmonyOS】鸿蒙中如何获取用户相册图片?photoAccessHelper.PhotoViewPicker

【HarmonyOS】鸿蒙中如何获取用户相册图片&#xff1f;photoAccessHelper.PhotoViewPicker 前言 有同学私聊我说&#xff0c;之前的博客文章提到的没有HarmonyOS白名单帐号&#xff0c;如何在OpenHarmony Gitee开发仓里学习API接口。需要注意一个点&#xff0c;默认看到的文档…

图、图的遍历、最小生成树、最短路径

0、图的概念 **图:**是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 顶点集合V {x|x属于某个数据对象集}是有穷非空集合&#xff1b;边的集合E {(x,y)|x,y属于V}或者E {|x,y属于V && Path(x, y)}是顶…

浅学三次握手

数据要完成传输&#xff0c;必须要建立连接。由于建立TCP连接的过程需要来回3次&#xff0c;所以&#xff0c;将这个过程形象的叫做三次握手。 结合上面的图来看更清楚。 先说三次握手吧&#xff0c;连接是后续数据传输的基础。就像我们打电话一样&#xff0c;必须保证我和对方…

在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何实现数据的实时监控和性能瓶颈的快速定位一、数据实时监控的重要性二、PostgreSQ…

shell,重定向与管道符号

文章目录 一&#xff0c;什么是shell二&#xff0c;shell脚本和作用1. shell脚本2. 作用 三&#xff0c;shell脚本的构成内容四&#xff0c;创建和运行Shell脚本五&#xff0c;重定向与管道操作1. 交互式硬件设备2. 重定向操作概览表3. 管道操作 一&#xff0c;什么是shell sh…

Matlab 判断直线上一点

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 判断一个点是否位于一直线上有很多方法,这里使用一种很有趣的坐标:Plucker线坐标,它的定义如下所示: 这个坐标有个很有趣的性质,我们可以使用Plucker坐标矢量构建一个Plucker矩阵: 则它与位于对应线上的齐次点…

排序(三)——归并排序(MergeSort)

欢迎来到繁星的CSDN&#xff0c;本期内容主要包括归并排序(MergeSort)的实现 一、归并排序的主要思路 归并排序和上一期讲的快速排序很像&#xff0c;都利用了分治的思想&#xff0c;将一整个数组拆成一个个小数组&#xff0c;排序完毕后进行再排序&#xff0c;直到整个数组排序…

文章管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;作者管理&#xff0c;文章管理&#xff0c;文章分类管理&#xff0c;论坛&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;文章&#xff0c;论坛&#xff0c;我的 开发系统…

代码随想录算法训练营第五十四天|99.岛屿数量 深搜、广搜、100.岛屿的最大面积

99.岛屿数量 题目链接&#xff1a;99.岛屿数量 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 深搜 思路&#xff1a; 遍历网格&#xff0c;发现岛屿&#xff1a;我们需要遍历整个二维网格&#xff0c;检查每一个位置上的元素。如果在遍历过程中遇到陆地&#xff08;…

计网(1.1~1.4)

1.1计算机网络在信息时代的作用 21世纪的重要特征数字化、网络化和信息化 有三类网络&#xff1a;电信网络、有线电视网络和计算机网络 互联网两个重要基本特点&#xff0c;即连通性和共享 1.2因特网概述 &#xff08;1&#xff09;网络、互联网和互连网 网络:由若干结点和连接…

企业全历史行为数据 让你对竞争对手的一切清清楚楚

关于商业竞争&#xff0c;在刚进入信息时代的那些年&#xff0c;人们说“现代商战就是信息战”&#xff0c;强调用非对称的或者更快获得的信息来赢得竞争&#xff1b;近些年进入大数据时代&#xff0c;人们又说“得数据者得天下”&#xff0c;发现“数据算法”有很多妙用&#…

2024 Q1:AVP时代下全球XR头显市场动态与展望

随着苹果Vision Pro&#xff08;AVP&#xff09;的发布&#xff0c;空间计算时代正式拉开序幕&#xff0c;全球扩展现实&#xff08;XR&#xff09;产业迎来新的发展机遇与挑战。尽管苹果的加入激发了市场活力&#xff0c;但2024年第一季度的XR头显市场却呈现出复杂多变的格局&…

压缩视频的最佳方法,视频压縮大小不影响画质

在数字媒体时代&#xff0c;视频已成为我们记录生活和传递信息的重要方式。但随着视频分辨率的提升和拍摄时长的增加&#xff0c;视频文件的大小也随之“膨胀”。大视频文件不仅占用大量存储空间&#xff0c;还在分享和传输过程中造成不便。如何在保证画质的前提下&#xff0c;…

《基于 LatentFactor + Redis + ES 实现动态药房分配方法》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; 近期刚转战 CSDN&#xff0c;会严格把控文章质量&#xff0c;绝不滥竽充数&#xff0c;欢迎多多交流。&am…

LabVIEW液压数据采集测试系统

液压系统是装载机的重要组成部分&#xff0c;通过液压传动和控制实现各项作业功能&#xff0c;如提升、倾斜、转向等。液压系统的性能直接影响装载机的作业效率和稳定性。为了保证装载机液压系统的正常运行和优化设计&#xff0c;需要对其进行数据采集和测试。本文介绍了一套基…

vue学习day09-自定义指令、插槽

29、自定义指令 &#xff08;1&#xff09;概念&#xff1a;自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外的功能。 &#xff08;2&#xff09;分类&#xff1a; 1&#xff09;全局注册 2&#xff09;局部注册 3&#xff09;示例&#xff1a; 让表…

gorm多表联合查询 Joins方法 LEFT JOIN , RIGHT JOIN , INNER JOIN, FULL JOIN 使用总结

gorm中多表联合查询&#xff0c;我们可以使用Joins来完成&#xff0c;这个Joins方法很灵活&#xff0c;我们可以非常方便的多多表进行联合查询&#xff0c; 我们先来看看这个方法的官方定义和使用示例&#xff1a; Joins方法定义和使用示例 当然我们这里要说的使用方式是官方示…

CUDA编程 - clock 学习记录

clock 学习记录 一、完整代码二、核函数流程三、main 函数流程四、学习总结&#xff08;共享内存的声明和使用&#xff09;&#xff1a;4.1、例子4.2、数据从全局内存复制到共享内存&#xff1a; 该程序利用CUDA并行计算能力&#xff0c;执行归约操作以找到每个块内的最小值&am…

Spark项目通用开发框架

文章目录 1. 大数据项目结构2. 类说明2.1 公共接口类2.2 TaskNameEnum指定每个任务的名称2.3 TaskRunner中编写任务的业务逻辑 3. 任务执行脚本 每个公司内部都有一套自己的架子&#xff0c;一般新人来了就直接在已有的架子上开发业务。 以下仅仅作为记录下自己使用的架子&…

16_网络IPC1-套接字描述符

用户数据报协议(UDP) 与 传输控制协议(TCP) 文件描述符函数使用套接字的行为 禁止套接字IO