51单片机——DS18B20 温度传感器实验,小白讲解,相互学习

news2025/7/8 14:29:07
DS18B20 介绍
        DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接 口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、 适用电压宽、与微处理器接口简单的数字化温度传感器。
DS18B20 温度传感器具有如下特点:
1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据 线供电。
2、独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即 可实现微处理器与 DS18B20 的双向通讯。
3、DS18B20 支持多点组网功能,多个 DS18B20 可以并联在唯一的三线上, 实现组网多点测温。
4、DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成 在形如一只三极管的集成电路内。
5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
6、可编程的分辨率为 9~12 位,对应的可分辨温度分别为 0.5℃、0.25℃、 0.125℃ ,0.0625℃,可实现高精度测温。
7、在 9 位分辨率时最多在 93.75ms 内把温度转换为数字,12 位分辨率时最多在 750ms 内把温度值转换为数字,速度更快。
8、测量结果直接输出数字温度信号,以"一根总线"串行传送给 CPU,同时可传送 CRC 校验码,具有极强的抗干扰纠错能力。
9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。DS18B20 外观实物如下图所示:
        从 DS18B20 外观图可以看到,当我们正对传感器切面(传感器型号字符那 一面)时,传感器的管脚顺序是从左到右排列。管脚 1 为 GND,管脚 2 为数据 DQ,管脚 3 为 VDD。如果把传感器插反,那么电源将短路,传感器就会发烫, 很容易损坏,所以一定要注意传感器方向,通常我们在开发板上都会标出传感器 的凸起出,所以只需要把传感器凸起的方向对着开发板凸起方向插入即可。
DS18B20 内部结构如下图所示:

        ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的 地址序列号。64 位光刻 ROM 的排列是:开始 8 位(28H)是产品类型标号,接 着的 48 位是该 DS18B20 自身的序列号,最后 8 位是前面 56 位的循环冗余校 验码。光刻 ROM 的作用是使每一个 DS18B20 都各不相同,这样就可以实现一根 总线上挂接多个 DS18B20 的目的。
        DS18B20 温度传感器的内部存储器包括一个高速的暂存器 RAM 和一个非易 失性的可电擦除的 EEPROM,后者存放高温度和低温度触发器 TH、TL 和配置寄存器。
        配置寄存器是配置不同的位数来确定温度和数字的转化,配置寄存器结构如293 下:
        低五位一直都是"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 度。

        计算-0.5,数据输出十六进制是0XFFF8,因为高字节的高 5 位为 1,表明检测的温度是负温度,那么0XFFF8对应的二进制(1111111111111000)就要取反,取反后变成0X0007,0X0007对应的十进制为7,在将7+1在乘以12 位精度 0.0625是0.5,因为高 5 位为 1,表明检测的温度是负温度,所以是 -0.5显示。

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

初始化时序

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

写时序

        写时序包括写 0 时序和写 1 时序。所有写时序至少需要 60us,且在 2 次 独立的写时序之间至少需要 1us 的恢复时间,两种写时序均起始于主机拉低总 线。写 1 时序:主机输出低电平,延时 2us,然后释放总线,延时 60us。写 0 时序:主机输出低电平,延时 60us,然后释放总线,延时 2us。写时序图如下:

读时序
        单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出 读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少 需要 60us,且在 2 次独立的读时序之间至少需要 1us 的恢复时间。每个读时 序都由主机发起,至少拉低总线 1us。主机在读时序期间必须释放总线,并且在时序起始后的 15us 之内采样总线状态。读时序图如下:

        典型的读时序过程为:主机输出低电平延时 2us,然后主机转入输入模式延 时 12us,然后读取单总线当前的电平,然后延时 50us。

         在了解了单总线时序之后,我们来看看 DS18B20 的典型温度读取过程, DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令(0XCC)→发开始转 换命令(0X44)→延时→复位→发送 SKIP ROM 命令(0XCC)→发读存储器命令(0XBE)→连续读出两个字节数据(即温度)→结束。

硬件设计

本实验使用到硬件资源如下:

(1)动态数码管                                                                                                                        (2)DS18B20                                                                                                                                           动态数码管电路在前面章节已介绍,这里就不再重复。下面来看下开发板上 DS18B20 模块电路,如下图所示:

        从上图可以看出,传感器接口的单总线管脚接至单片机 P3.7 IO 口上,在介 绍单总线的时候我们说过,为了让单总线默认为高电平,通常会在单总线上接上 拉电阻,在图中并没有看到有上拉电阻,这是因为单片机 IO 都外接了 10K 上拉 电阻,当单片机 IO 口连接到传感器的总线管脚时即相当于它们外接上拉电阻, 所以此处可以省去。
软件设计
本章所要实现的功能是:插上 DS18B20 温度传感器,数码管显示检测的温度 值。
程序框架如下:
(1)编写数码管显示功能
(2)编写 DS18B20 读取温度功能
(3)编写主函数
前面的实验章节都已编写过数码管显示功能,现在对大家来说应该不是问 题,所以本章软件的重点在DS18B20时序的模拟及数据的读写上,下面我们打开 “ \4--实验程序\1--基础实验\20-DS18B20 温度传感器实验 ”工程,在 App 工程 组中可以看到新添加了 ds18b20.c 文件(里面包含DS18B20 驱动程序),还要 包含对应的头文件路径。 这里我们分析几个重要函数,其他部分程序大家可以打开工程查看。
本实验要显示温度值,就存在小数和符号位,所以不能直接使用前面的数码管显示函数smg.c,需要做一点点小改动,代码如下:
/********************************************************************
***********
* 函 数 名
: smg_display
* 函数功能
: 动态数码管显示
*
: dat :要显示的数据
pos :从左开始第几个位置开始显示,范围 1-8
*
:
*********************************************************************
**********/
void smg_display ( u8 dat [], u8 pos )
{
        u8 i = 0 ;
        u8 pos_temp = pos - 1 ;
        for ( i = pos_temp ; i < 8 ; i ++)
        {
                switch ( i ) // 位选
                {
                        case 0 : LSC = 1 ; LSB = 1 ; LSA = 1 ; break ;
                        case 1 : LSC = 1 ; LSB = 1 ; LSA = 0 ; break ;
                        case 2 : LSC = 1 ; LSB = 0 ; LSA = 1 ; break ;
                        case 3 : LSC = 1 ; LSB = 0 ; LSA = 0 ; break ;
                        case 4 : LSC = 0 ; LSB = 1 ; LSA = 1 ; break ;
                        case 5 : LSC = 0 ; LSB = 1 ; LSA = 0 ; break ;
                        case 6 : LSC = 0 ; LSB = 0 ; LSA = 1 ; break ;
                        case 7 : LSC = 0 ; LSB = 0 ; LSA = 0 ; break ;
                }
        SMG_A_DP_PORT=dat[i-pos_temp] ; // 传送段选数据
        delay_10us ( 100 ); // 延时一段时间,等待显示稳定
        SMG_A_DP_PORT = 0x00 ; // 消音
        }
}
        与之前数码管显示驱动程序不同的就是红色加粗标记的那条语句,可以看到 此处没有直接使用数码管段码数据,而是通过外部提供处理好的数码管段码数据 传入进来,这样可使数码管显示更加灵活,后面实验我们都将采用这种方式。因 为要让外部提前处理好数码管段码数据,所以段码数组 gsmg_code 就要定义为全 局变量,需在 smg.h 头文件中声明下即可:extern u8 gsmg_code[17];
DS18B20 初始化函数
初始化ds18b20.c代码如下:
#include "ds18b20.h"          
#include "intrins.h"

/********************************************************************
***********
* 函 数 名 : ds18b20_init
* 函数功能 : 初始化 DS18B20 的 IO 口 DQ 同时检测 DS 的存在
* 输 入 : 无
* 输 出 : 1:不存在,0:存在
*********************************************************************
**********/
u8 ds18b20_init(void)
{
	ds18b20_reset();	// 复位 DS18B20
	return ds18b20_check();	// 检测 DS18B20 是否存在
}


