【单片机】17-温度传感器DS18B20

news2024/11/17 16:37:59

1.DS18B20相关背景知识

1.温度传感器

(1)测温度的方式:物理(汞柱,气压),电子(金属电性能随温度变化)

(2)早期:热敏电阻(模拟接口---》A/D转换

(3)现代:专用sensor(数字接口,如I2C,DS18B20单总线接口等)

2.DS18B20的基本特征

DS18B20可编程分辨率单总线温度传感器

(1)内置集成ADC,外部数字接口

(2)单总线数字接口,布线成本低【单根数据线进行传输】---》串口【一根线】

(3)温度范围宽,精度率高(相对)---》内部的精确度可以调节

(4)数字值温度分辨率位数可软件设置---》内部的A/D转换器【位数越多,精度越高】

(5)温度阈值报警功能,且阈值(TH和TL)可内置存储掉电不丢失(使用EEPROM)

(6)温度采集速度快(750ms)---》CPU下命令进行A/D转换,然后通过数据总线将数据传输出去。

(7)内置唯一64位的序列码,CPU可以单线串联无限多个DS18B20

(8)支持VDD供电,或通过数据总线(DQ)及内部电容实现寄生电源供电【使用DQ供电】--------》如果使用DQ供电,则表示DQ要一直为高电平(1),如果DQ为低电平(0),则与GND两者都是低电平,无法供电。实际上在DS18B20内部还有一个电容,当DQ为1的时候,会一边供电,一边给电容充电;当DQ为低电平的时候,电容会放电供DS18B20使用。使用我们平常都将DQ置为高电平(1)防止出现两根线都为低电平。

(9)没有CLK,所以是异步通信

3.综合评价

(1)DS18B20是很多年前的东西

(2)现在趋向于温度+湿度的综合传感器

(3)现实应用一般低端用热敏电阻【单片机中有A/D+热敏电阻即可】,热点偶,高端用精度传感器

(4)学习难点是单总线协议的时序编程实现

2.原理图

1.原理图确认

2.实体图确认

3.接线确认

注意不要接反了,否则很容易烧坏

3.数据手册

ds18b20数据手册-中文版-140407 - 豆丁网

https://atta.szlcsc.com/upload/public/pdf/source/20230321/E2B7C84673F98AE08C6B0E4EDF67430D.pdf

1.基本性能

2.结构框图

3.测温操作

4.报警操作信号

5.6 4 位 只 读 存 储 器

7.存储器

8.温度寄存器

3.单总线系统

1.“多点”VS“单点”

单总线系统采用一个单总线控制器(CPU)来控制一个活多个从机。DS18B20总是充当从机。

当只有一个从机挂在总 线上时,系统被称为“单点”系统;

如果由多个从机挂在总线上,系统被称为“多点”系统。

2.字节从低位开始读

所有的数据和指令的传递都是从最低有效位开始通过单总线的。

关于单总线系统分三个方面讨论:硬件结构、执行序列和单总线信号(信号类型和时序)。

3.硬件结构

单总线硬件连接要求:

(1)漏极开路式+5K欧姆是上拉电阻

(2)总线低电平超过480us,从设备(DS18B20)将被复位

4.单总线协议标准执行步骤

(1)主机必须按照单总线协议设定好的完整序列和DS18B20通信,每一个回合包含3个步骤:

初始化+ROM操作指令+功能操作指令

顺序不能错也不能省略任何一个。

1.初始化

通过单总线的所有执行操作都从一个初始化程序序列开始。初始化序列包含一个由总线控制器发出的复位脉冲(将总线拉低超过480us)和 其后由从机发出的存在脉冲(回复主设备)。存在脉冲让总线控制器知道DS18B20在总线上且已经准备好操作。

初始化:就是主设备线拉低数据总线超过480us以发出一个复位脉冲,然后从设备DS18B20收到复位脉冲后内部进行硬件复位,复位完成后回复主设备一个存在脉冲,主设备接收到存在脉冲后就认为从设备已经准备好,初始化完成。

复 位 序 列 : 复 位 和 存 在 脉 冲

2.ROM指令

3.功能指令

4.读 / 写 时 序

1. 写时序--CPU控制

(1)DS18B20有两种写时序:写1时序和写0时序。总线控制器通过写1时序来写逻辑1;通过写0时序来写逻辑0。

写 时序必须最少持续60us,包括两个写周期之间至少1us的恢复时间。【无法连续读】

当总线控制器把数据线从逻辑高电平拉低到低电 平的时候,写时序开始。

(2)总线控制器要写产生一个写时序,必须把数据线拉到低电平然后释放,且需在15us内释放总线。当总线被释放【变为高电平】后, 上拉电阻将总线拉高。总线控制器要生成写0时序,必须把数据线拉到低电平且继续保持至少60us。

(3)总线控制器初始化写时序后,DS18B20在一个15us到60us的窗口内对信号线进行采用【DS18B20将数据接收走--》采样时间不固定】。如果线上是高电平,就 是写1。反之,如果线上是低电平,就是写0。

1. 写“0”

2. 写“1”

3.官方代码实现

//在开始之前数据总线是释放的【高电平】
//所以在调用这个函数之前要确保数据总线状态为1
void Ds18b20WriteByte(unsigned char dat)
{
	unsigned int i = 0, j = 0;

	for (j=0; j<8; j++)
	{
		DSPORT= 0;	     	  	//每写入一位数据之前先把数据总线拉低1us
		i++;//中间间隔1us,因为太小了,所以不能使用delay
		DATA = dat & 0x01;  	//然后写入一个数据,从最低位开始
		delay70us();			// 时序要求最少60us
		DSPORT= 1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
		dat >>= 1;     //这句代码就代表可以延时1us并且将数据位移动到对应的位置
	}
}

2.读时序--CPU和DS18B20一起控制

总线控制器发起读时序时,DS18B20仅被用来传输数据给控制器。因此,总线控制器在发出读寄存器指令[BEh ]或读电源模式指令[B4h]后必须立刻开始读时序,以便DS18B20提供请求的数据。除此之外,总线控制器在发出发送 温度转换指令平[44h]或召回EEPROM指令[B8h]之后读时序,详见DS18B20功能指令节。

所有读时序必须最少60us,包括两个读周期间至少1us的恢复时间。当总线控制把数据线从高电平拉低到低电平时,读时序开始,数据线必须至少保持1us,然后总线被释放。在总线控制器发出读时序后,DS18B20读/写时隙时序图过拉高或拉低总线上来传输1或0。当传输0结束后,总线将被释放,通过上拉电阻回到高电平空闲状态。从DS18B20 输出的数据在读时序的下降沿出现后15us内有效。因此,总线控制器在读时序开始15us内释放总线然后采样总线状态, 以读取数据线的状态。【在0-15us之有效,其他时间没有干其他事情】

1.读“0”

2.读“1”

3.官方代码实现

unsigned char Ds18b20ReadByte()
{
	unsigned char byte = 0, bi = 0;//bi:存储读出的bit
	unsigned int i = 0, j = 0;
		
	for (j=8; j>0; j--)
	{
		DATA = 0;		//先将总线拉低1us
		i++;//中间间隔1us,因为太小了,所以不能使用delay
		DSPORT= 1;		//然后释放总线
		i++;
		i++;			//延时6us等待数据稳定
		bi = DSPORT;	 	//读取数据,从最低位开始读取
		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
		byte = (byte >> 1) | (bi << 7);	
		//byte |= (bi << (8-j));//可以替代上面
		delay45us();
	}				
	return byte;
}

5.DS18B20工作流程分析

1.温度获取过程

(1)DS18B20自己本身不会主动取进行温度测量,而是需要主控CPU主动发起一个温度转换的过程,这么设计是因为温度转换本身是要耗电的,所以设计位拼死待机等待温度转换命令后才取进行温度AD转换

(2)主控CPU和DS18B20之间的通信是分周期,比如我们要让DS18B20进行温度转换就是一个周期。这个周期包括=初始化+n个指令(每一个周期的开始都要有一个初始化,然后跟着n个命令)

(3)初始化过程主要是探测目标DS18B20是否存在(查看是否有响应),如存在将芯片初始化。

(4)命令很重要。(18B20中是存在CPU的)所以DS18B20是一个典型的“命令-响应”型外设。

(5)学习这种外设的关键是:命令集。

//开启温度转换
void Ds18b20ChangTemp(void)
{
	Ds18b20Init();
	delay1ms();
	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 
	Ds18b20WriteByte(0x44);	    //温度转换命令
	delay750ms();	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了 
}

void Ds18b20ReadTempCom(void)
{	
	Ds18b20Init();
	delay1ms();
	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
}


//将读取到的温度输出
int Ds18b20ReadTemp(void)
{
	unsigned int temp = 0;
	unsigned char tmh, tml;
	double t = 0;

	Ds18b20ChangTemp();			 	//先写入转换命令
	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
	tml = Ds18b20ReadByte();		//读取温度值共16位,先读低字节
	tmh = Ds18b20ReadByte();		//再读高字节
 	temp = tmh;
 	temp <<= 8;
 	temp |= tml;


	return temp ;
}

2.ROM操作指令

(1)DS18B20支持多个芯片串联在一根总线上,也就是所谓的单总线协议,所以必须要主控CPU要能够区分总线上多个18B20,因此有个ROM操作指令来完成这个任务(区分多个1SD8B20)

(2)ROM操作指令和温度采集一点关系都没有,所以当我们总线上只有一个18B20的时候ROM操作指令我们不需要去管

(3)一旦系统中单总线上有多个18B20,那么我们必须借助ROM操作指令来区分多个18B20,而且这个区分过程可能需要多个ROM指令来完成。

(4)如果系统中只有一个18B20,那么就用一条skip rom命令(0xCC)就可以跳过这个阶段。【因为只有一个所以可以不用进行响应直接发送即可】

3.功能指令

(1)ROM操作指令目的是为了在单总线上多个18B20中挑选到那个当前我们要操作的18B20,而功能指令是为了和选定的18B20通信从而获取温度。

6.DS18B20的编程要点

1.几种工作思路

(1)参考文档自己编写

(2)参考示例代码移植

2.DS18B20移植注意点

(1)注意延时函数的本地实现---DS18B20对时间要求很高【代码里的时间有关的部分必须重写

(2)注意引脚配置(看原理图)

(3)注意时序

(4)线通过初始化来检测芯片是否能通再做其他的

(5)注意读到的温度值是否会变

3.代码实践

1.移植初始化函数

//初始化函数
//返回0则表示初始化成功,1表示失败
unsigned char Ds18b20Init(void){
	
	unsigned char i=0;
	DQIO=0;//将数据总线拉低
	Delay750us();//数据手册要求480us-900us
	DQIO=1;//然后拉高总线,如果DS18B20做出翻译会将再15us-60us后总线拉低
	
	//如果DS18B20接收到并且回应则DQIO=1,如果没有回应则DQIO=0
	i=0;
	while(DQIO){//ds18b20没有回应
		
		i++;
		if(i>5){//因为我们要求再15us-60us之间进行响应
			//而且我们设置延迟函数为15us,则表示15us进行一次检验
			//60/15=4次
			return 1;
		}
		Delay15us();
		
		
	}
	return 0;//初始化成功
	
	
}

2.移植串口函数作为调试

uart.c

#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;
}

