MPU6050篇——温度与角度的读取

一、MPU6050的读写时序

        1. MPU6050写时序

1.  首先是IIC的起始信号,也就是:

MPU_IIC_Start(); 

2. 然后接下来便是发送器件地址以及写命令:其中MPU6050的地址为7位,而八位为一个数据帧,所以在最后一位再加一位是指定对寄存器是读还是写操作。而器件地址上篇也介绍了,当AD0为0则地址为0X68,否则为0X69,这里我接的0,即地址为0x68;左移一位,低位自动补0,我们为写操作,所以无需操作。

MPU_IIC_Send_Byte(0x68<<1);//发送器件地址+写命令

3. 等待ACK响应:

MPU_IIC_Wait_Ack();//等待应答

4.  写需要操作的寄存器地址:这里以reg代替。

MPU_IIC_Send_Byte(reg);	//写寄存器地址

5.等待ACK响应:

MPU_IIC_Wait_Ack();//等待应答

 6.  发送需要对寄存器操作的数据:以data代替

MPU_IIC_Send_Byte(data);//发送数据

7.  最后等待Ack响应,结束IIC;

MPU_IIC_Wait_Ack();  //等待ACK MPU_IIC_Stop();   

  这样,一个写时序就写好了;附上完整代码:当然,对于ACK的应答结果也可以不处理,和上面一样就好了。

//IIC写一个字节 
//reg:寄存器地址
//data:数据
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Byte(u8 reg,u8 data) 				 
{ MPU_IIC_Start(); MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	if(MPU_IIC_Wait_Ack())	//等待应答{MPU_IIC_Stop();		 return 1;		}MPU_IIC_Send_Byte(reg);	//写寄存器地址MPU_IIC_Wait_Ack();		//等待应答 MPU_IIC_Send_Byte(data);//发送数据if(MPU_IIC_Wait_Ack())	//等待ACK{MPU_IIC_Stop();	 return 1;		 }		 MPU_IIC_Stop();	 return 0;
}

2.MPU6050读时序:

其步骤也是按照框图去写,这里就不再一步步教了,也比较简单,这里直接给出完整代码:        

//IIC读一个字节 
//reg:寄存器地址 
//返回值:读到的数据
u8 MPU_Read_Byte(u8 reg)
{u8 res;MPU_IIC_Start(); MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	MPU_IIC_Wait_Ack();		//等待应答 MPU_IIC_Send_Byte(reg);	//写寄存器地址MPU_IIC_Wait_Ack();		//等待应答MPU_IIC_Start();MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//发送器件地址+读命令	MPU_IIC_Wait_Ack();		//等待应答 res=MPU_IIC_Read_Byte(0);//读取数据,发送nACK MPU_IIC_Stop();			//产生一个停止条件 return res;		
}

3.  MPU6050连续写时序:       

         其步骤与写时序类似,只是在传完一个数据等待ACK后并不给结束信号,而是接着发送数据,最后再发送停止信号。

//IIC连续写
//addr:器件地址 
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{u8 i; MPU_IIC_Start(); MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令	if(MPU_IIC_Wait_Ack())	//等待应答{MPU_IIC_Stop();		 return 1;		}MPU_IIC_Send_Byte(reg);	//写寄存器地址MPU_IIC_Wait_Ack();		//等待应答for(i=0;i<len;i++){MPU_IIC_Send_Byte(buf[i]);	//发送数据if(MPU_IIC_Wait_Ack())		//等待ACK{MPU_IIC_Stop();	 return 1;		 }		}    MPU_IIC_Stop();	 return 0;	
} 

4.  MPU6050连续读时序:

//IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
//    其他,错误代码
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ MPU_IIC_Start(); MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令	if(MPU_IIC_Wait_Ack())	//等待应答{MPU_IIC_Stop();		 return 1;		}MPU_IIC_Send_Byte(reg);	//写寄存器地址MPU_IIC_Wait_Ack();		//等待应答MPU_IIC_Start();MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令	MPU_IIC_Wait_Ack();		//等待应答 while(len){if(len==1)*buf=MPU_IIC_Read_Byte(0);//读数据,发送nACK else *buf=MPU_IIC_Read_Byte(1);		//读数据,发送ACK  len--;buf++; }    MPU_IIC_Stop();	//产生一个停止条件 return 0;	
}

其方框的解释如下:

二、获取MPU6050的温度值

由上可知,Temp = (TEMP_OUT[15:8] << 8 | TEMP_OUT[7:0])/340 + 36.53;那么接下来就简单了,直接用连续读函数读取0x41就可以了。(连续读函数读完地址自增1,即为0x42)代码如下:

//得到温度值
//返回值:温度值(扩大了100倍)
short MPU_Get_Temperature(void)
{u8 buf[2]; //用于存放温度short raw;float temp;MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf); //连续读两次,第一次为0x41,第二次为0x42raw=((u16)buf[0]<<8)|buf[1];  //将8位数据整合为16位temp=36.53+((double)raw)/340;  //得到温度值return temp*100;//为了好处理数据,这里扩大100倍
}

三、获取陀螺仪值

其地址如上,从上到下分别为X轴高八位陀螺仪值、x轴低八位陀螺仪值、Y轴高八位陀螺仪值......

那么想得到这些值也很简单了,由于其地址为连续的,我们只需调取连续读函数读0x43就可以了。

//得到陀螺仪值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
void MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{u8 buf[6];  MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);*gx=((u16)buf[0]<<8)|buf[1];  *gy=((u16)buf[2]<<8)|buf[3];  *gz=((u16)buf[4]<<8)|buf[5];	
}

然后只需在主函数中调用这个函数就可以读取其值了,当然,现在这些值是还未经过处理的。

MPU_Get_Gyroscope(&x,&y,&z);
OLED_ShowNum(0,0,x,5,16,1);
OLED_ShowNum(0,16,y,5,16,1);
OLED_ShowNum(0,32,z,5,16,1);

四、获取加速度值

其地址如上,从上到下分别为X轴高八位陀加速度值、x轴低八位加速度值、Y轴高八位加速度值......由于其地址也为连续的,我们只需调取连续读函数读0x3b读取6次就可以了。

//得到加速度值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
void MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{u8 buf[6];  MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);*ax=((u16)buf[0]<<8)|buf[1];  *ay=((u16)buf[2]<<8)|buf[3];  *az=((u16)buf[4]<<8)|buf[5];
}

至此,MPU6050的使用长不多已经写完了,下一章将继续讲解MPU6050怎样将原始数据格式转换为欧拉角:航向角(yaw,也叫偏航角)、横滚角(roll)和俯仰角(pitch)。

这里附上其总代码:

mpu6050.c