/********************************************************************
***********
* 函 数 名 : ds18b20_reset
* 函数功能 : 复位 DS18B20
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/

void ds18b20_reset(void)
{
	DS18B20_PORT=0;	//首先拉低总线,给这个总线,DQ输出个低电平
	delay_10us(75);	//输出这个总线有个要求,要持续480-960us之间,这里要有个延时函数
	DS18B20_PORT=1;//延时过后要释放总线,拉高总线,给这个总线,DQ输出个高电平
	delay_10us(2); // 释放总线有个要求,要持续15-60us之间,这里要有个延时函数
}
/********************************************************************
***********
* 函 数 名 : ds18b20_check
* 函数功能 : 检测 DS18B20 是否存在
* 输 入 : 无
* 输 出 : 1:未检测到 DS18B20 的存在,0:存在
*********************************************************************
**********/
u8 ds18b20_check(void)
{
	u8 time_temp=0;
//while(DS18B20_PORT&&time_temp<20) ,等待 DQ 为低电平,,根据与运算,任何一个为假则退出,第一种检测到DS18B20_PORT低电平,
//则直接退出。第二种检测DS18B20_PORT高电平,则进入while循环,持续等待,每循环一次time_temp+1,当time_temp>=20,
//则还没有检测到低电平,就退出循环。

	while(DS18B20_PORT&&time_temp<20) 
	{
		time_temp++;
		delay_10us(1);
	}
	if(time_temp>=20)return 1; //如果超时则强制返回 1,等待20次没有检测到低电平就返回1,表示未检测到 DS18B20 的存在
	else time_temp=0;	//检测到低电平,则直接进else 语句,不会执行上面if语句,time_temp归零等待下次检测

//while((!DS18B20_PORT)&&time_temp<20),等待 DQ 为高电平,,根据与运算,任何一个为假则退出,第一种检测到DS18B20_PORT高电平,
//这里(!DS18B20_PORT)非一下,就变成低电平,条件为假,则直接退出。第二种检测DS18B20_PORT低电平,这里(!DS18B20_PORT)非一下,
//就变成高电平,则进入while循环,持续等待,每循环一次time_temp+1,当time_temp>=20,则还没有检测到低高平,就退出循环。
	while((!DS18B20_PORT)&&time_temp<20) //等待 DQ 为高电平
	{
		time_temp++;
		delay_10us(1);
	}
	if(time_temp>=20)return 1; //如果超时则强制返回 1 ,等待20次没有检测到高电平就返回1,表示未检测到 DS18B20 的存在
	return 0; //如果
}
/*******************************************************************************
* 函 数 名         : ds18b20_read_bit
* 函数功能		   : 从DS18B20读取一个位
* 输    入         : 无
* 输    出         : 1/0
*******************************************************************************/
u8 ds18b20_read_bit(void)  //读是没有入口参数的是void类型
{
	u8 dat=0;//定义一个变量保存读取到的值,初值为0
	DS18B20_PORT=0;//根据时序图,我们要先输出一个低电平
	_nop_();_nop_(); //延时2个us
	DS18B20_PORT=1;	//释放总线,因为IO口有上拉电阻,置1才视为释放总线
//当发送完0后,DS18B20将会释放总线,则通过上拉电阻该总线将会恢复到高电平的闲置状态。
//从DS18B20中输出的数据在初始化读时序后仅有15us的有效时间。因此,主设备在开始改读时
//段后的15us之内必须释放总线,并且对总线进行采样
	_nop_();_nop_(); //该段时间不能过长,必须在15us内读取数据
	if(DS18B20_PORT)dat=1; //如果总线上为1则数据dat为1,否则为0
	else dat=0;
	delay_10us(5);
	return dat;//返回读取到的值
}
/*******************************************************************************
* 函 数 名         : ds18b20_read_byte
* 函数功能		   : 从DS18B20读取一个字节
* 输    入         : 无
* 输    出         : 一个字节数据

*******************************************************************************
举例:ds18b20_read_bit=10010001,循环8次,每次读取一位,且先读低位再读高位,temp8次读取到的位依次是如下
           temp<<7		  dat>>1	  dat=(temp<<7)|(dat>>1);
temp=1	   10000000		  00000000	  10000000
temp=0	   00000000		  01000000	  01000000
temp=0	   00000000		  00100000	  00100000
temp=0	   00000000		  00010000	  00010000
temp=1	   10000000		  00001000	  10001000
temp=0	   00000000		  01000100	  01000100
temp=0	   00000000		  00100010	  00100010
temp=1	   10000000		  00010001	  10010001

*******************************************************************************/

