STM32F407开发板DS18B20应用案例

news2024/12/26 10:35:17

【1】DS18B20介绍

DS18B20是一种数字温度传感器,由Maxim Integrated公司生产。它采用单总线接口,能够在广泛的温度范围内测量温度,并通过数字方式输出温度值,具有较高的精度和稳定性。

以下是DS18B20温度传感器的主要特点和操作时序:

(1)特点:

  • 单总线接口:DS18B20使用单一的数据线进行通信,简化了连接和控制。
  • 高精度测量:具有12位的温度分辨率,可测量范围为-55°C至+125°C。
  • 数字输出:温度值以二进制形式传输,便于处理和解析。
  • 内部存储:传感器可内部存储温度数据和配置信息。
  • 低功耗:在非活动状态下,传感器可以进入睡眠模式以降低功耗消耗。

(2)操作时序: DS18B20的操作时序包括复位、写入指令、读取温度等过程。下面是DS18B20的基本操作时序:

a. 复位:

  • 主机拉低数据线,持续至少480μs作为复位信号。
  • 主机释放数据线,等待15μs以上。

b. 发送指令:

  • 主机发出写入指令(如跳过ROM指令或匹配ROM指令)。
  • 指令由主机通过数据线逐位发送,每位的有效时间为60μs。

c. 读取温度:

  • 主机发出读取温度指令。
  • 传感器将温度数据以序列的形式发送给主机,每位的有效时间为60μs。
  • 主机在接收到所有数据后,需提供适当的延迟时间进行解析和处理。

【2】硬件连线说明

STM32F407开发板DS18B20应用案例

开发板硬件连接:

img

img

【3】源代码

在工程中添加ds18b20.c和ds18b20.h文件。

DS18B20代码如下:

#include "ds18b20.h"

/*
函数功能:DS18b20IO口初始化
硬件连接:PG9
复用表示自动输出数据
通用表示手动输出数据
*/
void DS18B20_Init(void)
{
		/*1. 开时钟*/
	  RCC->AHB1ENR|=1<<6;//使能PORTG时钟
		
		/*2. 初始化IO模式*/
		DS18B20_OUTPUT();	
}


/*
函数功能:等待DS18B20的回应
返回1:未检测到DS18B20的存在
返回0:存在
*/
u8 DS18B20_Check(void) 	   
{   
	u8 retry=0;
	DS18B20_INPUT()   //设置DS18B20输入模式
  while(DS18B20_IN&&retry<200)
	{
		retry++;
		DelayUs(1);
	};	 
	if(retry>=200)return 1;
	else retry=0;
  while(!DS18B20_IN&&retry<240)
	{
		retry++;
		DelayUs(1);
	};
	if(retry>=240)return 1;	    
	return 0;
}


/*
从DS18B20读取一个字节
返回值:读到的数据
*/
u8 DS18B20_ReadByte(void)
{        
	u8 i,data=0;
	for(i=0;i<8;i++) 
	{
			DS18B20_OUTPUT();  //初始化为输出模式
			DS18B20_OUT=0;		 //输出0 
			DelayUs(2);        
			DS18B20_OUT=1;     //上拉总线电平
			DS18B20_INPUT()    //初始化为输入模式
			DelayUs(12);
		  data>>=1;
			if(DS18B20_IN)
			{
					data|=0x80; 		
			}			
			DelayUs(50);
	}						    
  return data;
}


/*
写一个字节到DS18B20
dat:要写入的字节
*/
void DS18B20_WriteByte(u8 dat)     
 {             
		u8 i;
		DS18B20_OUTPUT(); //初始化IO为输出模式
		for(i=0;i<8;i++) 
		{
				if(dat&0x01) //先发低位
				{
					DS18B20_OUT=0;//输出0
					DelayUs(2);                            
					DS18B20_OUT=1;//输出1
					DelayUs(60);             
				}
				else 
				{
					DS18B20_OUT=0;//输出0
					DelayUs(60);             
					DS18B20_OUT=1;//输出1
					DelayUs(2);                          
				}
				dat>>=1;
		 }
}


/*
从ds18b20得到温度值
精度:0.1C
返回值:温度值 (-550~1250) 
*/
short DS18B20_Get_Temp(void)
{
		u16 temp;
		u8 TL,TH;
		DS18B20_OUTPUT(); 
    DS18B20_OUT=0;		//输出0 //拉低DQ
    DelayUs(750);     //拉低750us
    DS18B20_OUT=1;    //输出1 //DQ=1 
		DelayUs(15);      //15US	  
	
    DS18B20_Check();	 
    DS18B20_WriteByte(0xcc); //跳过芯片ID检测
    DS18B20_WriteByte(0x44); //转换一次温度
	
    DS18B20_OUTPUT(); 
    DS18B20_OUT=0;   //输出0 //拉低DQ
    DelayUs(750);    //拉低750us
    DS18B20_OUT=1;	 //输出1 //DQ=1 
    DelayUs(15);     //15US
    DS18B20_Check();	 
	
    DS18B20_WriteByte(0xcc);// 跳过芯片ID检测
    DS18B20_WriteByte(0xbe);// 读取转换成功的温度数据
    TL=DS18B20_ReadByte();  // LSB   
    TH=DS18B20_ReadByte();  // MSB  
    temp=((u16)TH<<8)|TL;
	return temp;
}


