【STM32+HAL】DS18B20读取环境温度

一、准备工作

有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置

二、所用工具


1、芯片: STM32F407VET6

2、IDE: MDK-Keil软件

3、库文件:STM32F4xxHAL库

三、实现功能

串口打印当前温度值

四、HAL库配置

1、选择IO口连接输入输出端口DQ

2、打开串口

 

至此,HAL库配置完毕

五、Keil填写代码

1、us级延时函数
#define CPU_FREQUENCY_MHZ 168				/* CPU主频,根据实际进行修改 *//*** 此延时函数代码适用于HAL库*/
void delay_us(uint32_t delay)
{int last, curr, val;int temp;while (delay != 0){temp = delay > 900 ? 900 : delay;last = SysTick->VAL;curr = last - CPU_FREQUENCY_MHZ * temp;if (curr >= 0){do{val = SysTick->VAL;}while ((val < last) && (val >= curr));}else{curr += CPU_FREQUENCY_MHZ * 1000;do{val = SysTick->VAL;}while ((val <= last) || (val > curr));}delay -= temp;}
}

2、DS18B20.c
#include "ds18b20.h"
#include "tim.h"
#include "main.h"#define CPU_FREQUENCY_MHZ 168				/* CPU主频,根据实际进行修改 *//*** 此延时函数代码适用于HAL库*/
void delay_us(uint32_t delay)
{int last, curr, val;int temp;while (delay != 0){temp = delay > 900 ? 900 : delay;last = SysTick->VAL;curr = last - CPU_FREQUENCY_MHZ * temp;if (curr >= 0){do{val = SysTick->VAL;}while ((val < last) && (val >= curr));}else{curr += CPU_FREQUENCY_MHZ * 1000;do{val = SysTick->VAL;}while ((val <= last) || (val > curr));}delay -= temp;}
}static void DS18B20_IO_Init(void)
{/* 总线空闲为高电平 */HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, GPIO_PIN_SET);
}static void DS18B20_IO_OUT(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DS18B20_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStruct);
}static void DS18B20_IO_IN(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DS18B20_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStruct);
}static void DS18B20_DQ_OUT(int state)
{HAL_GPIO_WritePin(DS18B20_GPIO_Port, DS18B20_Pin, state ? GPIO_PIN_SET : GPIO_PIN_RESET);
}static int DS18B20_DQ_IN(void)
{return HAL_GPIO_ReadPin(DS18B20_GPIO_Port, DS18B20_Pin) == GPIO_PIN_SET ? 1 : 0;
}///
///  DS18B20驱动
///
/////复位DS18B20
void DS18B20_Rst(void)
{DS18B20_IO_OUT(); 	//SET PA0 OUTPUTDS18B20_DQ_OUT(0); 	//拉低DQdelay_us(750);    	//拉低750usDS18B20_DQ_OUT(1); 	//DQ=1delay_us(15);     	//15US
}//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
uint8_t DS18B20_Check(void)
{uint8_t retry=0;DS18B20_IO_IN();//SET PA0 INPUTwhile (DS18B20_DQ_IN()&&retry<200){retry++;delay_us(1);};if(retry>=200)return 1;else retry=0;while (!DS18B20_DQ_IN()&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;return 0;
}//从DS18B20读取一个位
//返回值:1/0
uint8_t DS18B20_Read_Bit(void) 			 // read one bit
{uint8_t data;DS18B20_IO_OUT();					//SET PA0 OUTPUTDS18B20_DQ_OUT(0);delay_us(2);DS18B20_DQ_OUT(1);DS18B20_IO_IN();					//SET PA0 INPUTdelay_us(12);if(DS18B20_DQ_IN())data=1;else data=0;delay_us(50);return data;
}//从DS18B20读取一个字节
//返回值:读到的数据
uint8_t DS18B20_Read_Byte(void)    // read one byte
{uint8_t i,j,dat;dat=0;for (i=1; i<=8; i++){j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}return dat;
}//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(uint8_t dat)
{uint8_t j;uint8_t testb;DS18B20_IO_OUT();//SET PA0 OUTPUT;for (j=1; j<=8; j++){testb=dat&0x01;dat=dat>>1;if (testb){DS18B20_DQ_OUT(0);// Write 1delay_us(2);DS18B20_DQ_OUT(1);delay_us(60);}else{DS18B20_DQ_OUT(0);// Write 0delay_us(60);DS18B20_DQ_OUT(1);delay_us(2);}}
}//开始温度转换
void DS18B20_Start(void)		// ds1820 start convert
{DS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);	// skip romDS18B20_Write_Byte(0x44);	// convert
}//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在
uint8_t DS18B20_Init(void)
{DS18B20_IO_Init();DS18B20_Rst();return DS18B20_Check();
}//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{uint8_t temp;uint8_t TL,TH;short tem;__disable_irq();    					/* 中断可能会单总线的时序从而导致读出来的温度值不正确,所以读取之前屏蔽中断 */DS18B20_Start();                    	// ds1820 start convertDS18B20_Rst();DS18B20_Check();DS18B20_Write_Byte(0xcc);				// skip romDS18B20_Write_Byte(0xbe);				// convertTL=DS18B20_Read_Byte(); 				// LSBTH=DS18B20_Read_Byte(); 				// MSBif(TH>7){TH=~TH;TL=~TL;temp=0;								//温度为负}else temp=1; 							//温度为正tem=TH; 								//获得高八位tem<<=8;tem+=TL;								//获得底八位__enable_irq();    						/* 再将全局中断打开 */tem=(float)tem*0.625;					//转换if(temp) return tem; 					//返回温度值else return -tem;
}/*
代码使用示例:int main()
{short temp;while(DS18B20_Init()){printf(" ds18b20 init failed ! \r\n");HAL_Delay(1000);}while(1){temp = DS18B20_Get_Temp();printf("当前温度:%0.2f \r\n", (float)temp / 10);HAL_Delay(1000);}
}*/