u8 ds18b20_read_byte(void)//读是没有入口参数的是void类型
{
	u8 i=0;//一个字节8位,要循环8次,定义一个变量
	u8 temp=0;//保存读取到的位
	u8 dat=0; //保存读取到的字节
	for(i=0;i<8;i++)
	{
		temp=ds18b20_read_bit();//循环8次,每次读取一位,且先读低位再读高位

		dat=(temp<<7)|(dat>>1);	//现将读取的位,左移7位到最高位,因为是先读低位再读高位,在右移一位,循环8次,移到最低位
		                        //为了之前读取到的数值,在下次循环的时候不丢失,这里用 | 或运算(参加运算的两个数只要两个数中的一个为1,结果就为1。),
								//把(temp<<7)和(dat>>1) 两个相加在赋予dat

	}
	return dat;

}	



/*******************************************************************************
* 函 数 名         : ds18b20_write_byte
* 函数功能		   : 写一个字节到DS18B20
* 输    入         : dat:要写入的字节
* 输    出         : 无
*******************************************************************************/
void ds18b20_write_byte(u8 dat)
{
	u8 i=0;
	u8 temp=0; //把要写入的字节保存在temp里面
	for (i=0;i<8;i++) //循环8次,每次写一位,且先写低位再写高位
	{
		temp=dat&0x01; //选择低位准备写入,根据与运算方法,前后条件同时满足表达式为真,是从低位开始写,dat最低位是1,和0x01比较,temp=1,如果
		               //dat最低位是0,和0x01比较,temp=0,
		dat>>=1;//因为这里dat&0x01比较的是最低位,所以要将次高位移到低位
		if(temp)
		{
			DS18B20_PORT=0;//主机DS18B20_PORT输出低电平,延时 2us,然后释放总线,延时 60us。

//* 函 数 名         : _nop_()
//* 函数功能		   : 指令的延迟时间为 1us
//51单片机中,1个机械周期 = 12个时钟周期 = 12 * ( 1 / f)。(f 为晶振频率)。
// 如果只用的是12MHZ的晶振,那么 一个机械周期就是1us;也就是说:
// _nop_(); 指令的延迟时间为 1us。可以较为精确得控制延迟时间
			_nop_();_nop_();//延时2us ,一个_nop_()是1us
			DS18B20_PORT=1;	//然后释放总线,	 DS18B20_PORT输出高电平
			delay_10us(6); //延时 60us
		}
		else
			DS18B20_PORT=0;	//写 0时序:主机DS18B20_PORT输出低电平,延时 60us,然后释放总线,延时 2us。
			delay_10us(6);	//延时 60us
			DS18B20_PORT=1;	//然后释放总线,	 DS18B20_PORT输出高电平
			_nop_();_nop_();//延时2us ,一个_nop_()是1us	
			
			
	}
}


/********************************************************************
***********
* 函 数 名 : ds18b20_start
* 函数功能 : 开始温度转换
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
void ds18b20_start(void)
{
	ds18b20_reset(); //复位
	ds18b20_check(); //检查DS18B20
	ds18b20_write_byte(0XCC);//发 SKIP ROM 命令 ROM
	ds18b20_write_byte(0X44);//发开始转换命令(0X44)

}


/********************************************************************
***********
* 函 数 名 : ds18b20_read_temperture
* 函数功能 : 从 ds18b20 得到温度值
* 输 入 : 无
* 输 出 : 温度数据
*********************************************************************
**********/