Ds18b20.h代码示例

#ifndef _DS18B20_H
#define _DS18B20_H
#include "stm32f4xx.h"

#include "sys.h"
#include "delay.h"
void DS18B20_Init(void);
short DS18B20_Get_Temp(void);
#define DS18B20_IN PGin(9)
#define DS18B20_OUT PGout(9)

#define DS18B20_INPUT()  \
				{\
					GPIOG->MODER&=~(0x3<<9*2);\
					GPIOG->MODER|=0x0<<9*2;\
					GPIOG->PUPDR&=~(0x3<<9*2);\
					GPIOG->PUPDR|=0x1<<9*2;\
				}
				
#define DS18B20_OUTPUT() \
				{\
					 GPIOG->MODER&=~(0x3<<9*2);\
					 GPIOG->MODER|=0x1<<9*2;\
					 GPIOG->OTYPER&=~(0x1<<9);\
					 GPIOG->OSPEEDR&=~(0x3<<9*2);\
					 GPIOG->OSPEEDR|=0x2<<9*2;\
					 GPIOG->ODR|=1<<9;\
				}
#endif

Main.c文件示例

#include "stm32f4xx.h" // Device header
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "sys.h"
#include "exti.h"
#include "timer.h"
#include "pwm.h"
#include "ds18b20.h"

int main(void)
{
		short temp;
		unsigned short intT,decT; 	  //温度值的整数和小数部分
		LED_Init();
		KEY_Init();
		USART1_Init(84,115200);
		KEY_EXTI_Init();
		DS18B20_Init();
	  while(1)
		{
			  /*读取温度信息*/
				temp=DS18B20_Get_Temp();
				intT = temp >> 4;             //分离出温度值整数部分
				decT = temp & 0xF;            //分离出温度值小数部分
				printf("DS18B20: %d.%d *C\r\n",(int)intT,(int)decT);
				DelayMs(1000);
		}
}


img

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

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

相关文章

拯救者Lenovo Legion Y9000X IAH7 2022款(82TF)原装出厂Windows11系统恢复原厂OEM系统

Lenovo联想拯救者笔记本电脑 Legion Y9000X IAH7 2022款(82TF)出厂状态原装Win11系统&#xff0c;恢复原厂系统 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件大小&am…

人类最新版去水印+外卖CPS小程序源码+独立后台微擎模块

最新版去水印外卖CPS小程序源码 本版本为目前最新版本 修复上个版本后台用户列表加载失败问题 新增轮播图跳转小程序 新增外卖CPS系统

layui学习

官网&#xff1a;Layui镜像站-经典开源模块化前端 UI 框架(官方文档完整镜像) 下载&#xff1a;可以在首页进行下载 快速入门Layui | 枫桥夜泊 如果不知道样式在哪个模块下&#xff0c;引入总的核心样式文件&#xff1b;如果知道样式在哪个模块下&#xff0c;直接引入module…

线程间通信

1、需求 现在两个线程操作一个初始值为0的变量实现一个线程对变量增加1&#xff0c;一个线程对变量减少1交替&#xff0c;来10轮 2、多线程编程模板中 1&#xff09;判断 2&#xff09;干活 3&#xff09;通知 线程间通信&#xff1a; 1.生产者消费者 2.通知等待唤醒机制 3…

Aski AI: 基于人工智能的在线AI工具平台

【产品介绍】 Aski AI是一个基于人工智能的在线AI工具平台&#xff0c;它可以帮助用户快速、准确、全面地解决各种问题。无论是学习、工作、生活、娱乐还是其他领域&#xff0c;只要输入你的问题&#xff0c;Aski AI就会为你提供最合适的答案。此外还提供AI文章写作&#xff0c…

BHQ1 Mal,BHQ2 Maleimide,BHQ3 Mal,马来酰亚胺修饰的BHQ试剂有哪些特点?

一、BHQ-1 Maleimide 产品描述&#xff1a; BHQ-1 Maleimide黑洞猝灭剂-1(BHQ-1)被归类为暗猝灭剂&#xff0c;该淬灭剂能够将一定距离内荧光基团发出的光全部吸收&#xff0c;实现对荧光信号的淬灭&#xff0c;所以可得到更强的特异性&#xff0c;更优化的信噪比。 中文名&a…