main.c 

void main(){
	
	unsigned char ret=0;
	uart_init();
	uart_send_byte('!');//串口测试成功
	ret=Ds18b20Init();
	if(ret==0){
		uart_send_byte('K');//输出,则表示初始化成功
	}else{
		uart_send_byte('A');
	}
		
	
	while(1);
}

10.DS18B20移植

1.写函数

//写函数
void Ds18b20_write_byte(unsigned char dat){
	
	unsigned int i=0,j=0;
	for(j=0;j<8;j++){
		
		DQIO=0;//每写入一位数据之前先将总线拉低1us
		i++;//延时效果
		DQIO=dat&0x01;//写入一个数据,从最低位开始
		Delay68us();//时序要求最少60us
		DQIO=1;//然后释放总线,至少1us给总线恢复时间
		dat>>=1;//将倒数第二位移动到倒数第一位
		
	}
	
}

2.读函数

//读函数
unsigned char Ds18b20_read_byte(){
	
	unsigned char byte=0,bi=0;
	unsigned int i=0,j=0;
	for(j=8;j>0;j--){
		DQIO=0;//先将总线低
		i++;//延时1us
		DQIO=1;//然后释放总线
		//【注意点:这个地方的时间控制很重要,如果太长或者太短都可能读取不到数据
		i++;
		i++;//延时6us等待数据稳定
		bi=DQIO;//读取数据,从最低位开始读取
		//将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉的那位补0【因为我们从最低位开始读取】
		byte=(byte>>1) | (bi<<7);
		
		Delay45us();
	}

3.转换温度

注意点:温度转换是需要时间的,所以在转换温度后记得要延时一定的时间才可以(750ms)

void Ds18b20ChangeTemp(void){
	
	Ds18b20Init();
	Delay1ms();
	
	Ds18b20_read_byte(0xcc);//跳过ROM操作命令
	Ds18b20_read_byte(0x44);//温度转换命令
	//因为我们转换温度需要时间才可以进行读取,所以我们需要时间等待
	//温度转换过程要750ms
	Delay750ms();//等待转换成功,而如果你是一直刷着,就不用延时
}

4.读取温度

void Ds18b20ReadTemp(void){
	
	Ds18b20Init();
	Delay1ms();
	
	Ds18b20_read_byte(0xcc);//跳过ROM操作命令
	Ds18b20_read_byte(0xbe);//发送读取温度命令
	
}

5.将读取到的温度合并

//将寄存器中(包括读取到)的温度(2位)合并成一位
//但是如果这样写不方便在主函数调用
//因为16位,用int无法输出,则我们使用串口直接输出
/*
unsigned int Ds18b20ReadTemp(void){
	
	unsigned int temp=0;//合并结果
	unsigned char tmh,tml;//高8位与低8位
	
	
	Ds18b20ChangeTemp();//先写入转换命令
	Ds18b20ReadTempCom();//然后等待转换完发送读取温度命令
	//读取温度一共12位(但是实际上显示16位)
	tml=Ds18b20ReadByte();//先读取温度的低8位
	tmh=Ds18b20ReadByte();//再读温度的高8位
	//将结果合并
	//(tmh<<8):因为高位是在合并结果的bit8,所以将tmh左移8位
	temp=tml | (tmh<<8);
	
	return temp;
}
*/
void Ds18b20ReadTemp(void){
	
	unsigned int temp=0;//合并结果
	unsigned char tmh,tml;//高8位与低8位
	
	
	Ds18b20ChangeTemp();//先写入转换命令
	Ds18b20ReadTempCom();//然后等待转换完发送读取温度命令
	//读取温度一共12位(但是实际上显示16位)
	tml=Ds18b20ReadByte();//先读取温度的低8位
	tmh=Ds18b20ReadByte();//再读温度的高8位
	
	uart_send_byte(0);
	uart_send_byte(tml);
	uart_send_byte(tmh);//前面四位为0
}

主函数

#include"ds18b20.h"
#include"uart.h"

void main(){
	
	/*
	unsigned char ret=0;
	uart_init();
	//uart_send_byte('!');//串口测试成功
	ret=Ds18b20Init();
	if(ret==0){
		uart_send_byte('K');//输出,则表示初始化成功
	}else{
		uart_send_byte('A');
	}
		*/
	
	
	while(1){
		
		Ds18b20ReadTemp();
		
	}
}

6.温度数据的移位组合

7.数字值转为温度值

换算:tml :0x99   tmh:0x01,意味着,温度数字值:0x199,换算成十进制为:409

当前默认精度是12位,每一个数字值对应的应该是0.0625摄氏度

所以计算出来的温度值应该是:409*0.0625=25.56摄氏度

在单片机中,应该尽量避免进行小数运算。小数运算一般转换成整数运算。

409*0.0625=409*625/10000

注意点:

(1)12位对应的是0.0625,可能会溢出

temp=temp*625/10000;//此处产生溢出

(2)强制类型转换


//将数值转换为温度值
void Ds18b20ReadTemp2(void){
	
	unsigned int temp=0;//合并结果
	unsigned int tmh,tml;//高8位与低8位
	//因为我们要进行温度转换,所以0.0625是double
	double t=0;
	
	
	Ds18b20ChangeTemp();//先写入转换命令
	Ds18b20ReadTempCom();//然后等待转换完发送读取温度命令
	//读取温度一共12位(但是实际上显示16位)
	tml=Ds18b20ReadByte();//先读取温度的低8位
	tmh=Ds18b20ReadByte();//再读温度的高8位
	
	//将结果合并
	//(tmh<<8):因为高位是在合并结果的bit8,所以将tmh左移8位
	temp=tml | (tmh<<8);
	
	//temp=temp*625/10000;//此处产生溢出
	t=temp*0.0625;
	uart_send_byte(0);
	//uart_send_byte(temp);
	uart_send_byte((unsigned char)t);//因为t是double,所以要进行强制类型转换
}

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

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

相关文章

青岛建筑模板厂家有哪些?

在青岛地区&#xff0c;有许多建筑模板厂家供应各类建筑模板材料。其中&#xff0c;一家备受认可的建筑模板厂家是广西贵港市的能强优品木业公司。该公司具备全面的生产能力和优质的产品质量&#xff0c;在青岛地区的建筑施工企业中有着广泛的合作经验。 能强优品木业公司提供全…

【密评】商用密码应用安全性评估从业人员考核题库(八)

商用密码应用安全性评估从业人员考核题库&#xff08;八&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 1751 判断题 根据GM/T0016《智能密码钥匙密码应用接口规范》&#x…

【Vue面试题十二】、说说你对双向绑定的理解?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;双向数据绑定是什么 一、…

VMware Workstation Player 17 下载安装教程

虚拟机系列文章 VMware Workstation Player 17 免费下载安装教程 VMware Workstation 17 Pro 免费下载安装教程 windows server 2012安装教程 Ubuntu22.04.3安装教程 FTP服务器搭建 VMware Workstation Player 17 下载安装教程 虚拟机系列文章前言一、 VMware Workstation Pla…

是炒作还是大势所趋?电商企业7 种日渐盛行的 API 管理应用场景

17 世纪兴起的纸质货币改变了全球经济的面貌&#xff0c;开创了国际货币监管的新时代。货币能带来如此重大的颠覆&#xff0c;主要原因在于它有着标准化“交换媒介”的能力。在技术和数字化世界中&#xff0c;API 产生了类似的效果&#xff0c;它创建了标准化、可重复使用、安全…

CSS 中::after的妙用(实现在margin中显示内容)

效果图如下&#xff1a; 背景&#xff1a; 如上图&#xff0c;之前只是当纯的写一个参考货架平面图&#xff0c;用作物料系统的在库状态可视化&#xff0c;当完成页面body分成10等份时&#xff0c;货架之间需要有通道&#xff0c;为了实现实际的样式&#xff0c;我给每个等份都…

FPGA实现电机霍尔编码器模块

一. 简介 想要知道直流电机的转速&#xff0c;就需要用到编码器&#xff0c;常用的编码器有霍尔和光电两种&#xff0c;但是光电编码器比较贵(性能好于霍尔)&#xff0c;所以平常的时候使用最多的是霍尔编码器了。 霍尔编码器一般有AB两相信号输出&#xff0c;默认的时候为低…

AB试验(五)实验过程中的一些答疑解惑

AB试验&#xff08;五&#xff09;实验过程中的一些答疑解惑 实验结果不显著怎么办 出现实验结果不显著的原因 A/B测试的变化确实没有效果&#xff0c;两组指标在事实上是相同的A/B测试的变化有效果&#xff0c;但由于变化的程度很小&#xff0c;测试灵敏度power不足&#x…

Linux 安全 - LSM机制

文章目录 前言一、LSM起源二、LSM简介2.1 MAC2.2 LSM特征 三、Major and Minor LSMs3.1 Major LSMs3.2 Minor LSMs3.3 BPF LSM 四、LSM 框架五、LSM Capabilities Module六、LSM hooks 说明参考资料 前言 在这两篇文章中介绍了 Linux 安全机制 Credentials &#xff1a; Linu…

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题

关于GD32引脚PA13、PA15、PB3、PB4配置为普通引脚的问题 在实际开发中&#xff0c;经常会遇到引脚资源受限需要将一些具有特定功能的引脚配置为普通引脚或其他引脚功能使用的情况。 博主之前遇到过类似的情况&#xff0c;都正常解决了。但偶尔也会出现在配置引脚时少了一些配…

Go语言基础学习教程(一)导学部分

Go语言基础 将在工作中学习的东西整理出来作为一个简单的Go语言基础教程 Go语言 Go语言(Golang)是Google公司2009年推出的一门"高级编程言语", 目的是为了解决: "现有主流编程语言"明显落后于硬件发展速度的问题不能合理利用多核CPU的优势提升软件系统性…

ref与DOM-findDomNode-unmountComponentAtNode知识点及应用例子

​​​​​​http​​​http://t.csdnimg.cn/og3BI 知识点讲解↑ 需求: (下载/导出 用post请求时:) 实例: react部分代码 1、点击下载按钮&#xff0c;需要传给后端数据&#xff0c;到数据扁平&#xff0c;不是那么复杂&#xff0c;只需url地址即可完成下载&#xff0c;后端…

靶场通关记录

目录 一、信息收集-端口扫描 目标开放端口收集 目标端口对应服务探测 信息收集-端口测试 二、 22-SSH弱口令爆破(挂着干别的) 80-HTTP端口的信息收集 三、信息收集-目录访问 漏洞利用-getwebshell 总结 getwebshell → 源码注释发现用户名 → robots.txt发现base64密码 …

mybatisplus接口解析

一、前言 java开发应用程序与数据库交互使用比较多的就是mybatisplus接口。通过mybatisplus接口&#xff0c;我们可以通过程序更好得到对数据库表进行增删查改。 二、mybatisplus Mapper接口源码 /*** Mapper 继承该接口后&#xff0c;无需编写 mapper.xml 文件&#xff0c;即…

1576. 替换所有的问号

1576. 替换所有的问号 C代码&#xff1a;自己写的 char * modifyString(char * s){int n strlen(s);for (int i 0; i < n; i){if (s[i] ?) {if (i ! 0 && i ! n-1) {for (int j 0; j < 26; j) {if (a j ! s[i-1] && a j ! s[i1]) {s[i] a j;br…

SeleniumIDE 自动化用例录制、测试用例结构分析

1、SeleniumIDE用例录制 SeleniumIDE用例录制使用场景 刚开始入门UI自动化测试团队代码基础较差技术成长之后学习价值不高 SeleniumIDE的下载以及安装 官网&#xff1a;https://www.selenium.dev/Chrome插件&#xff1a;https://chrome.google.com/webstore/detail/seleniu…

对音频切分成小音频(机器学习用)

我是把so-vits中小工具&#xff0c;分析源码然后提取出来了。以后可以写在自己的程序里。 -------流程&#xff08;这是我做的流程&#xff0c;你可以不用看&#xff09; 从开源代码中快速获取自己需要的东西 如果有界面f12看他里面的接口&#xff0c;然后在源码中全局搜索&…

英国/法国/意大利/德国/西班牙,电动交通设备合规政策更新!

英国/法国/意大利/德国/西班牙&#xff0c;电动交通设备合规政策更新&#xff01; 产品安全 合规政策更新&#xff01;或加昵称咨询 NOTICE 尊敬的卖家&#xff1a; 您好&#xff01; 我们此次联系您是因为您正在销售需要审批流程的商品。为此&#xff0c;亚马逊正在实施审…

九大装修收纳空间的设计,收藏备用!福州中宅装饰,福州装修

如果房子面积不大&#xff0c;收纳设计就显得非常重要。其实装修房子中很多地方都可以做收纳&#xff0c;九大空间每一处都可以放下你的东西&#xff0c;让你摆脱收纳烦恼。 收纳空间少的话&#xff0c;装修完后住久了怕会乱成一窝&#xff0c;因此装修的时候&#xff0c;收纳…

google hack常用语法介绍

Google hacker (Google黑客)是利用GOOGLE提供的搜索功能查找黑客们想找到的信息.一般是查找网站后台,网管的个人信息,也可以用来查找某人在网络上的活动. Google hacker 一般是做为黑客在入侵时的一个手段.在入侵过程中有时需要查找后台的登陆口就需要用到GOOGLE HACKER.有…