DS18B20温度传感器

文章目录

  • 一、介绍DS18B20
    • 了解DS18B20
    • 引脚及电路图
    • 内部结构框图
    • 存储器结构
    • 单总线(1 wire bus)介绍
    • 单总线电路规范
    • 单总线时序结构
      • 初始化
      • 发送一个数据
      • 接收一位数据
      • 发送一个字节与接收一个字节
    • DS18B20操作流程
    • 所要使用的数据帧
    • 温度存储格式
  • 二、实现温度检测
    • 根据单总线时序结构配置初始化、写入数据、读取数据函数
    • 根据要使用的数据帧配置温度变换与温度读取
    • 显示温度传感器并配置阈值警报
  • 注意


一、介绍DS18B20

了解DS18B20

在这里插入图片描述

引脚及电路图

在这里插入图片描述
完整电路(引脚名称不同、功能一样)
在这里插入图片描述
在这里插入图片描述

内部结构框图

使用寄生电源时,由于上拉电阻电阻较大,需要给这个电源高电压(强上拉)才能使DS18B02工作,本次案例不用使用。

在这里插入图片描述

存储器结构

在这里插入图片描述

单总线(1 wire bus)介绍

在这里插入图片描述

单总线电路规范

在这里插入图片描述

单总线时序结构

初始化

在这里插入图片描述

发送一个数据

在这里插入图片描述

接收一位数据

在这里插入图片描述

发送一个字节与接收一个字节

在这里插入图片描述

DS18B20操作流程

在这里插入图片描述
在这里插入图片描述

所要使用的数据帧

在这里插入图片描述

温度存储格式

在这里插入图片描述
例子
在这里插入图片描述

二、实现温度检测

根据单总线时序结构配置初始化、写入数据、读取数据函数

OneWire.c

#include <REGX52.H>
#include <intrins.h>

// 定义接口
sbit OneWire_IO = P3^7;
// 初始化单总线
unsigned char OneWire_Init(){
	unsigned char i,ACK;
	// 关闭中断,以免影响温度传感器读取数据(影响延时)
	EA = 0;
	OneWire_IO = 1;
	OneWire_IO = 0; // 把总线拉低
	_nop_();i = 227;while (--i);		// 延时500us
	OneWire_IO = 1;	// 释放总线
	_nop_();i = 29;while (--i);			// 延时70us
	ACK = OneWire_IO;	// 返回从机的响应
	_nop_();i = 227;while (--i);		// 延时500us
	EA = 1;
	return ACK;
}
// 发送一位数据
void OneWire_SendBit(unsigned char Bit){
	unsigned char i;
	EA = 0;
	OneWire_IO = 0;
	i = 3;while (--i);		// 延时10us
	OneWire_IO = Bit;
	i = 24;while (--i);		// 延时50us
	EA = 1;
	OneWire_IO = 1;				// 释放总线
}
// 接收一位数据
unsigned char OneWire_ReceiveBit(){
	unsigned char i,Bit;
	EA = 0;
	OneWire_IO = 0;
	i = 2;while (--i);		// 延时5us
	OneWire_IO = 1;
	i = 2;while (--i);		// 延时5us
	Bit = OneWire_IO;
	i = 24;while (--i);		// 延时50us
	EA = 1;
	return Bit;
}
// 发送一个字节
void OneWire_SendByte(unsigned char Byte){
	unsigned char i;
	for(i=0;i<8;i++){
		OneWire_SendBit(Byte & (0x01<<i));	// 从低位到高位
	}
}
// 接收一个字节
unsigned char OneWire_ReceiveByte(){
	unsigned char i,Byte = 0x00;
	for(i=0;i<8;i++){
		if(OneWire_ReceiveBit()){
			Byte |= 0x01<<i;
		}
	}
	return Byte;
}


根据要使用的数据帧配置温度变换与温度读取

DS18B20.c

#include <REGX52.H>
#include "OneWire.h"

#define SKIP_ROM  				0xCC	// 跳过ROM
#define CONVERT_T   			0x44	// 温度交换
#define READ_SCRATCHPAD   		0xBE	// 读取RAM

// 温度变换
void DS18B20_CovertT(){
	OneWire_Init();
	OneWire_SendByte(SKIP_ROM);
	OneWire_SendByte(CONVERT_T);
}

// 温度读取
float DS18B20_ReadT(){
	unsigned char TLSB,TMSB;
	int Temp;
	float T;
	OneWire_Init();
	OneWire_SendByte(SKIP_ROM);
	OneWire_SendByte(READ_SCRATCHPAD);
	TLSB = OneWire_ReceiveByte();	// 高八位
	TMSB = OneWire_ReceiveByte();	// 低八位
	Temp = (TMSB<<8) | TLSB;
	T = Temp/16.0;	// 右移四位
	return T;
}

显示温度传感器并配置阈值警报

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "DS18B20.h"
#include "Delay.h"
#include "AT24C02.h"
#include "Key.h"
#include "Time0Init.h"

float T,TShow;
char TL,TH;
unsigned char KeyNum;

