单片机驱动多个ds18b20

news2024/9/21 14:34:05

目录

1设计内容

2ds18b20介绍

2.1传感器引脚及原理图

2.2寄存器配置

3程序实现

3.1配置初始化

3.2配置寄存器

3.3ROM读取

3.4温度读取


1设计内容

通过51单片机,读取总线上挂载的多个ds18b20的温度信息。

如下图,成功读取到3路温度数据。

2ds18b20介绍

2.1传感器引脚及原理图


DS18B20传感器的引脚及封装图如下:


DS18B20一共有三个引脚,分别是:

GND:电源地线
DQ:数字信号输入/输出端。
VDD:外接供电电源输入端。


单个DS18B20接线方式: VDD接到电源,DQ接单片机引脚,同时外加上拉电阻,GND接地

注意这个上拉电阻是必须的,就是DQ引脚必须要一个上拉电阻.

2.2寄存器配置

DS18B20写入的功能命令:

ROM指令:

采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
如果是单个DS18B20,直接写跳过ROM指令0xCC即可
在这里插入图片描述

RAM指令,DS18B20的一些功能指令

常用的是:

温度转换 0x44

开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中

读取温度 0xBE
读取高速暂存器存储的数据
在这里插入图片描述

3程序实现

3.1配置初始化

/**初始化DS18B20**/
bit InitDS18B20ACK(){
	bit ACK;//用来判断DS18B20是否初始化成功
	EA = 0;
	DS18B20_IO = 0;
	DS18B20_delayms(1);
	DS18B20_IO = 1;
	DS18B20_delayms(1);
	DS18B20_IO = 0;
	DS18B20_delayms(1);
	ACK = DS18B20_IO;
	DS18B20_IO = 1;
	DS18B20_delayms(1);
	while(!DS18B20_IO);//等待脉冲结束
	EA = 1;
	return ACK;
}

3.2配置寄存器

3.2.1读取ROM测试

在每个DS18B20内部都有一个唯一的64位长的序列号,这个序列号值就存在DS18B20内部的ROM中。开始的8位是产品类型编码(DS18B20是28H),接着的48位是每个器件唯一的序号,最后的8位是CRC校验码。
在这里插入图片描述

一线总线系统使用单总线主控来控制一个或多个从机设备。每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值。

/**启动DS18B20进行温度的采集以及转换,并返回读取成功与否**/
bit startDs18b201(){	
	bit ACK;
	uchar i,x,k,z;
	uchar MSB,LSB;
	uchar temp[8];
x=0;k=0;
	ACK = InitDS18B20ACK();//总线初始化是否完成
	if(ACK == 0){
		writeToDs18b20(0x33);//跳过ROM的验证操作
		//writeToDs18b20(0xbe);//发送一个读取的命令
		for(i=0;i<8;i++)
		{
			MSB = readeToDs18b20();
			dis0[i]=MSB;
		}
		for(i=0;i<4;i++)
		{
			k=IntToString(temp,(int)dis0[i]);
			for(z=0;z<k;z++)
			{
				LCD_Write_Char(x++,0,temp[z]);
			}
		}
		/*
		x=0;
		for(i=0;i<4;i++)
		{
			k=IntToString(temp,(int)dis0[i+4]);
			for(z=0;z<k;z++)
			{
				LCD_Write_Char(x++,1,temp[z]);
			}
		}
		*/
			LCD_Write_String(0,1,dis0);
	while(1);
		//DS18B20_delayms(500);  //上电转换需要延时足够长时间,否则会读出默认值85  会造成main里面后续任务一直等待,改为通过变量控制。
	}
	return ACK;//ACK == 0 启动成功,1就不成功
}

