单片机第二季:温度传感器DS18B20

news2024/11/26 11:48:05

目录

1,DS18B20介绍

2,DS18B20数据手册 

2.1,初始化时序 

2.2,读写时序 

3,DS18B20工作流程

4,代码


 

1,DS18B20介绍

DS18B20的基本特征:
(1)内置集成ADC,外部数字接口,也就是可以直接与单片机的数字接口连接,DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;
(2)单总线数字接口,布线成本低,独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条线即可实现微处理器与DS18B20 的双向通讯;
(3)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;
(4)数字值温度分辨率位数可软件设置,可根据需要设置分辨率位数,可编程的分辨率为9~12 位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃ 和0.0625℃,可实现高精度测温;
(5)温度阈值报警功能,且阈值可内置存储掉电不丢失;
(6)在9 位分辨率时最多在93.75ms 内把温度转换为数字,12 位分辨率时最多在750ms 内把温度值转换为数字,速度更快,DS18B20温度采集是由主CPU控制,需要采集温度时才工作;
(7)内置唯一64位序列码,CPU可以单线串联无限多个DS18B20,CPU通过序列码识别与哪个DS18B20通信,DS18B20 支持多点组网功能,多个DS18B20 可以并联在唯一的三线上,实现组网多点测温;
(8)支持VDD供电,或通过数据总线及内部电容实现寄生电源供电,也就是可以通过数据线(DQ)来供电,如果通过数据线供电,数据线在不传输数据时,需要拉高,否则如果内部电容没电时DS18B20就不能工作了;

(9)测量结果直接输出数字温度信号,以"一根总线"串行传送给CPU,同时可传送CRC 校验码,具有极强的抗干扰纠错能力 

使用到的三根线是GND(接地)、DQ(数据线)、VCC(电源线),当然也可以只使用GND和DQ。 

综合评价:
(1)DS18B20是很多年前的东西了;
(2)现在趋向于温度+湿度的综合传感器;
(3)现实应用一般低端用热敏电阻、热电偶,高端用精密传感器;
(4)学习重点和难点是单总线协议的时序编程实现;

2,DS18B20数据手册 

DS18B20数据手册

上图为DS18B20的内部框图。内部的64位的ROM存储其独一无二的序列号。暂存存储器(The scratchpad memory)包含了存储有数字温度结果的2个字节宽度的温度寄存器。另外,暂存存储器还提供了一个字节的过温和低温(TH和TL)温度报警寄存器和一个字节的配置寄存器。配置寄存器允许用户自定义温度转换为9、10、11、12位精度。过温和低温(TH和TL)温度报警寄存器是非易失性的(EEPROM),所以其可以在设备断电的情况下保存。

DS18B20的另外一个特性就是可以无需外部电源供电。当数据线DQ为高的时候由其为设备供电。总线拉高的时候为内部电容(Spp)充电,当总线拉低是由该电容向设备供电。这种由1-Wire总线为设备供电的方式称为“寄生电源”。此外,DS18B20也可以由外部电源通过VDD供电。

DS18B20的核心功能是直接温度-数字测量。其温度转换可由用户自定义为9、10、11、12位精度分别为0.5℃、0.25℃、0.125℃、0.0625℃分辨率。值得注意的是,上电默认为12位转换精度。DS18B20上电后工作在低功耗闲置状态下。主设备必须向DS18B20发送温度转换命令[44h]才能开始温度转换。温度转换后,温度转换的值将会保存在暂存存储器的温度寄存器中,并且DS18B20将会恢复到闲置状态。如果DS18B20是由外部供电,当发送完温度转换命令[44h]后,主设备可以执行“读数据时序”,若此时温度转换正在进行DS18B20将会响应“0”,若温度转换完成则会响应“1”。如果DS18B20是由“寄生电源”供电,该响应的技术将不能使用,因为在整个温度转换期间,总线必须强制拉高。  

ROM 中的64 位序列号是出厂前被光刻好的,它可以看作是该DS18B20 的地址序列号。64 位光刻ROM 的排列是:开始8 位(28H)是产品类型标号,接着的48 位是该DS18B20 自身的序列号,最后8 位是前面56 位的循环冗余校验码。光刻ROM 的作用是使每一个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。 

