“DS18B20,感知每一度细微变化,记录每一刻温暖。”#DS18B20温度传感器

news2024/11/16 2:58:26

“DS18B20,感知每一度细微变化,记录每一刻温暖。”#DS18B20温度传感器

    • 前言
    • 预备知识
    • 1.DS18B20核心参数
    • 2.DS18B20初始化函数代码编写
      • 2.1分析DS18B20初始化时序图
      • 2.2依据时序图编写相应代码
    • 3.向DS18B20写入一个字节函数代码编写
      • 3.1分析DS18B20写时序图
      • 3.2依据时序图编写相应代码
    • 4.向DS18B20中读取一个字节数据函数代码编写
      • 4.1分析SD18B20读时序图
      • 4.2依据时序图编写相应代码
    • 5.DS18B20的ROM指令表和RAM指令表
      • 5.1ROM指令表
      • 5.2RAM指令表
    • 6.DS18B20指令使用规则
    • 7.DS18B20温度转换指令函数代码编写
      • 7.1温度转换指令代码编写思路
      • 7.2温度转换指令函数代码
    • 8.读DS18B20温度指令函数代码编写
      • 8.1读取温度指令代码编写思路
      • 8.2读取温度指令函数代码
    • 9.读取DS18B20温度数据函数代码编写
      • 9.1DS18B20传数据规则
      • 9.2读取温度数据代码编写思路
      • 9.3读取温度数据函数代码
    • 10. 16位温度数据处理函数代码编写
      • 10.1DS18B20温度转换规则
      • 10.2 16位温度数据处理函数代码
    • 11.DS18B20完整驱动程序代码
    • 结束语

前言

  本篇博文介绍的是用STC89C52RC 51单片机驱动DS18B20温度传感器,包含DS18B20核心参数,DS18B20初始化函数代码编写,向DS18B20写入一个字节函数代码编写,向DS18B20中读取一个字节数据函数代码编写,DS18B20的ROM指令表和RAM指令表,DS18B20指令使用规则,DS18B20温度转换指令函数代码编写,读DS18B20温度指令函数代码编写,读取DS18B20温度数据函数代码编写,16位温度数据处理函数代码编写,DS18B20完整驱动程序代码。看到这篇博文的朋友,可以先赞再看吗?

预备知识

  一、基本电路标识识别,例如VCC,GND。
  二、电脑基本操作复制粘贴
  三、分文件编程
  四、C变量
  五、基本输入输出
  六、流程控制
  七、函数

  如果以上知识不清楚,请自行学习后再来浏览,或者私信我。如果我有没例出的,请在评论区写一下。谢谢啦!

1.DS18B20核心参数

  1. 电压范围:3.0~5.5V
  2. DS18B20在与微处理器(单片机)连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
  3. DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
  4. 温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
  5. 负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。

在这里插入图片描述

2.DS18B20初始化函数代码编写

2.1分析DS18B20初始化时序图

在这里插入图片描述

2.2依据时序图编写相应代码

//返回1存在 返回0不存在
unsigned char initDS18B20()  //初识化DS18B20函数
{
	unsigned char i = 0;       //等待超时控制变量
	/* 以下代码是根据初始化DS18B20时序图进行编写 */
	DQ = 0;                    //先让DQ为低电平
	Delay642us();              //保持低电平642微妙
	DQ = 1;                    //再让DQ为高电平
	while(DQ)                  //如果DS18B20存在,DQ被拉低。检测是否拉低,拉低返回1
	{
		i++;                     //等待超时控制变量自增1
		Delay1ms();              //延时1毫秒
		if(i>4)                  //i加一次就延时1毫秒,大于4,相当于i = 5执行if内的语句,延时5毫秒。
		{
			return 0;              //返回没有检测到DS18B20的数据0
		}
	}
	return 1;                  //返回1
}

3.向DS18B20写入一个字节函数代码编写