通过连接多个温湿度测试,第一位都是( ,对应16进制28,10进制40.

3.3ROM读取

上面那个只是测试,直接用下面这个读取rom

/*************************************************************************************************************************
*函数        	:	u8 DS18B20_SearchROM(u8 (*pID)[8],u8 Num)
*功能        	:	搜索DS18B20 ROM
*参数        	:	pID:DS18B20 ID缓冲区指针
					Num:DS18B20数目,必须事先知道
*返回        	:	搜索到的DS18B20数目
*说明        	:	程序必须事先知道DS18B20数目,搜索的数目只会小于这个数目
					代码移植于互联网
*************************************************************************************************************************/
u8 DS18B20_SearchROM(u8 (*pID)[8],u8 Num)
{ 
	unsigned char k,l,chongtuwei,m,n;
	unsigned char zhan[(MAXNUM)]= {0x00 };  //一定要初始化为0,否则会概率性搜错
	unsigned char ss[64];
	bit ACK;
	uchar MSB,LSB;
	uchar dis1111[16];
	u8 num = 0;
	l=0;
	chongtuwei=0;
	
	do
	{


	ACK = InitDS18B20ACK();
		writeToDs18b20(0xf0);//搜索rom
		//DS18B20_WriteData(0xf0);	
		for(m=0;m<8;m++)
		{
			unsigned char s=0;
			for(n=0;n<8;n++)
			{
				k=DS18B20_Read2Bit();//读两位数据
				if(n==1)
				{
						sprintf(dis1111,"dis1111 %d ",(int)k);
						LCD_Write_String(0,0,dis1111);
				//while(1);
					
					}

				k=k&0x03;
				s>>=1;
				if(k==0x01)//01读到的数据为0 写0 此位为0的器件响应
				{   		
					DS18B20_WriteBit (0);
	    			ss[(m*8+n)]=0;
				}
				else if(k==0x02)//读到的数据为1 写1 此位为1的器件响应
				{
					s=s|0x80;
					DS18B20_WriteBit (1);
					ss[(m*8+n)]=1;
				}
				else if(k==0x00)//读到的数据为00 有冲突位 判断冲突位 
				{				//如果冲突位大于栈顶写0 小于栈顶写以前数据 等于栈顶写1
					chongtuwei=m*8+n+1;					
					if(chongtuwei>zhan[l])
					{						
						DS18B20_WriteBit (0);
						ss[(m*8+n)]=0;												
						zhan[++l]=chongtuwei;						
					}
					else if(chongtuwei<zhan[l])
					{
						s=s|((ss[(m*8+n)]&0x01)<<7);
						DS18B20_WriteBit (ss[(m*8+n)]);
					}
					else if(chongtuwei==zhan[l])
					{
						s=s|0x80;
						DS18B20_WriteBit (1);
						ss[(m*8+n)]=1;
						l=l-1;
					}
				}
				else
				{
					return num;	//搜索完成,//返回搜索到的个数
				}
			}
			pID[num][m]=s;		
		}
		num=num+1;
	}
	while(zhan[l]!=0&&(num<MAXNUM));	
	
	return num;		//返回搜索到的个数
}

3.4温度读取

	do{
		num = DS18B20_SearchROM(ID_Buff,DS18B20_NUM);

		sprintf(dis0,"DS18B20_NUM %d ",(int)DS18B20_NUM);
		LCD_Write_String(0,0,dis0);

		sprintf(dis1,"num %d ",(int)num);
		LCD_Write_String(0,1,dis1);	
	}while(num!=DS18B20_NUM);
	startDs18b20();
	//while(1);
	DelayMs(500);DelayMs(500);DelayMs(500);DelayMs(500);
	while(1)
	{
			//温度传感器-----start
		if(readTemFlags == 1)
		{
			readTemFlags = 0;//清零
			

		//DelayMs(500);  //启动ds18b20后一定要延时,流出转换时间,否则读出为-1
			temperature = DS18B20_ReadDesignateTemper(ID_Buff[i ++]);
			startDs18b20();
			temp_int = temperature/100;//取整数部分
			temp_dec = temperature%100;//取小数部分
			len = IntToString(str,(int)temp_int);
			
		}
		//temperature = temperature >> 4;
		sprintf(dis1,"temp[%d] %d.%d   ",(int)i,(int)temp_int,(int)temp_dec);
		LCD_Write_String(0,1,dis1);

		if(i>3) i=0;
		DelayMs(100);DelayMs(500);DelayMs(500);DelayMs(500);


		
	}

项目整体链接如下。

https://download.csdn.net/download/weixin_51248645/88797969

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

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

相关文章

python打造光斑处理系统4:裁切光斑感兴趣区域

文章目录 图像裁切给定坐标裁切手动阈值裁切 光斑处理&#xff1a;python处理高斯光束的图像 光斑处理系统&#xff1a;程序框架&#x1f31f;打开图像&#x1f31f;参数对话框/伪彩映射 图像裁切 一般来说&#xff0c;光斑只占图像很小一部分&#xff0c;为了更好的观感和更…

Oracle 面试题 | 04.精选Oracle高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

中国城市统计年鉴,多种数据格式可用,时间覆盖1995-2022年

基本信息. 数据名称: 中国城市统计年鉴 数据格式: pdf、jpg、excel、html不定 数据时间: 1995-2021不定 数据几何类型: 文本 数据坐标系: —— 数据来源&#xff1a;国家统计局 示例数据: 目录一、全国城市行政区划1-1 城市行政区划和区域分布1-2 分地区城市情况一…

隧道穿越:隧道穿透技术介绍

后面会进行一些隧道穿越的实验&#xff0c;因此在本篇中这里先介绍一些有关隧道穿越的技术知识点 隧道和隧道穿透 隧道是一种通过互联网基础设施在网络之间传递数据的方式&#xff0c;设计从数据封装、传输到解包的全过程&#xff0c;使用隧道传递的数据&#xff08;或者负载…

存内计算——发展史与近期成果

存内计算的概念早在上个世纪就已经被提出&#xff0c;但当时的人们寄希望于通过优化处理器设计以及工艺制程的升级&#xff0c;来获得性能和能效比的提升&#xff0c;存内计算的研究仅停留在理论阶段。随着大数据时代的到来&#xff0c;存内计算由于其结构特点以及摩尔定律的“…

WiFi基础知识介绍(超详细)

1.WiFi专业名词概念 AP(Access Point):无线接入点&#xff1a;这个概念特别广&#xff0c;在这里&#xff0c;用大白话说&#xff0c;你可以把CC3200当做一个无线路由器&#xff0c;这个路由器的特点不能插入网线&#xff0c;没有接入Internet&#xff0c;只能等待其他设备的链…

springCloud gateway 防止XSS漏洞

springCloud gateway 防止XSS漏洞 一.XSS(跨站脚本)漏洞详解1.XSS的原理和分类2.XSS漏洞的危害3.XSS的防御 二.Java开发中防范XSS跨站脚本攻击的思路三.相关代码&#xff08;适用于spring cloud gateway&#xff09;1.CacheBodyGlobalFilter.java2.XssRequestGlobalFilter.java…

CAS和自旋的区别

一、前言 我们在面试的时候&#xff0c;经常性的会遇到一些关于锁的问题&#xff0c;尤其是面试官会提出问题&#xff1a;你对锁的了解多么&#xff1f;你知道锁的原理么&#xff1f;等等问题&#xff0c;于是也就会有后续延伸出来的&#xff1a;你知道CAS么&#xff1f;你知道…

Habitat环境学习二:导航任务中的Habitat-sim基础Habitat-sim Basics for Navigation

导航任务在Habitat-sim任务中的实现 官方教程概述重要概念1、Hello World程序1.0.1 基础设置Basic settings1.0.2 模拟器设置Configurations for the simulator1.0.3 创建模拟器实例1.0.4 初始化Agent1.0.5 导航和探索 官方教程 Habitat是一个高效的真实的3D模拟器&#xff0c…

基于C++的面向对象程序设计:类与对象的深入剖析

面向对象程序设计的基本特点 面向对象程序设计的基本特点包括&#xff1a;抽象、封装、继承、多态。 抽象 抽象是指对具体问题或对象进行概括&#xff0c;抽出其公共性质并加以描述的过程。一般情况抽象分为数据抽象和行为抽象&#xff0c;其中数据抽象是指一个对象区别于另…

idea/webstorm 创建Vue实例 Unresolved type Vue 处理方法

1.电脑本地安装node.js 官网下载 2. 其他: 未排除变量,前期试错(以下步骤配置了,但不确定对解决问题是否有帮助)

第 10 章:在C++中使用协程进行系统编程

最后一章专门介绍了一项对系统编程非常有用的功能&#xff0c;但这在C标准中相对较新。协程对象迅速找到了应用&#xff0c;成为了一等公民的状态机对象。它们的强大之处在于隐藏了协程帧后面的逻辑。请注意&#xff0c;这是一个高级主题&#xff0c;且C的协程接口既不简单也不…

216961-98-7,BODIPY 493/503 NHS 活化酯,可以应用于分子生物学等领域中

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;216961-98-7&#xff0c;BODIPY 493/503 NHS 活化酯&#xff0c;BODIPY 493/503 NHS ester&#xff0c;BODIPY 493/503 SE 一、基本信息 产品简介&#xff1a;BODIPY 493/503 NHS ester是一种特殊的染料&#xff0c…

【lesson4】高并发内存池ThreadCache(线程缓存)层实现

文章目录 ThreadCache层的结构申请内存逻辑释放内存逻辑自由链表的实现自由链表的成员变量自由链表的成员函数自由链表的完整实现 ThreadCache申请内存过程的实现ThreadCache需要的成员变量ThreadCache需要的成员函数ThreadCache.h文件代码Allocate的实现Deallocate的实现 封装…

02、全文检索 ------ Solr(企业级的开源的搜索引擎) 的下载、安装、Solr的Web图形界面介绍

目录 Solr 的下载和安装Solr的优势&#xff1a;Lucene与Solr 安装 Solr1、下载解压2、添加环境变量3、启动 Solr Solr 所支持的子命令&#xff1a;Solr 的 Core 和 Collection 介绍Solr 的Web控制台DashBoard&#xff08;仪表盘&#xff09;Logging&#xff08;日志&#xff09…

理想架构的高回退Doherty功率放大器理论与ADS仿真-Multistage

理想架构的高回退Doherty功率放大器理论与仿真-Multistage 参考&#xff1a; 三路Doherty设计 01 射频基础知识–基础概念 Switchmode RF and Microwave Power Amplifiers、 理想架构的Doherty功率放大器&#xff08;等分经典款&#xff09;的理论与ADS电流源仿真参考&#x…

《云原生安全攻防》-- 云原生安全概述

从本节课程开始&#xff0c;我们将正式踏上云原生安全的学习之旅。在深入探讨云原生安全的相关概念之前&#xff0c;让我们先对云原生有一个全面的认识。 什么是云原生呢? 云原生&#xff08;Cloud Native&#xff09;是一个组合词&#xff0c;我们把它拆分为云和原生两个词来…

TS项目实战一:流淌的字符动画界面

使用ts实现虚拟世界&#xff0c;创建ts项目&#xff0c;并编写ts代码&#xff0c;使用tsc编译后直接加载到html界面&#xff0c;实现类似黑客帝国中的流淌的代码界面的效果。 源码下载地址&#xff1a;点击下载 讲解视频 TS实战项目一&#xff1a;数字流界面项目创建 TS实战项…

LRU缓存(Leetcode146)

例题&#xff1a; 分析&#xff1a; 题目要求函数get和put要达到O(1)的时间复杂度&#xff0c;可以用 hashMap 来实现&#xff0c;因为要满足逐出最久未使用的元素的一个效果&#xff0c;还需要配合一个双向链表来共同实现。链表中的节点为一组key-value。 我们可以用双向链表来…