3、DS18B20.h
#ifndef DS18B20_H__
#define DS18B20_H__#include <stdint.h>uint8_t DS18B20_Init(void);			//初始化DS18B20
short DS18B20_Get_Temp(void);		//获取温度
void DS18B20_Start(void);			//开始温度转换
void DS18B20_Write_Byte(uint8_t dat);//写入一个字节
uint8_t DS18B20_Read_Byte(void);	//读出一个字节
uint8_t DS18B20_Read_Bit(void);		//读出一个位
uint8_t DS18B20_Check(void);		//检测是否存在DS18B20
void DS18B20_Rst(void);				//复位DS18B20void delay_us(uint32_t delay);#endif

六、巨人之肩

STM32 HAL库 DS18B20读取温度值 

【常用传感器】DS18B20温度传感器原理详解及例程代码

七、源码提供

资源【STM32+HAL】DS18B20读取环境温度

 

 

 

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

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

相关文章

羊毛项目(华为iPhone茅台),讲解抢购渠道与抢购注意事项

薅羊毛天花板&#xff0c;华为iPhone茅台无脑撸&#xff0c;几分钟换几百元(非脚本项目) 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

投屏协议DLNA

目录 1. 常见投屏方案 2. 什么是DLNA 3. DLNA设备分类 4&#xff0c;DLNA的架构 1. 常见投屏方案 常见的投屏方案主要有以下几种&#xff1a; DLNA DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟)。DLNA委员会已经于2017年1月5日正式解散&#xff0c;原…

Merck:mPAGE® Lux SDS-PAGE制胶系统

相对于传统SDS-PAGE制胶工艺&#xff0c;Merck公司的mPAGE Lux制胶系统是一种更快速、简单、安全的替代方法&#xff0c;可实现更具可重现性的结果。mPAGE Lux制胶系统可在90秒内完成小型凝胶固化&#xff0c;而传统方法则需要90分钟以上。该系统采用紫外线照射快速制胶工作流程…

用 node 写一个命令行工具,全局安装可用

现在&#xff0c;不管是前端项目还是 node 项目&#xff0c;一般都会用 npm 做包管理工具&#xff0c;而 package.json 是其相关的配置信息。 对 node 项目而言&#xff0c;模块导出入口文件由 package.json 的 main 字段指定&#xff0c;而如果是要安装到命令行的工具&#x…