3.1分析DS18B20写时序图

在这里插入图片描述

3.2依据时序图编写相应代码

void writeByteDS18B20(unsigned char DSdata)   //向DS18B20写1个字节数据函数
{
	unsigned char i;                            //for循环控制变量i
	/* 以下代码是根据写DS18B20时序图进行编写 */
	for(i=0; i<8; i++)                          //循环执行8次
	{
		DQ = 0;                                   //先让DQ为低电平       
		Delay15us();                              //保持低电平15微妙
		DQ = DSdata & 0x01;                       //让要发送的数据和0x01相与,以达到把数据的最低位发送给DS18B20,因为发送数据是从低位开始发送
		Delay60us();                              //等待60微妙发送1位数据
		DQ = 1;                                   //让DQ为高电平
		DSdata = DSdata >> 1;                     //让需要发送的数据右移一位,准备次低位以便下一次循环发送
	}
}

-----------------------------------------------------------------------------------------------------------------
数据处理代码分析

DQ = DSdata & 0x01;
DSdata是要写入DS18B20的数据,如写入 1100 0011
    1100 0011
&   0000 0001
=   0000 0001
通过与运算后数据变成了0x01,也就是发送了最低位的数据给DQ

DSdata = DSdata >> 1;
DSdata右移一位,准备次低位以便下一次循环发送
    1100 0011
>>1 0110 0001
    
这样循环执行8次即可写入一个字节数据

4.向DS18B20中读取一个字节数据函数代码编写

4.1分析SD18B20读时序图

在这里插入图片描述

4.2依据时序图编写相应代码

unsigned char readByteDS18B20()               //向DS18B20读取1字节数据函数
{
	unsigned char i;                            //for循环控制变量i
	unsigned char tmp,dataDs;                   //过度变量tmp,暂时存放读取到的1位数据,完整1字节读取数据变量datyDs
	/* 以下代码是根据读DS18B20时序图进行编写 */
	for(i=0; i<8; i++)                          //循环执行8次
	{
		DQ = 0;                                   //让DQ为低电平
		_nop_();                                  //执行一个空函数经过5微妙,时序图中是大于1微妙,符合
		DQ = 1;                                   //让DQ为高电平,释放总线准备读取数据
		Delay10us();                              //延时10微妙等待总线被释放
		tmp = DQ;                                 //将DS18B20的1位数据读入tmp
		dataDs =(dataDs >> 1)|(tmp << 7);         //先让dataDs右移一位再与左移7位的tmp相或实现将tmp中的数据从左装入dataDs.
		Delay45us();                              //延时45微妙,等待读取一位数据
	}
	
	return dataDs;                              //返回读取到的数据
}

-----------------------------------------------------------------------------------------------------------------
数据处理代码分析

dataDs =(dataDs >> 1)|(tmp << 7);
先让dataDs右移一位再与左移7位的tmp相或实现将tmp中的数据从左装入;如
    dataDs  = 0000 0000
    tmp     = 0000 0001
dataDs >> 1 = 0000 0000
tmp    << 7 = 1000 0000
dataDs | tmp= 1000 0000
第二次
    dataDs  = 1000 0000
    tmp     = 0000 0001
dataDs >> 1 = 0100 0000
tmp    << 7 = 1000 0000
dataDs | tmp= 1100 0000
注意DQ存入tmp的数据从低位存入
    
这样循环执行8次即可完成一个字节的读取

5.DS18B20的ROM指令表和RAM指令表

5.1ROM指令表

在这里插入图片描述

  使用标记的指令即可

5.2RAM指令表

在这里插入图片描述

  使用标记的指令即可

6.DS18B20指令使用规则

  使用顺序为先ROM再RAM,不能先ROM再RAM在RAM,这样会出问题。

7.DS18B20温度转换指令函数代码编写

7.1温度转换指令代码编写思路

  初始化——>等待1毫秒初始化——>跳过ROM——>向RAM写入温度转换指令0x44