void main()
{
	DS18B20_CovertT();		//上电先转换一次温度,防止第一次读数据错误
	Delayms(1000);			//等待转换完成
	TH=AT24C02_ReadByte(0);	//读取温度阈值数据
	TL=AT24C02_ReadByte(1);
	if(TH>125 || TL<-55 || TH<=TL)
	{
		TH=20;			//如果阈值非法,则设为默认值
		TL=15;
	}
	LCD_Init();
	LCD_ShowString(1,1,"T:");
	LCD_ShowString(2,1,"TH:");
	LCD_ShowString(2,9,"TL:");
	LCD_ShowSignedNum(2,4,TH,3);
	LCD_ShowSignedNum(2,12,TL,3);
	Time0_Init();
	
	while(1)
	{
		KeyNum=Key();
		
		/*温度读取及显示*/
		DS18B20_CovertT();	//转换温度
		T=DS18B20_ReadT();	//读取温度
		if(T<0)			
		{
			LCD_ShowChar(1,3,'-');	
			TShow=-T;		
		}
		else				
		{
			LCD_ShowChar(1,3,'+');	
			TShow=T;
		}
		LCD_ShowNum(1,4,TShow,3);		//显示温度整数部分
		LCD_ShowChar(1,7,'.');		
		//	左移两位再取余取出最近两位小数
		LCD_ShowNum(1,8,(unsigned long)(TShow*100)%100,2);//显示温度小数部分
		
		/*阈值判断及显示*/
		if(KeyNum)
		{
			if(KeyNum==1)	//K1按键,TH自增
			{
				TH++;
				if(TH>125){TH=125;}
			}
			if(KeyNum==2)	//K2按键,TH自减
			{
				TH--;
				if(TH<=TL){TH++;}
			}
			if(KeyNum==3)	//K3按键,TL自增
			{
				TL++;
				if(TL>=TH){TL--;}
			}
			if(KeyNum==4)	//K4按键,TL自减
			{
				TL--;
				if(TL<-55){TL=-55;}
			}
			//显示阈值数据
			LCD_ShowSignedNum(2,4,TH,3);	
			LCD_ShowSignedNum(2,12,TL,3);
			//写入到At24C02中保存
			AT24C02_WriteByte(0,TH);		
			Delayms(5);
			AT24C02_WriteByte(1,TL);
			Delayms(5);
		}
		//越界判断
		if(T>TH)			
		{
			LCD_ShowString(1,13,"OV:H");
		}
		else if(T<TL)
		{
			LCD_ShowString(1,13,"OV:L");
		}
		else
		{
			LCD_ShowString(1,13,"    ");
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	T0Count++;
	if(T0Count>=20)
	{
		T0Count=0;
		Key_Loop();	//每20ms调用一次按键驱动函数
	}
}


注意

  • 单总线与I2C总线发送接收数据不同,I2C数据从左到右是从高位到低位,单总线从左到右是从低位到高位。
  • 本案例为避免定时器影响单总线的延时判断逻辑,采用了延时判断时关闭一切中断的做法,对定时器有一定的影响,在其他程序中使用需注意。
  • 这个温度传感器的温度转换即转变为可接收的值的过程需要一定的时间,如果不延时等待会显示一个默认值。
  • 由于温度数据最后四位为小数位,返回值和显示值时要注意移位。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据信用报告在线查询平台哪个好?

随着大数据技术在金融风控的运用&#xff0c;大数据信用越来越被人熟知&#xff0c;由于线下没有查询大数据信用的地方&#xff0c;想要查询大数据信用报告只有在线上查询&#xff0c;那大数据信用报告在线查询平台哪个好呢?本文贷你一起去了解市面上比较好的三个平台。 大数据…

风控安全产品系统设计

风控业务架构 我把风控业务架构的分层分为6层,分别是组件层、业务层、决策层、能力层、计算层、可视层。 以下基建为基础安全产品的简称。 组件层 组件层的职责是:数据收集与行为反制。 从接口、设备、行为三个维度进行数据收集,接收决策层的指令进行行为反制。为了保证…

Alt + TAB 禁止在 Edge 标签页之间切换

&#xff08;原文&#xff1a;https://blog.iyatt.com/?p13587 &#xff09; 浏览器标签页之间切换可以用 {Ctrl}{Tab} 或者 {Ctrl}{数字}精准到标签页码&#xff0c;结果 Windows 11 默认把 Edge 标签页切换混入了 {Alt}{Tab} 前台应用窗口切换&#xff0c;经常不注意是在 Ed…

深入Spring MVC的工作流程

深入Spring MVC的工作流程 在Spring MVC的面试问题中&#xff0c;常常被询问到的一个问题。Spring MVC的程序中&#xff0c;HTTP请求是如何从开始到结束被处理的。为了研究这个问题&#xff0c;我们将需要深入学习一下Spring MVC框架的核心过程和工作流程。 1. 启动请求生命周…

CMake生成osg的FFMPEG插件及Windows下不生成VS工程问题解决

在Windows下&#xff0c;如何利用CMake生成osg的FFMPEG插件&#xff0c;请参考如下博文&#xff0c;同生成jpeg插件类似&#xff1a; osg第三方插件的编译方法&#xff08;以jpeg插件来讲解&#xff09;。 如下为生成FFMPEG时必要的设置&#xff1a; 注意&#xff1a; 一定要…

一篇文章了解系统眼中的键盘--以一个简单的系统分析从按键的输入到字符的显示

键盘输入 实现使用的设备 intel架构32位CPU, 思路为嵌入式系统工程师,使用的操作系统是《30天自制操作系统》里面的系统进行讲解 硬件实现 按键 使用单片机等的引脚可以获取电平状态从而获得按键的状态(单片机是一种集成到一块硅片上构成的一个小而完善的微型计算机系统, 用…

QT研究笔记(一)windows 开发环境安装部署

一、Qt 是什么&#xff1f; Qt 是一个跨平台的应用程序开发框架&#xff0c;最初由挪威的 Trolltech 公司开发&#xff0c;并于2008年被诺基亚收购。后来&#xff0c;Qt 框架由 Digia 公司接手&#xff0c;并在2012年成立了 The Qt Company。Qt 提供了一套丰富的工具和类库&am…

快速了解线程池

文章目录 一. 线程池初了解1. 什么是线程池2. 使用线程池的好处 二. 线程池再了解1. ThreadPoolExecutor类的重要配置2. 线程池的工作流程3. 使用Java标准库创建线程 三. 模拟实现简易线程池 一. 线程池初了解 1. 什么是线程池 线程池是一种采用池化思想&#xff08;同理还有…

由vscode自动升级导致的“终端可以ssh服务器,但是vscode无法连接服务器”

问题描述 简单来说就是&#xff0c;ssh配置没动&#xff0c;前两天还可以用vscode连接服务器&#xff0c;今天突然就连不上了&#xff0c;但是用本地终端ssh可以顺利连接。 连接情况 我的ssh配置如下&#xff1a; Host gpu3HostName aaaUser zwx现在直接在终端中进行ssh&am…

[Python] 什么是KMeans聚类算法以及scikit-learn中的KMeans使用案例

什么是无监督学习&#xff1f; 无监督学习是机器学习中的一种方法&#xff0c;其主要目的是从无标签的数据集中发现隐藏的模式、结构或者规律。在无监督学习中&#xff0c;算法不依赖于任何先验的标签信息&#xff0c;而是根据数据本身的特征和规律进行学习和推断。无监督学习…

重写Sylar基于协程的服务器(6、HOOK模块的设计)

重写Sylar基于协程的服务器&#xff08;6、HOOK模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItemGroup组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之MenuItemGroup组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、MenuItemGroup组件 该组件用来展示菜单MenuItem的分组。 子组件 无 接…

项目中使用sonar扫码代码

1.在maven的settings.xml配置 org.sonarsource.scanner.maven <profiles> <profile><id>sonar</id><activation><activeByDefault>true</activeByDefault></activation><properties><!-- Optional URL to server. D…

AI应用开发-git开源项目的一些问题及镜像解决办法

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

okhttp 的 拦截器

拦截器有很多作用&#xff0c;实现就是责任链模式&#xff0c;细节&#xff0c;等我有时间补上。 后面有时间更新一下。 OkHttp最核心的工作是在 getResponseWithInterceptorChain() 中进行&#xff0c;在进入这个方法分析之前&#xff0c;我们先来了 解什么是责任链模式&…

【Linux】打包压缩跨系统/网络传输文件常用指令完结

Hello everybody!在今天的文章中我会把剩下的3-4个常用指令讲完&#xff0c;然后开始权限的讲解。那废话不多说&#xff0c;咱们直接进入正题&#xff01; 1.zip/unzip&tar命令 1.zip/unzip 在windows系统中&#xff0c;经常见到带有zip后缀的文件。那个东西就是压缩包。…

由于误删了node依赖,导致这后面的一系列操作

文章目录 1. 事发原因&#xff1a;Delete select files2. Delete select files引起的cross-env报错3. cross-env是node_modules的依赖工具4. 那么Delete selected files到底是什么操作5. 重装node_modules依赖包&#xff0c;也报错6. 报错&#xff1a;cb() never called!7. 算了…

JS第一天、数据类型检测、内存释放

复习&#xff1a; 以下类型都是 object console.log(typeof new Object); console.log(typeof new Array()); console.log(typeof new Date()); console.log(typeof new RegExp()); console.log(typeof new String()); console.log(typeof new Number()); console.log(typeof…

内裤洗衣机到底值不值得买?四款好用的内衣裤洗衣机推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…

Zoho Projects与Jira:中国市场的理想替代品之争?

在软件开发生命周期中&#xff0c;项目管理一直是一个非常重要的环节。为了更好地协作、追踪项目的进程和管理任务&#xff0c;许多公司选择了Jira这款著名的项目管理工具&#xff0c;它是个非常强大的工具&#xff0c;但是作为一款纯国外产品&#xff0c;他可能不适合中国市场…