【高阶数据结构(一)】并查集详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. 并查集…

等保2.0有哪些好处,到底要花多少钱?今天一个文章给你讲透

自从等保2.0相关标准正式发布以来&#xff0c;等级保护测评已然成为网络安全行业的热门话题&#xff0c;这意味着等保进入了一个全新的高度。 目前一些机构国家单位项目都有等保资质这一项&#xff0c;早做的客户符合这一标准&#xff0c;竞争项目就更有把握了。 第一次做完等…

数据分析的统计推断

数据分析的统计推断 前言一、提出问题二、统计归纳方法三、统计推断四、统计推断步骤如何进行统计推断统计推断的基本问题点估计区间估计总体方差已知总体方差未知 假设检验假设检验的假设显著性水平 五、检验统计量常见的检验统计量 六、检验方法七、拒绝域八、假设检验步骤九…

【JavaEE网络】从数据链路层到应用层的DNS

目录 数据链路层以太网 DNS 数据链路层 越往下与程序员越远 代表协议&#xff1a;以太网。平常用的网线也叫“以太网线”&#xff0c;平常用的交换机也叫“以太网交换机” 以太网 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含…

Day19 代码随想录打卡|字符串篇---反转字符串II

题目&#xff08;leecode T541&#xff09;&#xff1a; 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小…

基于uniapp+vue3+vite实现小程序构建Android、iOS多端项目配置详解

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

网络驱动--汽车ETNB(瑞萨)

以太网AVB (ETNB) 介绍RH850/U2A-EVA的属性&#xff0c;如编号 单元、寄存器的基址。描述了函数和寄存器 ETNB的成员。 两个单元&#xff1b;Units ▪ Fast Ethernet ETNB0 ▪ Gigabit Ethernet ETNB1 单元通道特点 For ETNB0 (Fast Ethernet) ▪ Communication interface ▪…

基于 llama2 的提示词工程案例2

优化大型语言模型&#xff08;LLMs&#xff09; 优化大型语言模型&#xff08;LLMs&#xff09;中的提示词&#xff08;prompts&#xff09;是提高模型性能和输出相关性的重要手段。以下是一些优化提示词的方向&#xff1a; 明确性&#xff1a;确保提示词清晰明确&#xff0c;…

Rust 实战thiserror+自定义错误消息体

导航 一、背景二、实践1、导入thiserror2、自定义错误消息体&#xff08;1&#xff09;创建ErrMsg.rs和创建自定义结构体&#xff08;2&#xff09;lib.rs添加ErrMsg&#xff08;3&#xff09;main函数&#xff08;4&#xff09;完整代码 一、背景 开发中遇到需要通用、能够满…

LeetCode 142.环形链表Ⅱ

题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内…

速卖通自养号测评技术策略与实战指南

速卖通自养号测评是一个涉及多个步骤和细节的过程&#xff0c;以下是一些关键步骤和注意事项&#xff1a; 1. 准备资源和环境&#xff1a; 测评养号系统&#xff1a;确保账号的权重稳定运营与账号便捷的管理。 海外纯净IP资源&#xff1a;为账号提供稳定的网络环境&#x…

AI新突破:多标签预测技术助力语言模型提速3倍

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;多标签预测的新视角 在人工智能领域&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;预测模型的训练方法一直在…

地下管线管网三维参数化建模软件MagicPipe3D V3.5

经纬管网建模系统MagicPipe3D&#xff08;www.magic3d.net&#xff09;自主安全可控&#xff0c;本地离线参数化构建三维管网模型&#xff08;管道、接头、附属物等&#xff09;&#xff0c;输出标准3DTiles、Obj等格式&#xff0c;支持Cesium、Unreal、Unity等引擎可视化查询分…

【mysql】深入探索mysql中的各种约束条件

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Java | Spring框架 | Bean的装配之XML配置

Spring | Bean的装配 之XML配置 在Spring框架中&#xff0c;Bean的装配是指将Bean定义和配置信息加载到Spring容器中&#xff0c;以便容器能够管理这些Bean。 Spring支持多种装配方式&#xff0c;其中XML配置是传统但依然有效的方式。 一、 使用XML配置文件定义Bean XML配置…