7.2温度转换指令函数代码

void changTmDS18NB20()                        //DS18B20温度转换指令函数
{
	initDS18B20();                              //先初始化DS18B20
	Delay1ms();                                 //等待1毫秒让DS18B20初始化完毕
	writeByteDS18B20(0xcc);                     //向DS18B20写入跳过ROM指令0xcc
	writeByteDS18B20(0x44);                     //向DS18B20的RAM中写入温度转换指令0x44
}

8.读DS18B20温度指令函数代码编写

8.1读取温度指令代码编写思路

  初始化——>等待1毫秒初始化——>跳过ROM——>向RAM写入读温度指令0xbe

8.2读取温度指令函数代码

void readTmHandlerDS18B20()                   //读DS18B20温度指令函数
{
	initDS18B20();                              //先初始化DS18B20
	Delay1ms();                                 //等待1毫秒让DS18B20初始化完毕
	writeByteDS18B20(0xcc);                     //向DS18B20写入跳过ROM指令0xcc
	writeByteDS18B20(0xbe);	                    //向DS18B20的RAM中写入读取数据指令0xbe
}

9.读取DS18B20温度数据函数代码编写

9.1DS18B20传数据规则

  DS18B20采用16位存储数据,分为两个8位RAM存储,一个存放高八位,一个存放低八位。在传温度数据时先传低位再传高位

9.2读取温度数据代码编写思路

  发送温度转换命令——>发送读取温度数据指令——>读取低8位温度数据——>读取高8位温度数据——>高低8位数据组合成一个16位的数据

9.3读取温度数据函数代码

int readTmDataDS18B20()                       //读取DS18B20数据函数
{
	unsigned char tmh,tml;                      //DS18B20传回的数据是16位的,分位高8和低8位,tmh高8,tml低8
	int temp = 0;                               //存放16位温度变量temp
	changTmDS18NB20();                          //让DS18B20转换温度
	readTmHandlerDS18B20();                     //让DS18B20准备读取数据
	tml  = readByteDS18B20();                   //读取数据是从低八为开始读;读低八位数据到tml
	tmh  = readByteDS18B20();                   //读高八位数据到tmh
	temp = tmh;                                 //把高8位数据存入temp
	temp = temp << 8;                           //把temp左移8位,给低八位留位置
	temp |=tml;                                 //让temp与低8位tml相或实现存入低8位
	
	return temp;                                //返回完整16位温度数据
}

-----------------------------------------------------------------------------------------------------------------
数据处理代码分析
    
temp = temp << 8;
把temp左移8位,给低八位留位置
temp为整型,占两个字节(16位)
temp存数据时从低位开始存;如:
temp       = 0000 0000 1100 0011
temp << 8  = 1100 0011 0000 0000

temp |=tml;
让temp与低8位tml相或实现存入低8位
tml和tmh为字符型,占8位一个字节;如:
tml                  = 1100 0011
temp       = 1100 0011 0000 0000
temp | tml = 1100 0011 1100 0011

这样就实现了两个8位拼接成一个16位的数据

10. 16位温度数据处理函数代码编写

10.1DS18B20温度转换规则

  温度传感器的精度为用户可编程的9101112位,分别以0.5℃0.25℃0.125℃0.0625℃增量递增。在上电状态下默认的精度为12位

  这是12位转化后得到的12位数据,存储在DS18B20的两个8位的RAM中,高字节的前5位是符号位,如果测得的温度大于0,这5位为‘0’,只要将测到的数值乘以0.0625即可得到实际温度;如果温度小于0,这5位为‘1’,测到的数值需要先减1再取反再乘以0.0625即可得到实际温度。

  温度寄存器格式表

在这里插入图片描述

  注意:标记处为符号位

  温度数据关系表

在这里插入图片描述

  注意:标记处代表了在做有关温度控制的项目时要对温度做多重判断,以免出现bug。