DS18B20 温度传感器的内部存储器包括一个高速的暂存器RAM 和一个非易失性的可电擦除的EEPROM,后者存放高温度和低温度触发器TH、TL 和配置寄存器。 

配置寄存器是配置不同的位数来确定温度和数字的转化,配置寄存器结构如下: 

低五位一直都是"1",TM 是测试模式位,用于设置DS18B20 在工作模式还是在测试模式。在DS18B20 出厂时该位被设置为0,用户不需要去改动。R1 和R0 用来设置DS18B20 的精度(分辨率),可设置为9,10,11 或12 位,对应的分辨率温度是0.5℃,0.25℃,0.125℃和0.0625℃。R0 和R1 配置如下图: 

在初始状态下默认的精度是12 位,即R0=1、R1=1。高速暂存存储器由9 个字节组成,其分配如下: 

当温度转换命令(44H)发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0 和第1 个字节。存储的两个字节,高字节的前5 位是符号位S,单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如下: 

如果测得的温度大于0,这5 位为‘ 0’,只要将测到的数值乘以0.0625(默认精度是12 位)即可得到实际温度;如果温度小于0,这5 位为‘ 1’,测到的数值需要取反加1 再乘以-0.0625 即可得到实际温度。温度与数据对应关系如下: 

比如我们要计算+85 度,数据输出十六进制是0X0550,因为高字节的高5位为0,表明检测的温度是正温度,0X0550 对应的十进制为1360,将这个值乘以12 位精度0.0625,所以可以得到+85 度。 

知道了怎么计算温度,接下来我们就来看看如何读取温度数据,由于DS18B20是单总线器件,所有的单总线器件都要求采用严格的信号时序,以保证数据的完整性。DS18B20 时序包括如下几种:初始化时序、写(0 和1)时序、读(0和1)时序。DS18B20 发送所有的命令和数据都是字节的低位在前。这里我们简单介绍这几个信号的时序: 

2.1,初始化时序 

单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少480us(该时间的范围可以从480 到960 微妙),以产生复位脉冲。接着主机释放总线,外部的上拉电阻将单总线拉高,延时15~60 us,并进入接收模式。接着DS18B20 拉低总线60~240 us,以产生低电平应答脉冲,若为低电平,还要做延时,其延时的时间从外部上拉电阻将单总线拉高算起最少要
480 微妙。初始化时序图如下:

注意:主机释放总线是指主机将这个port置1,因为port置1后可以被从设备拉低,但如果port被置0,就不能被从设备拉高,因此释放总线是将这个port置1。

由上述初始化时序,编写初始化函数代码:

//DS18B20初始化
unsigned char ds18b20_init()
{
	DSPORT = 0; //主设备拉低总线,发送复位脉冲,持续时间超过480us

	void delay500us(void)   //误差 -0.859028845284us
	{
	    unsigned char a,b;
	    for(b=1;b>0;b--)
	        for(a=227;a>0;a--);
	}

	DSPORT = 1;   //释放总线

    unsigned char i = 0;
	while(DSPORT)	  //检测DS18B20是否在一定时间内拉低总线,
				      //根据时序图判断最长时间为300us
	{
	   if(i>20)
	   {
	   		return 0; //超过一定时间总线未被拉低,说明DS18B20没有发送存在脉冲
	   }

	   void delay20us(void)   //误差 -0.468396780902us
		{
		    unsigned char a,b;
		    for(b=3;b>0;b--)
		        for(a=1;a>0;a--);
		}

		i++;
	}

	return 1;   //DS18B20在一定时间内响应了		

}

初始化就是,主机发送复位脉冲,从机发送存在脉冲,双方都收到后,初始化完成。

2.2,读写时序 

下图为写时序图:

写时序有两种情况:“写1”时段和“写0”时段。主设备通过写1时段来向DS18B20中写入逻辑1以及通过写0时段来向DS18B20中写入逻辑0。每个写时段最小必须有60us的持续时间且独立的写时段间至少有1us的恢复时间。

为了形成写1时段,在将1-Wire总线拉低后,主设备必须在15us之内释放总线。当总线释放后,5kΩ的上拉电阻将总线拉至高。为了形成写0时段,在将1-Wire总线拉低后,在整个时段期间主设备必须一直拉低总线(至少60us)。

