多点温度测试

news/2024/10/21 19:44:21/

DS18B20温度传感器
一、简介:
在这里插入图片描述
图示有字的一面,注意GND和VCC不要接反。工作电压3.0v~5.5V,采集温度-55度到正125度,可编程温度9-12位,精度分别是0.5度,0.25度,0.125度0.0625度,默认都是12位,12位转换时间是750ms,9位是93.75ms,电压负压特性(不会因电源接反发热烧坏)。
二、电路连接:
在这里插入图片描述
接一个上拉电阻。
三、通信方式:
单总线通信:
单总线是一种具有一个总线主机和一个或若干个从机的系统。严格按照器件的时间要求进行复位,写命令,读写数据等。整个过程在一条线上进行。
四、DS18B20的内部结构:
在这里插入图片描述
64位光刻ROM,温度传感器,非易失性的温度报警触发器TH和TL,配置寄存器。出厂前ROM的排列是:开始8位产品类型标号(28H),接着48位是DS18B20全球唯一序列号,最后8位是前面56位的循环冗余校验码。
DS18B20存储器:
在这里插入图片描述
Byte0和Byte1分别存储温度寄存器的低字节和高字节,这两个字节是只读的。我们一般只操作这两个字节。
在这里插入图片描述
五、DS18B20的指令:
命令有两种,一种ROM的指令,一种暂存器的指令。
在这里插入图片描述
六、操作时序:
分为4个步骤:
1.复位:单片机发一个低电平给DS18B20,DS18B20返回一个低电平给单片机,完成唤醒握手。
2.发送ROM命令
3.发送暂存器指令
4.发送数据或接受数据

单个温度测试代码:

#include<All.h>
uchar xdata DS18B20_Buffer[2]=0;//保存温度的数据
void Delay500us()		//@24.000MHz
{unsigned char i, j;i = 16;j = 147;do{while (--j);} while (--i);
}
void Delay80us()		//@24.000MHz
{unsigned char i, j;_nop_();_nop_();i = 3;j = 123;do{while (--j);} while (--i);
}
void Delay60us()		//@24.000MHz
{unsigned char i, j;_nop_();i = 2;j = 220;do{while (--j);} while (--i);
}
void Delay10us()		//@24.000MHz
{unsigned char i;i = 78;while (--i);
}
void Delay2us()		//@24.000MHz
{unsigned char i;i = 14;while (--i);
}
/********************************** @函数名:DS18B20_Reset* @描   述:复位* @说   明:* @参   数:无* @返回值:无 *********************************/
void DS18B20_Reset()
{DS18B20_DQ=0;//总线拉低Delay500us();//保持500usDS18B20_DQ=1;//短暂拉高Delay80us();//80us//等待拉低Delay500us();//返回一个106us的低电平DS18B20_DQ=1;_nop_();//短暂拉高_nop_();
}
/********************************** @函数名:DS18B20_Write_Com* @描   述:写寄存器指令* @说   明:* @参   数:dat 要写入的数据* @返回值:无 *********************************/
void DS18B20_Write_Com(uchar com)
{uchar idata i;for(i=0;i<8;i++){DS18B20_DQ=0;Delay10us();//先拉低15us_nop_();DS18B20_DQ=(bit)(com&0x01);//先发低位com>>=1;//移位Delay60us();//继续拉低15usDS18B20_DQ=1;//短暂拉高Delay2us();}
}
/********************************** @函数名:DS18B20_Read_Data* @描   述:读数据* @说   明:* @参   数:无* @返回值:dat  读出的数据 *********************************/
uchar DS18B20_Read_Data()
{uchar idata i,value;for(i=0;i<8;i++){DS18B20_DQ=0;Delay10us();value>>=1;DS18B20_DQ=1;//Ds18B20会返回值。,无论是0还是1,都延迟15usDelay2us();//	Delay15us();//先拉低15usif(DS18B20_DQ)//是1value|=0x80;//最低位Delay60us();}
return value;
}
/********************************** @函数名:DS18B20_Handle* @描   述:温度处理* @说   明:1. 复位 2.发送ROM命令 3.发送暂存器指令 读RAM 4.数据* @参   数:无* @返回值:无*********************************/
void DS18B20_Handle()
{uchar xdata value_High,value_Low;float num;//保存小数DS18B20_Reset();//复位DS18B20_Write_Com(0xcc);//发送指令CCH,跳过ROM操作//DS18B20_Write_Com(0x33);//读64位ROMDS18B20_Write_Com(0x44);//发送指令44H,启动温度转换Delay10us();DS18B20_Reset();//复位DS18B20_Write_Com(0xcc);//发送指令CCH,跳过ROM操作DS18B20_Write_Com(0xbe);//发送指令BEH,读取9字节RAM数据的前两个数据Delay10us();value_Low=DS18B20_Read_Data();//先读低字节Byte0value_High=DS18B20_Read_Data();//高字节Byte1value_High<<=4;//整数的高3位value_High+=(value_Low&0xf0)>>4;//整数的低4位DS18B20_Buffer[0]=value_High;//整数num=(value_Low&0x0f)*0.0625;//小数DS18B20_Buffer[1]=(uchar)(num*100);//小数
}

多点测试:(两个)
步骤:
1.先读出每个传感器的唯一ROM序列;

/********************************** @函数名:DS18B20_Read_64Rom* @描   述:读64位的ROM 唯一标识* @说   明:* @参   数:*buffer 读出的8个字节的数据* @返回值:无*********************************/
void DS18B20_Read_64Rom(uchar *buffer)
{uchar i;DS18B20_Reset();//复位DS18B20_Write_Com(0x33);//读64位ROMfor(i=0;i<8;i++) //读取64个字节buffer[i]=DS18B20_Read_Data();
}

在这里插入图片描述
2.用两个数组存读出来的序列号:
在这里插入图片描述
3.写入ROm序列号,并启动转换温度:

/********************************** @函数名:DS18B20_Write_Rom* @描   述:写64ROM* @说   明:发送匹配ROM命令 0x55再写入8字节的ROM* @参   数:*buffer 要发送的存放ROM的数组* @返回值:无*********************************/
void DS18B20_Write_Rom(uchar *buffer)
{uchar i;DS18B20_Write_Com(0x55); //ROM匹配 for(i = 0;i < 8;i++)DS18B20_Write_Com(buffer[i]); //写入8个字节的ROM
}
/********************************** @函数名:DS18B20_Handle* @描   述:温度处理* @说   明:1. 复位 2.发送ROM命令 3.发送暂存器指令 读RAM 4.数据* @参   数:无* @返回值:无*********************************/
void DS18B20_Handle(uchar *buffer)
{uchar xdata value_High,value_Low;float num;//保存小数DS18B20_Reset();//复位//DS18B20_Write_Com(0xcc);//发送指令CCH,跳过ROM操作//DS18B20_Write_Com(0x33);//读64位ROMDS18B20_Write_Rom(buffer); //匹配ROM 并写入64ROMDS18B20_Write_Com(0x44);//发送指令44H,启动温度转换Delay10us();DS18B20_Reset();//复位DS18B20_Write_Rom(buffer); //匹配ROM 并写入64ROMDS18B20_Write_Com(0xbe);//发送指令BEH,读取9字节RAM数据的前两个数据Delay10us();value_Low=DS18B20_Read_Data();//先读低字节Byte0value_High=DS18B20_Read_Data();//高字节Byte1value_High<<=4;//整数的高3位value_High+=(value_Low&0xf0)>>4;//整数的低4位DS18B20_Buffer[0]=value_High;//整数num=(value_Low&0x0f)*0.0625;//小数DS18B20_Buffer[1]=(uchar)(num*100);//小数
}

其他的都和单个测试是一样的。
测试结果:
在这里插入图片描述
另外附上主函数:

/********************************** @函数名:main* @描   述:main函数,程序入口* @说   明:* @参   数:无* @返回值:无 *********************************/
void main()
{//uchar a[8];//存放读出来的ROMUart1_Init();//串口初始化Send_String("多点温度测试:\n");while(1){DS18B20_Handle(DS18B20_Rom1);printf("温度1:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印温度putchar_End();//换行
//		DS18B20_Read_64Rom(a);
//		Send_String(a);Delay1000ms();DS18B20_Handle(DS18B20_Rom2);printf("温度2:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印温度Delay1000ms();putchar_End();//换行}
}

http://www.ppmy.cn/news/645293.html

相关文章

测一测现在的温度

测一测现在的温度 目录 测一测现在的温度一、Hello World二、使用DHT11测温 我们使用Mongoose OS esp8266 DHT11来做。 Mongoose OS&#xff1a;一个物联网固件开发框架。官方文档 esp8266&#xff1a;ESP8266是一款串口WiFi模块。 DHT11&#xff1a;一个温度传感器。 固件…

【SA8295P 源码分析】33 - Android GVM USB 透传配置

【SA8295P 源码分析】33 - Android GVM USB 透传配置 1. Android 端配置 dts:以配置 USB1 为例2. QNX 端配置 linux-la.config:以配置 USB1 为例3. 在Android shell 中配置USB0 / USB1 的 Host/device 模式切换系列文章汇总见:《【SA8295P 源码分析】00 - 系列文章链接汇总》…

记录一次 vite 配置别名路径 打包时出错的bug

vite多页应用,由于在vite.config.ts中define中配置的常量pages,而路径别名也有pages,所有导致打包时替换路径出错,将pages常量注释掉就好了 export default defineConfig({root: getRoot(), // 项目根路径base: "/", // 公共基础路径envDir: resolve(__dirname), /…

雷神科技c++qt面试

一面 &#xff08;30min&#xff09;&#xff1a; 应该是研发的负责人 腾讯出来的 问了一些项目 然后c的知识 malloc 与 new 区别 指针与引用区别 喜欢用指针还是引用作为参数的出参 哪些场景只能用指针作为参数 udp 与 tcp 区别 如果用udp 怎么实现类似tcp一样的稳定传输 排序…

SpringBoot入门-源码解析(雷神)

一、Spring Boot入门 视频学习资料(雷神)&#xff1a; https://www.bilibili.com/video/BV19K4y1L7MT?p1 github: https://github.com/12722097458/springboot-20220403.git1、Spring Boot简介 简化Spring的一个框架&#xff1b; 是整个Spring技术栈的一个整合&#xff1b; 是…

雷神Springboot2笔记

1. 启动一个springboot项目 创建maven工程 在pom中引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency>创建主程序 /*** 主程序类* SpringBootApplicatio…

雷神加速器自动暂停

import requests import json import psutil import timeusername "" #密码得是加密后的 password "" #需要监控的游戏 process_name "cloudmusic.exe"session requests.Session() """ 获取token """ def ge…

Springboot学习笔记 | 尚硅谷雷神

一、springboot入门 1、导入依赖 导入springboot版本仲裁中心 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath /&…