【正点原子STM32连载】 第四十五章 FLASH模拟EEPROM实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

第四十五章 FLASH模拟EEPROM实验 STM32本身没有自带EEPROM&#xff0c;但是STM32具有IAP&#xff08;在应用编程&#xff09;功能&#xff0c;所以我们可以把它的FLASH当成EEPROM来使用。本章&#xff0c;我们将利用STM32内部的FLASH来实现第三十六章实验类似的效果&#xff0…

设计模式第18讲——中介者模式(Mediator)

目录 一、什么是中介者模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 抽象中介者&#xff08;Mediator&#xff09;——LogisticsCenter 5.2 抽象同事类&#xff08;Colleague&#xff09;——Participant 5…

nvm安装node

使用 Windows 系统的我选择使用其推荐的 nvm-windows 来管理 Node.js 版本。 在安装 nvm-windows 前&#xff0c;如果你的电脑中已经安装了 Node.js&#xff0c;那么可以选择卸载&#xff0c;也可以选择不卸载。因为在安装 nvm-windows 的过程中其会询问你是否需要将已安装的 N…

mysql数据库迁移到kingbase人大金仓

1. 启动数据迁移工具 2. 浏览器打开网址[http://localhost:8080/]进入可视化操作界面&#xff0c;在源数据库添加人大金仓数据库信息&#xff0c;测试成功后保存 3.在目标数据库填写需要同步的mysql数据库&#xff0c;添加对应的mysql数据库信息&#xff0c;测试成功后保存 4.在…

The Company Requires Superficial StudyPHP 打开执行PHP ②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

自制游戏引擎

这是一个玩具 1. 引擎使用流程 SmallEngine是引擎的核心模块,封装渲染功能和场景管理功能等Editor是编辑器,类似unity和ue编辑器,能够动态添加对象和组件Sandbox是游戏播放器,能够运行游戏 2. SmallEngine 参考 https://www.bilibili.com/video/BV1KE41117BD/?spm_id_from333…

ARM实验-ARM主程序调用ARM/C语言子程序

一、实验名称&#xff1a;ARM主程序调用ARM/C语言子程序 二、实验目的&#xff1a; 了解ARM应用程序框架。了解ARM汇编程序函数和C语言程序函数相互调用时&#xff0c;遵循的ATPCS标准&#xff1b;了解和掌握ARM汇编程序调用C语言程序函数的基本方法&#xff1b;了解和掌握AR…

操作系统第4章 文件系统 知识点

UNIX系统不存一些具体的指针了 只存文件名和指向i结点的指针 这个删除和截断有什么区别 目录本来放在外存的&#xff0c;有文件打开表&#xff0c;从外存复制到内存的文件打开表中&#xff0c;用户想继续读的时候&#xff0c;不用再去外存搜索目录 访问文件打开表的索引叫文…

基于“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用

近年来&#xff0c;国内外学者在生态系统的敏感性、适应能力和潜在影响等方面开展了大量的生态脆弱性研究&#xff0c;他们普遍将生态脆弱性概念与农牧交错带、喀斯特地区、黄土高原区、流域、城市等相结合&#xff0c;评价不同类型研究区的生态脆弱特征&#xff0c;其研究内容…

大数据Doris(五十二):Doris数据导出案例和注意事项

文章目录 Doris数据导出案例和注意事项 一、Doris数据导出到HDFS案例 1、创建Doris表并插入数据 2、创建Export ,数据导出到 HDFS 3、查看任务 4、查看导出结果 二、Doris数据导出到本地案例 1、配置 fe.conf 2、Doris 数据导出到本地 三、注意事项 Doris数据导出案例…

kettle源码远程debug调试

一、kettle启动时指定debug端口号 windows下&#xff0c;修改bat执行文件&#xff0c;同理 linux修改sh执行文件 在java执行参数的末尾添加debug参数 address为debug端口 -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:transportdt_socket,servery,suspendn,address9080然…

从渲染流程、数据处理结构聊聊Flutter性能优化

不可否认 Flutter 是一个非常强大的移动应用开发框架&#xff0c;我们在技术架构选型时就是选用的 Flutter&#xff0c;特别是跨端能力属实很优秀&#xff0c;but 也逐渐发现在复杂的应用程序实现中&#xff0c;App 的性能会受到一些影响。 其实这个问题&#xff0c;我们内部也…

SpringCloud入门实战(九)- SpringCloud Config配置中心

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

java List集合使用笔记

1、List集合的特点 有序集合、有序的序列&#xff0c;用户可以精准的控制元素插入的位置通过索引访问元素可以搜索元素与Set不同&#xff0c;List允许重复的元素存在 2、List集合特有的方法 add(索引,元素) remove(索引)&#xff1a;返回的是被删除的索引 get(索引)&#xf…