10.2 16位温度数据处理函数代码

int tmDataHandler()                           //16位温度数据处理函数
{
	int temp;                                   //处理后的温度数据存放变量temp
	float tmp;                                  //温度数据处理临时变量
	temp = readTmDataDS18B20();                 //把读取到的温度数据存入temp
	
	if(temp < 0)                                //温度为负数
	{
		temp--;                                   //温度数据减一
		temp = !temp;                             //温度数据取反
		tmp = temp;                               //整型数据温度存入浮点型温度处理临时变量tmp中,实现强转为浮点型
		temp = tmp * 0.0625 * 100;                //将浮点型的温度数乘以精度数据0.0625实现真正温度数据转换,*100将数据扩大100倍实现从两位数变到4位数,以便数码管显示数据时使用
	}
	else                                        //温度为正数
	{
		tmp = temp;                               //整型数据温度存入浮点型温度处理临时变量tmp中,实现强转为浮点型            
		temp = tmp * 0.0652 * 100;                //将浮点型的温度数乘以精度数据0.0625实现真正温度数据转换,*100将数据扩大100倍实现从两位数变到4位数,以便数码管显示数据时使用
	}

	return temp;                                //返回处理后的温度数据
}

-----------------------------------------------------------------------------------------------------------------
温度数据处理分析已写入代码注释,请认真看,不懂私信我。

11.DS18B20完整驱动程序代码

#include "reg52.h"        			//51单片机基本库
#include "delay.h"              //DS18B20单总线时序需要使用到演示函数
#include "intrins.h"            //DS18B20单总线时序需要使用到空函数

sbit DQ = P2^4;                 //DS18B20数据端接单片机P2.4口

//返回1存在 返回0不存在
unsigned char initDS18B20()  //初识化DS18B20函数
{
	unsigned char i = 0;       //等待超时控制变量
	/* 以下代码是根据初始化DS18B20时序图进行编写 */
	DQ = 0;                    //先让DQ为低电平
	Delay642us();              //保持低电平642微妙
	DQ = 1;                    //再让DQ为高电平
	while(DQ)                  //如果DS18B20存在,DQ被拉低。检测是否拉低,拉低返回1
	{
		i++;                     //等待超时控制变量自增1
		Delay1ms();              //延时1毫秒
		if(i>4)                  //i加一次就延时1毫秒,大于4,相当于i = 5执行if内的语句,延时5毫秒。
		{
			return 0;              //返回没有检测到DS18B20的数据0
		}
	}
	return 1;                  //返回1
}

void writeByteDS18B20(unsigned char DSdata)   //向DS18B20写1个字节数据函数
{
	unsigned char i;                            //for循环控制变量i
	/* 以下代码是根据写DS18B20时序图进行编写 */
	for(i=0; i<8; i++)                          //循环执行8次
	{
		DQ = 0;                                   //先让DQ为低电平       
		Delay15us();                              //保持低电平15微妙
		DQ = DSdata & 0x01;                       //让要发送的数据和0x01相与,以达到把数据的最低位发送给DS18B20,因为发送数据是从低位开始发送
		Delay60us();                              //等待60微妙发送1位数据
		DQ = 1;                                   //让DQ为高电平
		DSdata = DSdata >> 1;                     //让需要发送的数据右移一位,准备次低位以便下一次循环发送
	}
}