float ds18b20_read_temperture(void)//因为温度有可能是小数,负数等,所以定义一个float类型的返回值
{
	u8 dath=0;//保存读取的高字节数据
	u8 datl=0;//保存读取的低字节数据
	u16 value=0;//保存dath和datl合并后的数据
	float temp=0;//保存读取到的实际温度
	ds18b20_start();//开始转换
	//delay_ms(1);//此处也可以不用延时,在检测ds18b20_check()里面已经包含 ,这里可以省略
	ds18b20_reset(); //复位
	ds18b20_check(); //检查DS18B20
	ds18b20_write_byte(0XCC);//发 SKIP ROM 命令 ROM
	ds18b20_write_byte(0XBE);//发读存储器命令
	datl=ds18b20_read_byte();//读取的低字节
	dath=ds18b20_read_byte();//读取的高字节
	value=(dath<<8)+datl; //dath和datl两个8字节的数据,合并为16个字节的数据
	if((value&0xf800)==0xf800)//通过&运算来判断前5位是否位1
	{
		value=(~value)+1;//如果为1,就是负温度,读到的数值需要取反加 1 再乘以 0.0625 即可得到实际温度。
	    temp=value*(-0.0625);//将读到的实际温度保存在temp里面,因为是负温度,所以这里乘以-0.0625
	}
	else //如果不等于1,那就是0 ,就是正温度,正温度直接乘以0.0625 即可得到实际温度
	{
		 temp=value*0.0625;//将读到的实际温度保存在temp里面
		
	}

	return temp; //将得到的温度返回出去

}
ds18b20.h代码如下:
#ifndef _ds18b20_H
#define _ds18b20_H

#include "public.h"

//管脚定义
sbit DS18B20_PORT=P3^7;

//函数声明
u8 ds18b20_init(void);//初始化 DS18B20 的 IO 口 DQ 同时检测 DS 的存在
void ds18b20_reset(void);//复位 DS18B20
u8 ds18b20_check(void);//检测 DS18B20 是否存在
u8 ds18b20_read_bit(void);//从DS18B20读取一个位
u8 ds18b20_read_byte(void);//从DS18B20读取一个字节
void ds18b20_write_byte(u8 dat);//写一个字节到DS18B20
void ds18b20_start(void);//开始温度转换
float ds18b20_read_temperture(void);//从 ds18b20 得到温度值

#endif
主函数
main.c代码如下:
/********************************************************************
****************** 实验名称:I2C-EEPROM 实验
接线说明:
实验现象:下载程序后,数码管右 4 位显示 0,按 K1 键将数据写入到 EEPROM 内保存,
按 K2 键读取 EEPROM 内保存的数据,按 K3 键显示数据加 1,按 K4 键显示数据清
零,
最大能写入的数据是 255。
注意事项:
*********************************************************************
******************/
#include "public.h"
#include "smg.h"
#include "ds18b20.h"

void main()
{
	u8 i=0;
	int temp_value;//保存放大10倍后的温度值
	u8 	temp_buf[5];//定义一个数组,显示5个数码管,保存段码数据
	ds18b20_init();//初始化 DS18B20
	 while(1)
	 {
	 	i++;
		if(i%50==0)//间隔一段时间读取温度值,间隔时间要大于温度传感器转换温度时间
	 		temp_value=ds18b20_read_temperture()*10;//保留温度值小数后一位,这里虽然取得的是整数,
	 //但实际是保留小数点后1位,加入获取的到的温度是12.36,乘以10是123.6,取整数就是123,已经包含了小数点后一位地3.
		 if(temp_value<0)//temp_value小于0,温度就是负数
		 {
		 	temp_value=-temp_value;//根据负负得正,这里把负数转换为正数,保存在temp_value里面
			temp_buf[0]=0x40;//显示负号
		 }
		 else //大于0就是正数,就不显示负号
		 		temp_buf[0]=0x00; //不显示负号
		temp_buf[1]=gsmg_code[temp_value/1000];//百位
		temp_buf[2]=gsmg_code[temp_value%1000/100];//十位
		temp_buf[3]=gsmg_code[temp_value%1000%100/10]|0x80;//个位+小数点
		temp_buf[4]=gsmg_code[temp_value%1000%100%10];//小数点后一位
		smg_display(temp_buf,4);
	
		
		 }


}

     

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

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

相关文章

linuxOPS基础_linux常用自有服务(ntp,firewalld,crond)