#include "mpu6050.h"//初始化MPU6050
//返回值:0,成功
//       其他,错误代码
u8 MPU_Init(void)
{ u8 res; MPU_IIC_Init();//初始化IIC总线MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);	//复位MPU6050delay_ms(100);MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);	//唤醒MPU6050 MPU_Set_Gyro_Fsr(3);					//陀螺仪传感器,±2000dpsMPU_Set_Accel_Fsr(0);					//加速度传感器,±2gMPU_Set_Rate(50);						//设置采样率50HzMPU_Write_Byte(MPU_INT_EN_REG,0X00);	//关闭所有中断MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);	//I2C主模式关闭MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);	//关闭FIFOres=MPU_Read_Byte(MPU_DEVICE_ID_REG); if(res==MPU_ADDR)//器件ID正确{MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);	//设置CLKSEL,PLL X轴为参考MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);	//加速度与陀螺仪都工作MPU_Set_Rate(50);						//设置采样率为50Hz}else return 1;return 0;
}//设置MPU6050陀螺仪传感器满量程范围
//fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
//返回值:0,设置成功
//    其他,设置失败 
u8 MPU_Set_Gyro_Fsr(u8 fsr)
{return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围  
}
//设置MPU6050加速度传感器满量程范围
//fsr:0,±2g;1,±4g;2,±8g;3,±16g
//返回值:0,设置成功
//    其他,设置失败 
u8 MPU_Set_Accel_Fsr(u8 fsr)
{return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围  
}
//设置MPU6050的数字低通滤波器
//lpf:数字低通滤波频率(Hz)
//返回值:0,设置成功
//    其他,设置失败 
u8 MPU_Set_LPF(u16 lpf)
{u8 data=0;if(lpf>=188)data=1;else if(lpf>=98)data=2;else if(lpf>=42)data=3;else if(lpf>=20)data=4;else if(lpf>=10)data=5;else data=6; return MPU_Write_Byte(MPU_CFG_REG,data);//设置数字低通滤波器  
}
//设置MPU6050的采样率(假定Fs=1KHz)
//rate:4~1000(Hz)
//返回值:0,设置成功
//    其他,设置失败 
u8 MPU_Set_Rate(u16 rate)
{u8 data;if(rate>1000)rate=1000;if(rate<4)rate=4;data=1000/rate-1;data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);	//设置数字低通滤波器return MPU_Set_LPF(rate/2);	//自动设置LPF为采样率的一半
}//IIC写一个字节 
//reg:寄存器地址
//data:数据
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Byte(u8 reg,u8 data) 				 
{ MPU_IIC_Start(); MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	if(MPU_IIC_Wait_Ack())	//等待应答{MPU_IIC_Stop();		 return 1;		}MPU_IIC_Send_Byte(reg);	//写寄存器地址MPU_IIC_Wait_Ack();		//等待应答 MPU_IIC_Send_Byte(data);//发送数据if(MPU_IIC_Wait_Ack())	//等待ACK{MPU_IIC_Stop();	 return 1;		 }		 MPU_IIC_Stop();	 return 0;
}//IIC读一个字节 
//reg:寄存器地址 
//返回值:读到的数据
u8 MPU_Read_Byte(u8 reg)
{u8 res;MPU_IIC_Start(); MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令	MPU_IIC_Wait_Ack();		//等待应答 MPU_IIC_Send_Byte(reg);	//写寄存器地址MPU_IIC_Wait_Ack();		//等待应答MPU_IIC_Start();MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//发送器件地址+读命令	MPU_IIC_Wait_Ack();		//等待应答 res=MPU_IIC_Read_Byte(0);//读取数据,发送nACK MPU_IIC_Stop();			//产生一个停止条件 return res;		
}//IIC连续写
//addr:器件地址 
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
//    其他,错误代码
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{u8 i; MPU_IIC_Start(); MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令	if(MPU_IIC_Wait_Ack())	//等待应答{MPU_IIC_Stop();		 return 1;		}MPU_IIC_Send_Byte(reg);	//写寄存器地址MPU_IIC_Wait_Ack();		//等待应答for(i=0;i<len;i++){MPU_IIC_Send_Byte(buf[i]);	//发送数据if(MPU_IIC_Wait_Ack())		//等待ACK{MPU_IIC_Stop();	 return 1;		 }		}    MPU_IIC_Stop();	 return 0;	
} 
//IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
//    其他,错误代码
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{ MPU_IIC_Start(); MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令	if(MPU_IIC_Wait_Ack())	//等待应答{MPU_IIC_Stop();		 return 1;		}MPU_IIC_Send_Byte(reg);	//写寄存器地址MPU_IIC_Wait_Ack();		//等待应答MPU_IIC_Start();MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令	MPU_IIC_Wait_Ack();		//等待应答 while(len){if(len==1)*buf=MPU_IIC_Read_Byte(0);//读数据,发送nACK else *buf=MPU_IIC_Read_Byte(1);		//读数据,发送ACK  len--;buf++; }    MPU_IIC_Stop();	//产生一个停止条件 return 0;	
}//得到温度值
//返回值:温度值(扩大了100倍)
short MPU_Get_Temperature(void)
{u8 buf[2]; //用于存放温度short raw;float temp;MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf); //连续读两次,第一次为0x41,第二次为0x42raw=((u16)buf[0]<<8)|buf[1];  //将8位数据整合为16位temp=36.53+((double)raw)/340;  //得到温度值return temp*100;//为了好处理数据,这里扩大100倍
}//得到陀螺仪值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
//返回值:0,成功
//    其他,错误代码
void MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
{u8 buf[6];  MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);*gx=((u16)buf[0]<<8)|buf[1];  *gy=((u16)buf[2]<<8)|buf[3];  *gz=((u16)buf[4]<<8)|buf[5];	
}//得到加速度值(原始值)
//gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
void MPU_Get_Accelerometer(short *ax,short *ay,short *az)
{u8 buf[6];  MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);*ax=((u16)buf[0]<<8)|buf[1];  *ay=((u16)buf[2]<<8)|buf[3];  *az=((u16)buf[4]<<8)|buf[5];
}