在主设备初始化写时段后,DS18B20将会在15us至60us的时间窗口内对总线进行采样。如果总线在采样窗口期间是高电平,则逻辑1被写入DS18B20;若总线是低电平,则逻辑0被写入DS18B20。

写时序对应代码:

//DS18B20写命令函数

void ds18b20_write(unsigned char data)
{
	unsigned char i,j;

	for(j = 0;j<8;j++)
	{
	 	DSPORT = 0;  //拉低总线,开始写时序,至少1us
		i++;
		DSPORT = data & 0x01; //从低字节开始
		
		void delay65us(void)   //持续至少60us
		{
		    unsigned char a;
		    for(a=28;a>0;a--);
		}

		DSPORT = 1;   //一个写周期后,至少间隔1us给总线恢复时间
		data >>= 1;   //数据左移1位
	}
}

下图为读时序图: 

仅在读时段期间DS18B20才能向主设备传送数据。因此,主设备在执行完读暂存寄存器[BEh]或读取供电模式[B4h]后,必须及时地生成读时段,这样DS18B20才能提供所需的数据。此外,主设备可以在执行完转换温度[44h]或拷贝EEPROM[B8h]命令后生成读时段,以便获得在“DS18B20功能命令”章节中提到的操作信息。

每个读时段最小必须有60us的持续时间且独立的写时段间至少有1us的恢复时间。读时段通过主设备将总线拉低超过1us再释放总线来实现初始化。当主设备初始化完读时段后,DS18B20将会向总线发送0或者1。DS18B20通过将总线拉至高来发送逻辑1,将总线拉至低来发送逻辑0。当发送完0后,DS18B20将会释放总线,则通过上拉电阻该总线将会恢复到高电平的闲置状态。从DS18B20中输出的数据在初始化读时序后仅有15us的有效时间。因此,主设备在开始改读时段后的15us之内必须释放总线,并且对总线进行采样。

//DS18B20 读命令函数

unsigned char DS18B20_read()
{
   unsigned char byte,bi;
   unsigned char i,j;

   for(j=0; j<8; j++)
   {
   	 DSPORT = 0;  //拉低总线,开始时序
	 i++;
	 DSPORT = 1;  //释放总线

	 void delay6us(void)   //延时6us等待总线上数据稳定
	{
	    unsigned char a;
	    for(a=1;a>0;a--);
	}

	bi = DSPORT;		  //要在15us内读取
	byte = (byte>>1)|(bi<<7);

	void delay45us(void)   //延时至少45us
	{
	    unsigned char a;
	    for(a=19;a>0;a--);
	}
   }
   return byte;
}

3,DS18B20工作流程

温度获取流程: 

DS18B20不会主动进行温度测量, 需要主控主动发起温度转换命令,这是因为温度转换本身需要耗电的,所以设计为平时待机,收到温度转换命令后才会进行温度AD转换;

主控和DS18B20之间通讯是分周期的,让DS18B20进行温度转换就是一个周期。周期包含初始化和N个命令(每个周期的开始都有初始化);

初始化主要探测目标DS18B20是否存在,若存在将芯片初始化;

命令很重要,DS18B20是一个典型的“命令-响应”型外设;这种外设的关键是命令集;

ROM操作指令:

DS18B20支持多个芯片串联在一个总线上,就是所谓的单总线协议,需要主控区分总线上多个DS18B20,因此需要ROM操作指令来完成这个任务;

ROM操作指令和温度采集一点关系都没有,所以当总线上只有一个DS18B20时,不需要管ROM操作指令;

系统中总线上有多个DS18B20,需要借助ROM操作指令来区分多个DS18B20,可能需要多条ROM操作指令来完成;

只有一个DS18B20时,使用SKIP ROM (0xCC)忽略;

功能指令:

ROM操作指令是为了在单总线上多个DS18B20中挑选那个我们要操作的DS18B20;

功能指令是为了和选定的DS18B20进行温度采样,常用温度转换指令和温度读取指令;

4,代码

时序代码: 

#include "timesires.h"
#include "uart.h"

void delay500us()   //误差 -0.859028845284us
{
    unsigned char a,b;
    for(b=1;b>0;b--)
        for(a=227;a>0;a--);
}