linux常用自有服务 服务名含义ntpd用于同步计算机的系统时间的服务firewalld防火墙服务crond计划任务服务 ntp时间同步服务 NTP是网络时间协议(Network Time Protocol)&#xff0c;它是用来同步网络中各个计算机的时间的协议。 工作场景&#xff1a; ​ 公司开发了一个电商…

Jmeter教程 —— 简单的压力测试

Jmeter是一个非常好用的压力测试工具&#xff0c;可以用来做轻量级的压力测试&#xff0c;非常合适&#xff0c;只需要十几分钟&#xff0c;就能把压力测试需要的脚本写好。 什么是压力测试 顾名思义&#xff1a;压力测试&#xff0c;就是 被测试的系统&#xff0c;在一定的…

Android Studio查看第三方库依赖树

在Android开发过程中&#xff0c;我们或多或少都会引入第三方库&#xff0c;引入的库越多&#xff0c;越容易产生库之间的依赖冲突&#xff0c;所以我们今天一起来了解Android Studio查看第三方库依赖树。 下面就拿我遇到的问题还原一下&#xff1a; 之前接人容联客服系统的时候…

工作小技巧,封装if和Exception

在我们的工作中&#xff0c;经常会有这样的逻辑&#xff0c;就是判断一个参数是否合法&#xff0c;不合法就抛出异常&#xff0c;再由全局异常捕获后返回。 本文使用我编写的springboot日记本系统作为蓝本&#xff0c;&#xff0c;在已有项目的基础上改&#xff0c;源码下载地…

思科小型网络配置实例

一、配置思路 1.交换机上配置端口连接描述&#xff0c;在实际工作中很有用 2.外网配置&#xff0c;模拟外网&#xff1a;PC的IP地址200.200.200.2&#xff0c;Server的IP地址是200.200.200.3&#xff0c;网关都是200.200.200.1。SW-ISP的连接PC和Server-ISP的口属于vlan 3,&…

【vue】二:核心处理---vue的生命周期

文章目录 1.Vue生命周期的四个阶段&#xff0c;八个钩子2.vue的生命周期图例3. 初始阶段&#xff1a;虚拟DOM生成4. 挂载阶段&#xff1a;真实DOM生成5. 更新阶段&#xff1a;data变化重新渲染6. 销毁阶段&#xff1a;卸载所有&#xff0c;销毁vm 1.Vue生命周期的四个阶段&…

Appium利用xpath查找同级节点兄弟节点方法

当页面存在两个文件夹&#xff0c;结构相同&#xff0c;只有文件夹名称不同时&#xff0c;想要点击某一个文件夹上的某个控件。这个时候需要使用xpath定位。 1.由父节点定位子节点 driver.findElementByXPath(//XCUIElementTypeCell/XCUIElementTypeStaticText[name"标签…

Java网络开发(Tomcat)—— 用Jsp语法 到 实现数据的分页展示 到 只看自己的数据 + 模糊查询 迭代升级

目录 引出0.jsp的使用和语法 & 报错和解决&#xff08;1&#xff09;后端共享&#xff0c;前端获取 ${pageInfo}&#xff08;2&#xff09;如果想获取pageInfo这个对象的某个属性值&#xff0c;用 点 属性 ${pageInfo.pages}&#xff08;3&#xff09;如果想回传&#xff…

前端性能测试必备测试工具

我们在使用网站过程中&#xff0c;经常会遇到慢的问题&#xff0c;为了找到原因&#xff0c;一般需要借助工具进行检测&#xff0c;通过工具&#xff0c;可以检测出前端站点加载资源的相关详细情况。 今天&#xff0c;就给大家介绍几款前端性能测试分析工具&#xff0c;结合性能…

为什么性能测试PR单机版要升级到P-One一站式性能测试平台

目前市面上常用的性能测试工具均为单机版&#xff0c;导致了一些问题&#xff1a; 1.脚本无法进行共享&#xff1b; 2.执行管理无法进行统一化、协同化管理&#xff1b; 3.项目经理只能通过日报或者线下沟通获取当前项目进度&#xff1b; 4.对测试结果只能通过文件传输的方式进…