mpu6050.h

#ifndef __MPU6050_H
#define __MPU6050_H
#include "mpuiic.h"   												  	  
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板V3
//MPU6050 驱动代码	   
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/1/17
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved									  
// //MPU6050 AD0控制脚
#define MPU_AD0_CTRL			PAout(15)	//控制AD0电平,从而控制MPU地址//#define MPU_ACCEL_OFFS_REG		0X06	//accel_offs寄存器,可读取版本号,寄存器手册未提到
//#define MPU_PROD_ID_REG			0X0C	//prod id寄存器,在寄存器手册未提到
#define MPU_SELF_TESTX_REG		0X0D	//自检寄存器X
#define MPU_SELF_TESTY_REG		0X0E	//自检寄存器Y
#define MPU_SELF_TESTZ_REG		0X0F	//自检寄存器Z
#define MPU_SELF_TESTA_REG		0X10	//自检寄存器A
#define MPU_SAMPLE_RATE_REG		0X19	//采样频率分频器
#define MPU_CFG_REG				0X1A	//配置寄存器
#define MPU_GYRO_CFG_REG		0X1B	//陀螺仪配置寄存器
#define MPU_ACCEL_CFG_REG		0X1C	//加速度计配置寄存器
#define MPU_MOTION_DET_REG		0X1F	//运动检测阀值设置寄存器
#define MPU_FIFO_EN_REG			0X23	//FIFO使能寄存器
#define MPU_I2CMST_CTRL_REG		0X24	//IIC主机控制寄存器
#define MPU_I2CSLV0_ADDR_REG	0X25	//IIC从机0器件地址寄存器
#define MPU_I2CSLV0_REG			0X26	//IIC从机0数据地址寄存器
#define MPU_I2CSLV0_CTRL_REG	0X27	//IIC从机0控制寄存器
#define MPU_I2CSLV1_ADDR_REG	0X28	//IIC从机1器件地址寄存器
#define MPU_I2CSLV1_REG			0X29	//IIC从机1数据地址寄存器
#define MPU_I2CSLV1_CTRL_REG	0X2A	//IIC从机1控制寄存器
#define MPU_I2CSLV2_ADDR_REG	0X2B	//IIC从机2器件地址寄存器
#define MPU_I2CSLV2_REG			0X2C	//IIC从机2数据地址寄存器
#define MPU_I2CSLV2_CTRL_REG	0X2D	//IIC从机2控制寄存器
#define MPU_I2CSLV3_ADDR_REG	0X2E	//IIC从机3器件地址寄存器
#define MPU_I2CSLV3_REG			0X2F	//IIC从机3数据地址寄存器
#define MPU_I2CSLV3_CTRL_REG	0X30	//IIC从机3控制寄存器
#define MPU_I2CSLV4_ADDR_REG	0X31	//IIC从机4器件地址寄存器
#define MPU_I2CSLV4_REG			0X32	//IIC从机4数据地址寄存器
#define MPU_I2CSLV4_DO_REG		0X33	//IIC从机4写数据寄存器
#define MPU_I2CSLV4_CTRL_REG	0X34	//IIC从机4控制寄存器
#define MPU_I2CSLV4_DI_REG		0X35	//IIC从机4读数据寄存器#define MPU_I2CMST_STA_REG		0X36	//IIC主机状态寄存器
#define MPU_INTBP_CFG_REG		0X37	//中断/旁路设置寄存器
#define MPU_INT_EN_REG			0X38	//中断使能寄存器
#define MPU_INT_STA_REG			0X3A	//中断状态寄存器#define MPU_ACCEL_XOUTH_REG		0X3B	//加速度值,X轴高8位寄存器
#define MPU_ACCEL_XOUTL_REG		0X3C	//加速度值,X轴低8位寄存器
#define MPU_ACCEL_YOUTH_REG		0X3D	//加速度值,Y轴高8位寄存器
#define MPU_ACCEL_YOUTL_REG		0X3E	//加速度值,Y轴低8位寄存器
#define MPU_ACCEL_ZOUTH_REG		0X3F	//加速度值,Z轴高8位寄存器
#define MPU_ACCEL_ZOUTL_REG		0X40	//加速度值,Z轴低8位寄存器#define MPU_TEMP_OUTH_REG		0X41	//温度值高八位寄存器
#define MPU_TEMP_OUTL_REG		0X42	//温度值低8位寄存器#define MPU_GYRO_XOUTH_REG		0X43	//陀螺仪值,X轴高8位寄存器
#define MPU_GYRO_XOUTL_REG		0X44	//陀螺仪值,X轴低8位寄存器
#define MPU_GYRO_YOUTH_REG		0X45	//陀螺仪值,Y轴高8位寄存器
#define MPU_GYRO_YOUTL_REG		0X46	//陀螺仪值,Y轴低8位寄存器
#define MPU_GYRO_ZOUTH_REG		0X47	//陀螺仪值,Z轴高8位寄存器
#define MPU_GYRO_ZOUTL_REG		0X48	//陀螺仪值,Z轴低8位寄存器#define MPU_I2CSLV0_DO_REG		0X63	//IIC从机0数据寄存器
#define MPU_I2CSLV1_DO_REG		0X64	//IIC从机1数据寄存器
#define MPU_I2CSLV2_DO_REG		0X65	//IIC从机2数据寄存器
#define MPU_I2CSLV3_DO_REG		0X66	//IIC从机3数据寄存器#define MPU_I2CMST_DELAY_REG	0X67	//IIC主机延时管理寄存器
#define MPU_SIGPATH_RST_REG		0X68	//信号通道复位寄存器
#define MPU_MDETECT_CTRL_REG	0X69	//运动检测控制寄存器
#define MPU_USER_CTRL_REG		0X6A	//用户控制寄存器
#define MPU_PWR_MGMT1_REG		0X6B	//电源管理寄存器1
#define MPU_PWR_MGMT2_REG		0X6C	//电源管理寄存器2 
#define MPU_FIFO_CNTH_REG		0X72	//FIFO计数寄存器高八位
#define MPU_FIFO_CNTL_REG		0X73	//FIFO计数寄存器低八位
#define MPU_FIFO_RW_REG			0X74	//FIFO读写寄存器
#define MPU_DEVICE_ID_REG		0X75	//器件ID寄存器//如果AD0脚(9脚)接地,IIC地址为0X68(不包含最低位).
//如果接V3.3,则IIC地址为0X69(不包含最低位).
#define MPU_ADDR				0X68因为模块AD0默认接GND,所以转为读写地址后,为0XD1和0XD0(如果接VCC,则为0XD3和0XD2)  
//#define MPU_READ    0XD1
//#define MPU_WRITE   0XD0u8 MPU_Init(void); 								//初始化MPU6050
u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf);//IIC连续写
u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf); //IIC连续读 
u8 MPU_Write_Byte(u8 reg,u8 data);				//IIC写一个字节
u8 MPU_Read_Byte(u8 reg);						//IIC读一个字节u8 MPU_Set_Gyro_Fsr(u8 fsr);
u8 MPU_Set_Accel_Fsr(u8 fsr);
u8 MPU_Set_LPF(u16 lpf);
u8 MPU_Set_Rate(u16 rate);
u8 MPU_Set_Fifo(u8 sens);short MPU_Get_Temperature(void);
void MPU_Get_Gyroscope(short *gx,short *gy,short *gz);
void MPU_Get_Accelerometer(short *ax,short *ay,short *az);#endif

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

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