void delay20us(void)   //误差 -0.468396780902us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=1;a>0;a--);
}

void delay65us()   //持续至少60us
{
    unsigned char a;
    for(a=28;a>0;a--);
}

 void delay6us(void)   //延时6us等待总线上数据稳定
{
    unsigned char a;
    for(a=1;a>0;a--);
}

void delay45us(void)   //延时至少45us
{
    unsigned char a;
    for(a=19;a>0;a--);
}

void delay1ms(void)   //误差 -0.651041666667us
{
    unsigned char a,b;
    for(b=102;b>0;b--)
        for(a=3;a>0;a--);
}

void delay750ms(void)   //误差 -0.000000000171us
{
    unsigned char a,b,c;
    for(c=37;c>0;c--)
        for(b=66;b>0;b--)
            for(a=140;a>0;a--);
}


//DS18B20初始化
unsigned char ds18b20_init()
{
	unsigned char i = 0;
	DSPORT = 0; //主设备拉低总线,发送复位脉冲,持续时间超过480us

	delay500us();

	DSPORT = 1;   //释放总线

    
	while(DSPORT)	  //检测DS18B20是否在一定时间内拉低总线,
				      //根据时序图判断最长时间为300us
	{
	   if(i>20)
	   {
	   		return 0; //超过一定时间总线未被拉低,说明DS18B20没有发送存在脉冲
	   }

	   delay20us();

		i++;
	}

	return 1;   //DS18B20在一定时间内响应了		

}

//DS18B20写命令函数

void ds18b20_write(unsigned char cmd)
{
	unsigned char i = 0,j = 0;

	for(j = 0;j<8;j++)
	{
	 	DSPORT = 0;  //拉低总线,开始写时序,至少1us
		i++;
		DSPORT = cmd & 0x01; //从低字节开始
		
		delay65us();

		DSPORT = 1;   //一个写周期后,至少间隔1us给总线恢复时间
		cmd >>= 1;   //数据左移1位
	}
}

//DS18B20 读命令函数

unsigned char DS18B20_read()
{
   unsigned char byte = 0,bi = 0;
   unsigned char i = 0,j = 0;

   for(j=0; j<8; j++)
   {
   	 DSPORT = 0;  //拉低总线,开始时序
	 i++;
	 DSPORT = 1;  //释放总线

	delay6us();

	bi = DSPORT;		  //要在15us内读取
	byte = (byte>>1)|(bi<<7);

	delay45us();
   }
   return byte;
}

void DS18B20_changeTempCmd()
{
	ds18b20_init();
	delay1ms();		      //如果没有这个延时,读取的温度会有问题,用手捏着时在串口助手中看到的值不变
	ds18b20_write(0xcc);  //跳过ROM操作指令
	ds18b20_write(0x44);  //温度转换命令
	delay750ms();
	//delay750ms();
}

void DS18B20_readTempCmd()
{
   	ds18b20_init();
	delay1ms();
	ds18b20_write(0xcc);  //跳过ROM操作指令
	ds18b20_write(0xbe);  //温度读取命令
}

unsigned int DS18B20_Temp_Read()
{
   unsigned int temp = 0;
   unsigned char tmh = 0, tml = 0;
   DS18B20_changeTempCmd();
   DS18B20_readTempCmd();
   tml = DS18B20_read();
   tmh = DS18B20_read();

   temp = tmh;
   temp <<=8;
   temp |= tml;

   return temp;

}

串口代码:

#include "uart.h"


// 串口设置为: 波特率9600、数据位8、停止位1、奇偶校验无
// 使用的晶振是11.0592MHz的,注意12MHz和24MHz的不行
void uart_init(void)
{
	// 波特率9600
	SCON = 0x50;   	// 串口工作在模式1(8位串口)、允许接收
	PCON = 0x00;	// 波特率不加倍

	// 通信波特率相关的设置
	TMOD = 0x20;	// 设置T1为模式2
	TH1 = 253;
	TL1 = 253;	   	// 8位自动重装,意思就是TH1用完了之后下一个周期TL1会
					// 自动重装到TH1去

	TR1 = 1;		// 开启T1让它开始工作
//	ES = 1;
//	EA = 1;
}