Linux安装Nginx详细教程

文章目录 下载安装包开始安装相关命令 下载安装包 官网下载&#xff1a;http://nginx.org/en/download.html 自己找一个安装目录 我这里进入到usr/local下创建一个安装软件目录 cd /usr/local mkdir softwore cd softwore使用ftp工具或者windows命令行将下载好的nginx安装包…

家居行业内卷?创新乏力?十大关键词解读IF ROOM如何定义未来主义家居

中商产业研究院今年早前发布的《中国家居市场前景及投资机会研究报告》显示&#xff0c;2021年中国定制家居行业的市场规模已经突破4000亿元&#xff0c;2016-2021年复合增长率达16%&#xff0c;行业保持良好的发展态势&#xff0c;预计2023年中国定制家居市场规模能突破5000亿…

2023年了, 你还不会使用node.js做压力测试?

背景 前些天刷抖音&#xff0c;看到网传的Java继父&#xff0c;求人攻击压测他的网站&#xff0c;这不得摩拳擦掌。 所以今天来聊聊如何对自己的项目、接口进行压力测试。 压力测试的目的 首先, 绝对不是为了压测、攻击别人的网站为乐。 1、探索线上系统流量承载的极限&…

jvm中类和对象定义存储基础知识 | 京东云技术团队

1 类文件数据结构类型 Class文件结构主要有两种数据结构&#xff1a;无符号数和表 •无符号数&#xff1a;用来表述数字&#xff0c;索引引用、数量值以及字符串等&#xff0c;比如 图1中类型为u1,u2,u4,u8分别代表1个字节&#xff0c;2个字节&#xff0c;4个字节&#xff0c…

2023“水博会”召开,千寻位置携智慧水利创新方案登台亮相

6月7日&#xff0c;“2023中国水博览会暨第十八届中国&#xff08;国际&#xff09;水务高峰论坛”&#xff08;简称“水博会”&#xff09;在江苏南京开幕。千寻位置基于北斗时空能力&#xff0c;打造多款水利数字孪生解决方案&#xff0c;在本次水博会上亮相。 水利数字孪生工…

SNAP重采样哨兵2号 L2A级数据报错 Invalid S2 source product解决办法

原来安装的SNAP7.0&#xff1a;esa-snap_all_windows-x64_7_0.exe 重采样时报错&#xff1a; A problem occurred during the target product initialisation. Type: OperatorException Message: Invalid S2 source product 解决办法&#xff1a;下载SNAP新版本9.0 http:/…

再看const成员函数

文章目录 再看函数重载const成员函数保安&#xff08;const&#xff09;能保护所有人&#xff08;类成员&#xff09;吗&#xff1f;mutable修饰类成员 const/非const成员函数的复用 关于函数重载实际上我理解不是很深入&#xff0c;直接导致const成员函数这块出大问题&#xf…

SpringBoot+Vue 的网上图书商城管理系统

文章目录 1. 简介2 技术栈3.1系统功能 4系统设计4.1数据库设计 5系统详细设计5.1系统功能模块5.1系统功能模块5.2管理员功能模块 源码下载 1. 简介 本次设计任务是要设计一个网上图书商城&#xff0c;通过这个系统能够满足网上图书商城的管理功能。系统的主要功能包括首页、个…

第二十一章_Redis的缓存过期淘汰策略

Redis内存满了怎么办 redis 一共有 4 个命令来设置键的生存时间&#xff08;可以存活多久&#xff09;或过期时间&#xff08;什么时候被删除&#xff09; expire <key> <ttl>&#xff1a;将 key 的生存时间设置为 ttl 秒pexpire <key> <ttl>&#xf…

仓储WMS对接淘宝奇门详细说明【亲测可用】

文章目录 简介名词解释奇门对接方案前期准备系统调用流程代码实现思路关键点(个人观点)奇门对接关键代码可能遇到的问题 简介 淘宝奇门项目支持 ERP、WMS 之间的系统标准化对接&#xff0c;通过构建 ERP、WMS 系统之间标准通信协议来实现不同系统之间的打通&#xff1b;对商家…