unsigned char readByteDS18B20()               //向DS18B20读取1字节数据函数
{
	unsigned char i;                            //for循环控制变量i
	unsigned char tmp,dataDs;                   //过度变量tmp,暂时存放读取到的1位数据,完整1字节读取数据变量datyDs
	/* 以下代码是根据读DS18B20时序图进行编写 */
	for(i=0; i<8; i++)                          //循环执行8次
	{
		DQ = 0;                                   //让DQ为低电平
		_nop_();                                  //执行一个空函数经过5微妙,时序图中是大于1微妙,符合
		DQ = 1;                                   //让DQ为高电平,释放总线准备读取数据
		Delay10us();                              //延时10微妙等待总线被释放
		tmp = DQ;                                 //将DS18B20的1位数据读入tmp
		dataDs =(dataDs >> 1)|(tmp << 7);         //先让dataDs右移一位再与左移7位的tmp相或实现将tmp中的数据从左装入dataDs.
		Delay45us();                              //延时45微妙,等待读取一位数据
	}
	
	return dataDs;                              //返回读取到的数据
}

void changTmDS18NB20()                        //DS18B20温度转换指令函数
{
	initDS18B20();                              //先初始化DS18B20
	Delay1ms();                                 //等待1毫秒让DS18B20初始化完毕
	writeByteDS18B20(0xcc);                     //向DS18B20写入跳过ROM指令0xcc
	writeByteDS18B20(0x44);                     //向DS18B20的RAM中写入温度转换指令0x44
}

void readTmHandlerDS18B20()                   //读DS18B20温度指令函数
{
	initDS18B20();                              //先初始化DS18B20
	Delay1ms();                                 //等待1毫秒让DS18B20初始化完毕
	writeByteDS18B20(0xcc);                     //向DS18B20写入跳过ROM指令0xcc
	writeByteDS18B20(0xbe);	                    //向DS18B20的RAM中写入读取数据指令0xbe
}

int readTmDataDS18B20()                       //读取DS18B20数据函数
{
	unsigned char tmh,tml;                      //DS18B20传回的数据是16位的,分位高8和低8位,tmh高8,tml低8
	int temp = 0;                               //存放16位温度变量temp
	changTmDS18NB20();                          //让DS18B20转换温度
	readTmHandlerDS18B20();                     //让DS18B20准备读取数据
	tml  = readByteDS18B20();                   //读取数据是从低八为开始读;读低八位数据到tml
	tmh  = readByteDS18B20();                   //读高八位数据到tmh
	temp = tmh;                                 //把高8位数据存入temp
	temp = temp << 8;                           //把temp左移8位,给低八位留位置
	temp |=tml;                                 //让temp与低8位tml相或实现存入低8位
	
	return temp;                                //返回完整16位温度数据
}

int tmDataHandler()                           //16位温度数据处理函数
{
	int temp;                                   //处理后的温度数据存放变量temp
	float tmp;                                  //温度数据处理临时变量
	temp = readTmDataDS18B20();                 //把读取到的温度数据存入temp
	
	if(temp < 0)                                //温度为负数
	{
		temp--;                                   //温度数据减一
		temp = !temp;                             //温度数据取反
		tmp = temp;                               //整型数据温度存入浮点型温度处理临时变量tmp中,实现强转为浮点型
		temp = tmp * 0.0625 * 100;                //将浮点型的温度数乘以精度数据0.0625实现真正温度数据转换,*100将数据扩大100倍实现从两位数变到4位数,以便数码管显示数据时使用
	}
	else                                        //温度为正数
	{
		tmp = temp;                               //整型数据温度存入浮点型温度处理临时变量tmp中,实现强转为浮点型            
		temp = tmp * 0.0652 * 100;                //将浮点型的温度数乘以精度数据0.0625实现真正温度数据转换,*100将数据扩大100倍实现从两位数变到4位数,以便数码管显示数据时使用
	}

	return temp;                                //返回处理后的温度数据
}

结束语

  很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!

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

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

相关文章

Zoho工作邮箱支持哪些功能?

工作域名邮箱都有哪些常见功能呢&#xff1f;一、消息流 &#xff1b;二、邮件委托给同事代为处理&#xff1b;三、附件查看器 &#xff1b;四、在邮箱里直接和同事音频/视频通话等八大功能。 一、消息流 - 邮箱里的社交渠道 Zoho Mail等专业工作邮箱平台引入了消息流功能&…