// 通过串口发送1个字节出去
void uart_send_byte(unsigned char c)
{
   // 第1步,发送一个字节
   SBUF = c;

   // 第2步,先确认串口发送部分没有在忙
   while (!TI);

   // 第3步,软件复位TI标志位
   TI = 0;
}

void uart_send_adVal(unsigned int val)
{
	
	 uart_send_byte(val>>8);   //AD采样的数据为12位的,首先左移8位串口输出高4位
	 uart_send_byte(val);	   //再输出低8位
}

main.c

 

#include "timesires.h"
#include "uart.h"
#include <intrins.h>

void delay1s(void)   //误差 -0.000000000227us
{
    unsigned char a,b,c;
    for(c=13;c>0;c--)
        for(b=247;b>0;b--)
            for(a=142;a>0;a--);
    _nop_();  //if Keil,require use intrins.h
}

void main()
{
  unsigned int ret = 0;
  uart_init();
 
	while(1)
	{
		ret = DS18B20_Temp_Read();
		uart_send_adVal(ret);
		delay1s();
	}

}

代码完成后遇到一个问题:用手捏着DS18B20发现在串口调试助手中看到的值不变化,

原因:DS18B20_changeTempCmd()函数中,初始化后没有进行时间延迟,直接发送ROM操作命令ds18b20_write(0xcc),增加延迟函数后串口助手中显示值当用手捏着DS18B20会有变化。

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

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

相关文章

nginx-error错误页面

客户访问发生错误时&#xff0c;nginx返回给客户的错误页面。 例&#xff1a;客户访问的资源不存在时&#xff0c;返回302并跳转到一个网站。 2.可以返回200&#xff0c;给客户返回一个401.html的页面&#xff0c;这个页面可以做的友好一点&#xff0c;返回给客户。

【Java实战项目】【超详细过程】—大饼的图片服务器01

目录 一、该图片服务器的功能二、设计数据库设计前后端交互设计新增图片查看所有图片属性查看指定图片属性删除指定图片查看部分图片内容 一、该图片服务器的功能 1.可以选择文件上传或删除 2.拥有防盗功能 3.展示图片 二、设计 数据库设计 图片表中需要储存的数据有&#…

zabbix企业微信告警

目前&#xff0c;企业微信使用要设置可信域名 华为云搜索云函数 创建函数 选择http函数&#xff0c;随便输入函数名字 回到函数列表&#xff0c;选择刚创建的函数&#xff0c;创建触发器&#xff0c;安全模式选择none 点击右上角管理 选刚创建的api&#xff0c;右边操作点…

JVM中JAVA对象和数组内存布局

对象 数组 在Java中&#xff0c;所有的对象都是一种特殊的数组&#xff0c;它们的元素可以是基本数据类型、其他对象引用或者其他任何类型。Java对象和数组的内存布局包含以下部分&#xff1a; 1.对象头&#xff08;Object Header&#xff09; 每个Java对象都有一个对象头&am…

关于异或的小疑惑

今天写c&#xff0c;当我写出如下代码时&#xff0c;编译器报错了 #include<bits/stdc.h>using namespace std;int main(){int a1,b3,c2,d6;// cout<<(a^b^c^d)<<endl;cout<<a^b^c^d<<endl;return 0; } D:\sublineText\demo\demo.cpp: In funct…

UE4 Physics Constraint Actor 实现钟摆效果

放入场景&#xff0c;然后将一个球体放入场景 选择小球 将小球改为Movable 选择模拟物理&#xff0c;并将小球移除平衡点 就实现了

SAP-PP:基础概念笔记-5(物料主数据的工作计划视图)

文章目录 前言一、工作计划视图Production Supervisor 生产管理员生产计划参数文件序列号参数文件&#xff1a;序列化级批次管理批次管理工厂&#xff1a;需要批量记录&#xff1a;批量输入&#xff1a;不足交货允差 Underdelivery Tolerance&#xff1a;过度交货允差 Overdeli…

SAP-Tech:SAP EDI出站流程处理组件概念