相关文章

用户管理的小demo--过滤器filter

1、创建 CharEncodingFilter.java package com.by.filter; import javax.servlet.*; import java.io.IOException; public class CharEncodingFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void …

C++ | Leetcode C++题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; class Solution { public:int candy(vector<int>& ratings) {int n ratings.size();int ret 1;int inc 1, dec 0, pre 1;for (int i 1; i < n; i) {if (ratings[i] > ratings[i - 1]) {dec 0;pre ratings[i] rati…

116页 | 2024年中国金融行业网络安全研究报告(免费下载)

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff01;&#xff01;&#xff01;

Linux - 深入理解/proc虚拟文件系统:从基础到高级

文章目录 Linux /proc虚拟文件系统/proc/self使用 /proc/self 的优势/proc/self 的使用案例案例1&#xff1a;获取当前进程的状态信息案例2&#xff1a;获取当前进程的命令行参数案例3&#xff1a;获取当前进程的内存映射案例4&#xff1a;获取当前进程的文件描述符 /proc中进程…

学校教学选择SOLIDWORKS教育版的理由

在现代工程和技术教育领域中&#xff0c;计算机辅助设计软件&#xff08;CAD&#xff09;已成为不可或缺的教学工具。SOLIDWORKS作为一款功能强大、易于上手的CAD软件&#xff0c;其教育版在学校教学中备受青睐。本文将从多个方面探讨学校教学选择SOLIDWORKS教育版的理由。 一…

纷享销客集成平台(iPaaS)的应用与实践

案例一 企业系统集成的产品级解决方案 概况 随着国家出台一系列鼓励LED照明产业发展与创新的规划和政策&#xff0c;以及国际市场全球演唱会、音乐会的活跃以及线上零售、商业地产等行业回暖&#xff0c;LED显示行业发展形势积极向好。深圳市艾比森光电股份有限公司&#xff…

苹果警告部分 iPhone 用户称他们遭到雇佣间谍软件攻击

苹果警告部分 iPhone 用户称他们遭到“雇佣间谍软件攻击 苹果正在提醒用户注意针对 iPhone 的新一轮已识别雇佣间谍软件攻击。可能的受害者已经收到来自苹果的电子邮件&#xff0c;其中描述了该攻击如何“远程破坏 iPhone”。据路透社报道&#xff0c;印度和其他 91 个国家的受…

为何PHP使用率 大幅度下降!需求量几乎为零!

用PHP的人越来越少的主要原因包括&#xff1a;市场竞争加剧、新技术的出现、性能和安全问题、以及开发者社区的变化。市场竞争加剧是其中一个突出的因素。随着Python、Node.js等现代编程语言的崛起&#xff0c;它们提供了更好的性能、更简洁的语法和更丰富的框架&#xff0c;逐…

2024我们该学习大模型吗?

一、引言 在快速变化的科技行业中&#xff0c;人工智能&#xff08;AI&#xff09;大模型已成为研究和应用的热点。随着AI技术的不断进步&#xff0c;特别是在自然语言处理、计算机视觉和机器学习平台等领域&#xff0c;许多专业人士开始将目光投向AI大模型的开发和应用。 二…

JeeSite 快速开发平台 Vue3 前端版介绍

JeeSite 快速开发平台 Vue3 前端版介绍&#xff1a; 它构建于 Vue3、Vite、Ant-Design-Vue、TypeScript 以及 Vue Vben Admin 等最前沿的技术栈之上&#xff0c;能助力初学者迅速上手并顺利融入团队开发进程。涵盖的模块包括组织机构、角色用户、菜单授权、数据权限、系统参数…

LLM的基础模型6:注意力机制

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

MongoDB~索引使用与优化

Study by&#xff1a; https://docs.mongoing.com/indexeshttps://www.cnblogs.com/Neeo/articles/14325130.html#%E5%85%B6%E4%BB%96%E7%B4%A2%E5%BC%95 作用 如果你把数据库类比为一本书&#xff0c;那书的具体内容是数据&#xff0c;书的目录就是索引&#xff0c;所以索引…

NIST 电子病历中的疫苗部分的认证

美国国家标准与技术研究院&#xff08;National Institute of Standards and Technology&#xff0c;NIST&#xff09;对电子病历的认证 分几个阶段&#xff0c;每个阶段又分门诊和住院&#xff0c;然后又分若干模块。下面是疫苗模块的数据提交的测试脚本。 170.302k_Immuniza…

数据提取:构建企业智能决策的基石

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。而数据提取&#xff0c;作为数据分析和智能决策的第一步&#xff0c;正日益成为企业构建竞争优势的关键环节。本文将探讨数据提取的重要性、方法以及它如何为企业的智能决策奠定坚实基础。 一、数据提取的重要性 洞…

多线程..

线程定义&#xff1a;线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中实际运作单位。简单来说&#xff0c;应用软件中相互独立&#xff0c;可以同时运作的功能。 多线程作用&#xff1a;有了多线程&#xff0c;我们就可以让程序…

【机器学习300问】108、什么是多项式回归模型?

一、多项式回归是什么 &#xff08;1&#xff09;举例说明 假设你经营着一家农场&#xff0c;想要根据土地面积来预测作物的产量。如果你只用线性模型&#xff08;即&#xff09;&#xff0c;你可能会发现它并不足以描述实际的产量情况&#xff0c;因为实际产量可能会随着土地…

Acwing 786.第K个数

Acwing 786.第K个数 题目描述 786. 第k个数 - AcWing题库 运行代码 #include <iostream> #include <algorithm> using namespace std; const int N 100010; int q[N];int main() {int n, k;scanf("%d%d", &n, &k);for (int i 0; i < n; …

opencv进阶 ——(十三)基于三角剖分实现换脸

换脸的关键在于人脸对齐&#xff0c;人脸对齐主要包括以下几点&#xff1a; 1、人脸可能存在一定的角度&#xff0c;因此需要先将倾斜方向进行对齐 2、大小对齐&#xff0c;将模板人脸的大小缩放到同一大小 3、要想有好的效果&#xff0c;关键点选取很重要 4、人脸对齐后&a…

黑马python-JavaScript

1.JavaScript的定义&#xff1a; JavaScript是运行在浏览器端的脚步语言&#xff0c;是由浏览器解释执行的、简称js。它能够让网页和用户有交互功能&#xff0c;增加良好的用户体验效果 2.使用方式&#xff1a; 1.行内式&#xff08;主要用于事件&#xff09; <input type&q…

【大数据】计算引擎:Spark核心概念

目录 前言 1.什么是Spark 2.核心概念 2.1.Spark如何拉高计算性能 2.2.RDD 2.3.Stage 3.运行流程 前言 本文是作者大数据系列中的一文&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体…