免账户免权限免费获取 A股 全市场股票ETF指数 分钟级数据

日期 2024/8/2 意外发现的&#xff0c;抛砖引玉&#xff0c;测试了下&#xff0c;其他券商的也可以。 可以直接获取 1m 5m 1day 级别的数据&#xff0c;全A股市场的都可以。期货未测试。 需要 其他的级别的分数数据可以自行合成。 原理 券商版qmt获取行情数据时&#xff0c;不…

JavaSE之常用API(后篇)

接上篇 五、Random 5.1 使用 5.2 练习 六、包装类 6.1 是什么 包装类:封装了基本类的一些操作,更加方便使用 为了对象的完整性,更重要的是配合泛型一起使用 byte Byte short Short int Integer long Long float Float double Double boolean Boolean char Character 八种包装…

Cadence学习笔记 Day0 Cadence17.4环境安装

当然是选择“吴法安装” 直接跟着吴川斌博客的方法来就可以了&#xff0c;这里大致记录一下我的安装步骤&#xff1a; 安装许可证管理器破解许可证管理器安装软件以及补丁破解软件 获取 直接放出链接&#xff1a;吴川斌的博客 下载得到&#xff1a; 一、安装许可证管理器&am…

Redis未授权利用方式总结

前言 目前的大多数网站搭建的Redis 均采用 docker 一键部署的方式&#xff0c;而 docker 镜像中的 redis 默认不是以 root 权限运行的&#xff0c;也就是说即使拿下这台 redis&#xff0c;我们也只能在对方服务器的本地内网中漫游&#xff0c;当然还是会有部分 redis 部署在服…

Tensorflow—第四讲网络八股扩展

本讲概述 一、自制数据集 我们用六万张数字图片自制训练集&#xff0c;一万张数字图片制作测试集 代码&#xff08;注释已经很清楚了&#xff0c;就不解释了&#xff09;&#xff1a; def generateds(path, txt):f open(txt, r) # 以只读形式打开txt文件contents f.readl…

【喜报】龙信助力上饶市公安局斩获全国刑侦部门数据侦查技战法大赛两项大奖

文章关键词&#xff1a;电子数据取证、手机取证、云取证、现场勘查、电子物证 8月2日&#xff0c;全国刑侦部门数据侦查技战法大赛在福建晋江市落下帷幕。来自全国各地的33支参赛队伍汇聚一堂&#xff0c;展现了全国公安刑侦部门数据侦查的新思路、新做法。 在这一高水平的竞技…

ant tree 数据的最优解

项目背景 : react ant ant 官网中目前只提供了 默认父子关联 或 checkStrictly(父子不关联)注意 : 不能盲目选择父子关联 , 虽然选中父 , 子也联动确实是需要的效果 , 但有一个bug 如下图 (当选中部分子 , 所有子被选中)解决方案 : 只能取消父子关联 , 自己去判断当前点击处…

C Primer Plus 第7章——第一篇

你该逆袭了 第7章:重点摘录 零、本章介绍一、if 语句二、if else 语句1、介绍 getchar( ) 和 putchar( )2、ctype.h 系列 的 字符函数(1)、isalnum( )(2)、isalpha( )(3)、isblank( )(4)、iscntrl( )(5)、isdigit( )(6)、isgraph( )(7)、islower( )(8)、isprint( )(9)、ispunct…

CV党福音:YOLOv8实现分类

YOLO作为目标检测领域的常青树&#xff0c;如今以及更新到了YOLOv10&#xff0c;并且还有YOLOX、YOLOS等变体&#xff0c;可以说该系列已经在目标检测领域占据了半壁江山&#xff0c;如今&#xff0c;YOLOv8的发行者ultralytics竟有一统江山之意&#xff0c;其在提出的框架中不…

基于Springboot+Vue3的简易教学管理系统