文章目录 出站流程所使用的组件IDoc结构选择程序消息控制端口定义RFC目的地合作伙伴文件服务程序和配置表 总结 出站流程所使用的组件 出站流程使用了 IDoc类型&#xff0c;消息控制&#xff0c;伙伴文件&#xff0c;选择程序&#xff0c;服务程序&#xff0c;和生成IDoc的表。…

Linux驱动中常用的一些接口函数(经典)

​第一&#xff1a;设备树相关 查找节点的of函数 of_find_node_by_name struct device_node *of_find_node_by_name(struct device_node *from, const char *name);通过节点名字查找指定的节点 from&#xff1a;要开始查找的节点 name&#xff1a;节点名字 of_find_node_…

CSS 滚动驱动动画 scroll()

CSS 滚动驱动动画 scroll() animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提供一个匿名的 scroll progress timeline. 通过元素在顶部和底部(或左边和右边)的滚动推进 scroll progress timeline. 并且元素滚动的位置会被转换为百分比, 滚动开始被转化为…

Nginx详解 四:重写功能

文章目录 1. 重写功能简介2. if 指令2.1 基本语法 3. return 指令3.1 语法格式3.2 示例3.2.1 状态码及响应报文返回3.2.2 URL返回 4. set 指令4.1 基本语法4.2 示例 5. break 指令5.1 示例 6. rewrite 指令6.1 语法格式6.2 rewrite flag部分使用介绍6.3 示例6.3.1 重写URL路径:…

攻防世界-Broadcast

原题 解题思路 原以为要运行py文件&#xff0c;结果打开就有

信息系统项目管理师(第四版)教材精读思维导图-第十章项目进度管理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 本章思维导图PDF格式 本章思维导图XMind源文件 ​ 目录 10.1 管理基础 10.2 管理过程 10.3…

华为静态路由配置实验(超详细讲解+详细命令行)

系列文章目录 华为数通学习&#xff08;7&#xff09; 前言 一&#xff0c;静态路由配置 二&#xff0c;网络地址配置 AR1的配置&#xff1a; AR2的配置&#xff1a; AR3的配置&#xff1a; 三&#xff0c;测试是否连通 AR1的配置: 讲解&#xff1a; AR2的配置&#…

如何制作一个百货小程序

在这个数字化时代&#xff0c;小程序已成为各行各业的必备工具。其中&#xff0c;百货小程序因其便捷性和多功能性&#xff0c;越来越受到人们的青睐。那么&#xff0c;如何制作一个百货小程序呢&#xff1f;下面&#xff0c;我们就详细介绍一下无需编写代码的步骤。 一、进入后…

如何在虚拟机上安装各类操作系统(以CentOS7系统为例)

1.安装 VMware Workstation Pro 官方下载链接: 官方已经出到17了&#xff0c;我用的是16 https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html 成功安装效果如下&#xff1a; 2.准备对应操作系统的ISO镜像文件 我们要下载CentOS7系统&am…

Nginx详解 第五部分:Ngnix反向代理(负载均衡 动静分离 缓存 透传 )

Part 5 一、正向代理与反向代理1.1 正向代理简介1.2 反向代理简介 二、配置反向代理2.1 反向代理配置参数2.1.1 proxy_pass2.1.2 其余参数 2.2 配置实例:反向代理单台web服务器2.3 代理转发 三、反向代理实现动静分离四、缓存功能五、反向代理客户端的IP透传5.1 原理概述5.2 一…

PCL error C4996和warning C4819 解决办法

每当新建一个项目时&#xff0c;常常会遇到这两个错误&#xff0c;这次记录一下解决办法加深记忆 1.error C4996 报错&#xff1a;error C4996 ‘pcl::PassThroughpcl::PointXYZ::setFilterLimitsNegative’: use inherited FilterIndices::setNegative() instead (It will b…

React 第一个Demo

0x00 前言 CTF 加解密合集CTF Web合集网络安全知识库 次笔记仅记录学习React过程中的笔记&#xff0c;因为有必要掌握一门前端的框架&#xff0c; 在vue和React中选择了React。 0x01 正文 目标&#xff1a; 实现Demo&#xff1a; <!DOCTYPE html> <html lang&q…

java-方法重载

定义&#xff1a;一个类中&#xff0c;出现多个方法名称相同&#xff0c;但是他们的行参列表不同&#xff0c;那么这些方法就称为方法重载了。