作品展示 基于SpringbootVue3的简易信息教学管理系统 第1章 系统设计 1.1 系统功能模块设计 该系统实现的功能模块包括&#xff1a; 教师端&#xff1a; 学生信息管理&#xff1a;添加、删除、修改以及查询学生信息 √课程信息管理&#xff1a;添加、删除、修改以及查…

智慧图书馆:构建高效视频智能管理方案,提升图书馆个性化服务

一、背景分析 随着信息技术的飞速发展&#xff0c;智慧图书馆作为现代公共文化服务的重要载体&#xff0c;正逐步从传统的纸质阅读空间向数字化、智能化方向转型。其中&#xff0c;视频智能管理方案作为智慧图书馆安全管理体系的重要组成部分&#xff0c;不仅能够有效提升图书…

深入浅出Mysql 第二期

从更新语句中看日志系统 探究技术的本质&#xff0c;享受技术的乐趣&#xff01;由于时间原因以及自己的原因导致拖更了&#xff0c;不过没关系&#xff0c;我保证后面每天一更&#xff0c;周末休息&#xff01;好了&#xff0c;闲话少说&#xff0c;今天我们通过一个更新操作…

数组案例练习进阶版---对数组中的元素进行排序(冒泡法)

在上篇文章中&#xff0c;我们一起学习了常用排序法中的选择排序法&#xff0c;今天&#xff0c;我们将一起来学习新的排序方法——冒泡法排序 那么首先&#xff0c;什么是冒泡法呢&#xff1f; 首先&#xff0c;第一列&#xff0c;我们有四个大小不一的球&#xff0c;我们称最…

4款ai 制作 ppt工具帮你提高工作效率

在这个高度重视可视化展示的环境当中&#xff0c;PPT在许多的场合中都骑着非常重要的作用&#xff0c;但PPT制作过程却常常令人感到烦恼。而最近我发现了4个堪称神器的PPT制作工具&#xff0c;可以分享给大家。 1、笔灵 ppt 直通车&#xff1a;https://ibiling.cn/ppt-zone 这…

数据结构与算法 - 红黑树

一、概述 1. 历史 红黑树是一种自平衡二叉查找树&#xff0c;最早由一名叫Rudolf Bayer的德国计算机科学家于1972年发明。然而&#xff0c;最初的树形结构不是现在的红黑树&#xff0c;而是一种称为B树的结构&#xff0c;它是一种多叉树&#xff0c;可以用于在磁盘上存储大量…

美国司法部对谷歌反垄断案的最新进展,Google每年给苹果200亿?

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 美国司法部对谷歌反垄断案的前因和最新进展 美国司法部对谷歌的反垄断案是一个复杂且历时长久的法律过程&#xff0c;其核心争议在于谷歌是否利…

CentOS 7.6 安装 Weblogic

注&#xff1a;本教程是以虚拟机作为安装环境&#xff0c;如果您公司需要安装 Weblogic 服务器&#xff0c;请先以虚拟机模拟安装一遍&#xff0c;否则出现失误&#xff0c;概不负责&#x1f601;。 一、环境 虚拟机&#xff1a;VMware Workstation 16 Linux&#xff1a;Cent…

@Autowired提示:Field injection is not recommended

1、问题 在项目升级版本过程中&#xff0c;Autowired提示Field injection is not recommendedField injection is not recommended Inspection info: Reports injected or autowired fields in Spring components. The quick-fix suggests the recommended constructor-based d…

Linux 下查看 CPU 使用率

目录 一、什么是 CPU 使用率二、查看 CPU 利用率1、使用 top 查看2、用 pidstat 查看3、用 ps 查看4、用 htop 查看5、用 nmon 查看6、用 atop 查看7、用 glances 查看8、用 vmstat 查看9、用 sar 查看10、dstat11、iostat 三、总结 CPU 使用率是最直观和最常用的系统性能指标&…