当前位置: 首页 > news >正文

51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储秒表

27. AT24C02(I2C总线)

  • 27.1. 存储器介绍
    在这里插入图片描述

  • 27.2. 存储器简化模型介绍,存储原理
    在这里插入图片描述

  • 27.3. AT24C02介绍
    •AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息
    •存储介质:E2PROM
    •通讯接口:I2C总线
    •容量:256字节

在这里插入图片描述

  • 27.4. AT24C02引脚及应用电路,VCC接电源,A0~A2和GND接地,WP写保护接地,上拉电阻在单片机接口位置已经接好,开发板原理图中就不需要接了
    在这里插入图片描述

  • 27.5. AT24C02内部结构框图,EEPROM为存储单元网格,DEC译码器,RECOVERY数据擦除,
    在这里插入图片描述

  • 27.6. I2C总线介绍
    •I2C总线(Inter IC BUS)是由Philips公司开发的一种通用数据总线(通信协议,实现多设备通信,并标准规范化数据通信)
    •两根通信线:SCL(Serial Clock)、SDA(Serial Data)
    •同步、半双工,带数据应答
    •通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度。(标准和专利付费),下面是I2C相关的附件设备,左边第一个12864的小屏幕,中间是DS3231的时钟芯片,精度更高,右侧是陀螺仪。

在这里插入图片描述

  • 27.7. I2C电路规范
    •所有I2C设备的SCL连在一起,SDA连在一起
    •设备的SCL和SDA均要配置成开漏输出模式(单片机IO口为弱上拉模式,可以想象成输出口带上拉电阻,输出电流受限,开漏模式则是在上述基础上取消上拉电阻,无输出的时候IO口容易受外界干扰,电压不稳定)
    •SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右(有标准规定,什么速率接什么电阻)
    •开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题(可以实现与一个设备通信的时候,其他设备处于“断开”的状态,防止通信干扰)
    在这里插入图片描述

  • 27.8. I2C时序结构(六块拼图)
    •起始条件:SCL高电平期间,SDA从高电平切换到低电平(S蓝色开始)
    •终止条件:SCL高电平期间,SDA从低电平切换到高电平(P红色结束)
    在这里插入图片描述

  • 27.9. I2C时序结构_发送一个字节_绿色S byte
    •发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节(下面SDA是连根线麻花的状态的意思是SDA初始情况不确定是0还是1,在SCL高电平(固定SDA的0或1状态),红色框是基本结构,SDA的最终状态看数据发送完毕后的状态,如果是0就是低电平,1就是高电平)
    在这里插入图片描述

  • 27.10. I2C时序结构_接收一个字节_紫色byte
    •接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
    在这里插入图片描述

  • 27.11. I2C时序结构
    •发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
    •接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
    在这里插入图片描述

  • 27.12. I2C数据帧
    •发送一帧数据(S为开始)(S:SLAVE+ADDRESS+W写,1读0写,地址前4位固定,24C02为1010,24C02芯片引脚A2,A1,A0接地0)(RA接收应答,从机应该发0)(S byte数据)(结束)
    在这里插入图片描述

    •完成任务:(上述完成)向谁发什么

  • 27.13. I2C数据帧
    •接收一帧数据:(S开始)(发送地址+R读)(RA应答0)(数据读)(主机发送应答)。。。(最后可发应答或非应答)(结束)
    在这里插入图片描述

    •完成任务:(上述完成)向谁收什么

  • 27.14. I2C数据帧
    •先发送再接收数据帧(复合格式)上述两个拼接,取消了一个P
    在这里插入图片描述

    •完成任务:向谁收指定的什么

  • 27.15. AT24C02数据帧
    •字节写:在WORD ADDRESS处写入数据DATA(发送一帧数据的变形)
    在这里插入图片描述

    •随机读:读出在WORD ADDRESS处的数据DATA(复合格式)
    在这里插入图片描述

    •AT24C02的固定地址为1010,可配置地址本开发板上为000
    所以SLAVE ADDRESS+W写为0xA0(1010 0000),SLAVE ADDRESS+R读为0xA1(1010 0001)

  • 27.16. AT24C02数据帧
    •字节写:在“字地址”处写入“数据”
    在这里插入图片描述

    •随机读:读出在“字地址”处的“数据”
    在这里插入图片描述

    27.17. 24C02手册介绍24C04地址8位不够(8位256)

28. AT24C02数据存储&秒表

  • 28.1. 程序设计思路

    • 分为2个模块I2C.c 和AT24C02.c
    • I2C.c模块包括6个模块,开始,结束,发送字节,接受字节,发送应答,接受应答
    • AT24C02写2个数据帧,第一个数据帧在地址下写入数据,第二个在某个地址下读出;
    • main中只需要调用AT24C02函数即可;
  • 28.2. Proteus测试环境搭建
    在Proteus中搜索 24C02找到24C02C并插入;
    在这里插入图片描述

    • 笔者的例子中的接线方式如图
      在这里插入图片描述
  • 28.3. 按照编程思路,先做好I2C.c模块程序如下:

#include <REGX52.H>sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;/*** @brief I2C开始	* @param 无* @retval 无*/void I2C_Start(void)	
{I2C_SDA=1; //不清楚SDA 的初始状态,所以都置1I2C_SCL=1;I2C_SDA=0;I2C_SCL=0;
}/*** @brief I2C停止* @param * @retval */void I2C_Stop(void)	
{I2C_SDA=0; //不清楚SDA 的初始状态,所以都置1I2C_SCL=1;I2C_SDA=1;
}/*** @brief I2C发送一个字节* @param Byte要发送的字节* @retval 无*/void I2C_SendByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){I2C_SDA=Byte&(0x80>>i);I2C_SCL=1;				//复核芯片手册关于高低切换时间的限制;I2C_SCL=0;				//所以此处无需delay;} 
}/*** @brief I2C接收一个字节* @param 无* @retval 接收到的一个字节数据*/unsigned char I2C_ReceiveByte()
{unsigned char i,Byte;I2C_SDA=1;for(i=0;i<8;i++){I2C_SCL=1;if(I2C_SDA){Byte|=(0x80>>i);}I2C_SCL=0;}return Byte;
}/*** @brief I2C发送应答* @param AckBit应答位,0为应答,1为非应答* @retval 无*/void I2C_SendAck(unsigned char AckBit)
{I2C_SDA=AckBit;I2C_SCL=1;I2C_SCL=0;
}/*** @brief I2C接收应答位* @param 无	* @retval 接收到的应答位,0为应答,1为非应答*/unsigned char I2C_ReceiveAck(void)
{unsigned char AckBit;I2C_SDA=1;I2C_SCL=1;AckBit=I2C_SDA;I2C_SCL=0;return AckBit;
}
  • 28.4. I2C.h程序如下:
#ifndef _I2C_H_  
#define _I2C_H_  void I2C_Start(void);void I2C_Stop(void);void I2C_SendByte(unsigned char Byte);unsigned char I2C_ReceiveByte();void I2C_SendAck(unsigned char AckBit);unsigned char I2C_ReceiveAck(void);#endif
  • 28.5. AT24C02.c的程序如下:
#include <REGX52.h>
#include "I2C.h"#define AT24C02_ADDRESS 0xa0/*** @brief AT24C02 写入一个字节* @param WordAddress字节要写入的地址0~255,Data要写入的数据* @retval 无*/void AT24C02_WriteByte(unsigned char WordAddress, Data)
{I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_SendByte(Data);I2C_ReceiveAck();I2C_Stop();
}/*** @brief AT24C02读取一个字节* @param WordAddress 要读出的字节的地址* @retval 读出的数据*/unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{unsigned char Data;I2C_Start();I2C_SendByte(AT24C02_ADDRESS);I2C_ReceiveAck();I2C_SendByte(WordAddress);I2C_ReceiveAck();I2C_Start();I2C_SendByte(AT24C02_ADDRESS|0x01);I2C_ReceiveAck();Data=I2C_ReceiveByte();	I2C_SendAck(1);I2C_Stop();	return Data;
}
  • 28.6. AT24C02.h的程序如下:
#ifndef _AT24C02_H_  
#define _AT24C02_H_  void AT24C02_WriteByte(unsigned char WordAddress, Data);
unsigned char AT24C02_ReadByte(unsigned char WordAddress);#endif
  • 28.7. 主程序如下,在独立按键1按下的时候增加数字(最大65535),独立按键2按下的时候减小数字(最小0),按键3按下的时候,将对应的数字写入AT24C02,按键4按下的时候读出并显示之前写入的数字;
#include <REGX52.h>
#include "Four_Key.h"
#include "LCD1602.h"
#include "AT24C02.h"
#include "delay_xms.h"unsigned char KeyNum;
unsigned int Num;void main()
{LCD_Init();					//LCD1602初始化LCD_ShowString(1,1,"Hello");//不按按键显示Hello
//	AT24C02_WriteByte(0,123);
//	delay_xms(5);
//	AT24C02_WriteByte(1,234);
//	delay_xms(5);
//	AT24C02_WriteByte(2,345);
//	delay_xms(5);
//	Data=AT24C02_ReadByte(1);
//	LCD_ShowNum(2,1,Data,3);while(1){KeyNum=Four_Key();if(KeyNum==1){Num++;LCD_ShowNum(1,1,Num,5);//数字随按键1按下释放后增加}if(KeyNum==2){Num--;LCD_ShowNum(1,1,Num,5);//数字随按键2按下释放后减小}if(KeyNum==3){AT24C02_WriteByte(0,Num%256);delay_xms(5);AT24C02_WriteByte(1,Num/256);delay_xms(5);LCD_ShowString(2,1,"Write OK");delay_xms(1000);LCD_ShowString(2,1,"        ");//将数字拆分高低8位写入,写入后延时5ms}	if(KeyNum==4){Num=AT24C02_ReadByte(0);Num|=AT24C02_ReadByte(1)<<8;LCD_ShowNum(1,1,Num,5);LCD_ShowString(2,1,"Read OK");delay_xms(1000);				//读出并显示之前写入的数字}			}}
  • 28.8. Proteus仿真和开发板测试无误
    在这里插入图片描述

  • 28.9. 新建工程AT24C02数据存储&秒表-定时器扫描按键数码管

    • 工程的编程思路:
    • 主函数main直接引用三个模块:定时器模块,独立按键模块和数码管模块
    • 但是数码管和按键扫描需用用到定时器中断,如果独立按键模块和数码管模块直接一起调用定时器模块会出错;
    • 所以需要改变写法;
    • main中写定时器中断,按键模块中写一个函数是中断函数的调用,数码管一样的思路(称为驱动函数或调用函数,让主函数每隔一段时间调用一下)
    • 反之,如果将独立按键模块与数码管显示都放在定时器模块中,则程序耦合性较高,太混乱,不利于代码管理;
    • 之前的独立按键模块是用延时函数,为了消抖在按键按下后延时20ms,松开后依旧延时20ms,如果按键不松手,按键模块在while(1)中一直循环等待,之后考虑修改为每隔20ms对按键进行扫描(同时过滤了抖动),看按键的状态,同时设立一个标志位对比按键按下前后的状态,每隔20ms进行前后标志位对比,如果标志位没有变化说明按键没有按下,否则为按下,按键不卡程序;
  • 28.10. 新建工程,程序需要实现的功能为,按下按键1,松开后秒表开始计时,再按一下1松开,秒表计时停止,按下按键2,计数清零,按下按键3,存储数据到AT24C02,按下按键4,将之前存储的数据显示在数码管上面,新建的工程中的数码管显示的模块程序为:

  • nixietube.c

#include <REGX52.H>			
#include "delay_xms.h"		unsigned char Nixie_Buf[9]={0,10,10,10,10,10,10,10,10,};unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};void Nixie_SetBuf(unsigned char Location,Number)
{Nixie_Buf[Location]=Number;
}void Nixie_Scan(unsigned char Location,Number)
{P0=0x00;//清零;switch(Location){case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=NixieTable[Number];//数码管消影,因为位选-段选-位选-段选,段选数据与位选穿位导致
}void Nixie_Loop(void)
{static unsigned char i;//计次Nixie_Scan(i,Nixie_Buf[i]);i++;if(i>=9){i=1;}}
  • nixietube.h的程序为:
#ifndef _NIXIETUBE_H_
#define _NIXIETUBE_H_void Nixie_SetBuf(unsigned char Location,Number);
void Nixie_Scan(unsigned char Location,Number);
void Nixie_Loop(void);#endif
  • 独立按键的模块程序Key.c程序为:
#include <REGX52.h>
#include "delay_xms.h"unsigned char Key_KeyNumber;unsigned char Key(void)
{unsigned char Temp=0;  //加入中间变量,对Key_KeyNumber进行清0Temp=Key_KeyNumber;Key_KeyNumber=0;return Temp;		
}unsigned char Key_GetStatus()
{unsigned char KeyNum=0;if(P3_1==0){KeyNum=1;}if(P3_0==0){KeyNum=2;}if(P3_2==0){KeyNum=3;}if(P3_3==0){KeyNum=4;}return KeyNum;
}void Key_Loop(void)
{static unsigned char Now_Status,Last_Status;Last_Status=Now_Status;Now_Status=Key_GetStatus();if(Last_Status==1 && Now_Status==0){Key_KeyNumber=1;}if(Last_Status==2 && Now_Status==0){Key_KeyNumber=2;}if(Last_Status==3 && Now_Status==0){Key_KeyNumber=3;}if(Last_Status==4 && Now_Status==0){Key_KeyNumber=4;}
}
  • Key.h的程序为:
#ifndef _KEY_H_ 
#define _KEY_H_  unsigned char Key();void Key_Loop();#endif
  • main.c主函数程序为:
#include <REGX52.h>
#include "TimeR0.h"
#include "Key.h"
#include "nixietube.h"
#include "delay_xms.h"
#include "AT24C02.h"unsigned char KeyNum;
unsigned char Min,Sec,mSec;
unsigned char RunFlag;void main()
{TimeR0_Init();while(1){KeyNum=Key();if(KeyNum==1){RunFlag=!RunFlag;}if(KeyNum==2){Min=0;Sec=0;mSec=0;}	if(KeyNum==3){AT24C02_WriteByte(0,Min);delay_xms(5);AT24C02_WriteByte(1,Sec);delay_xms(5);AT24C02_WriteByte(2,mSec);delay_xms(5);			}if(KeyNum==4){Min=AT24C02_ReadByte(0);Sec=AT24C02_ReadByte(1);mSec=AT24C02_ReadByte(2);			}Nixie_SetBuf(1,Min/10);Nixie_SetBuf(2,Min%10);Nixie_SetBuf(3,11);Nixie_SetBuf(4,Sec/10);Nixie_SetBuf(5,Sec%10);Nixie_SetBuf(6,11);Nixie_SetBuf(7,mSec/10);Nixie_SetBuf(8,mSec%10);}
}void Sec_Loop(void)
{mSec++;if(mSec>=100){mSec=0;Sec++;if(Sec>=60){Sec=0;Min++;if(Min>=60){Min=0;}}}
}void TimeR0_Routine() interrupt 1 //中断子函数
{static unsigned int T0Count1,T0Count2,T0Count3; //设置静态子函数用T0Count,防止T0Count丢失TL0=0x18;					 //设置定时初始值TH0=0xFC;					 //设置定时初始值T0Count1++;if(T0Count1>=1000){T0Count1=0;Key_Loop();}T0Count2++;if(T0Count2>=2){T0Count2=0;Nixie_Loop();}T0Count3++;if(T0Count3>=10){T0Count3=0;Sec_Loop();}
}
  • Proteus仿真
    在这里插入图片描述

相关文章:

51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储秒表

27. AT24C02(I2C总线) 27.1. 存储器介绍 27.2. 存储器简化模型介绍&#xff0c;存储原理 27.3. AT24C02介绍 •AT24C02是一种可以实现掉电不丢失的存储器&#xff0c;可用于保存单片机运行时想要永久保存的数据信息 •存储介质&#xff1a;E2PROM •通讯接口&#xff1a;I2…...

LeetCode-热题100:169. 多数元素

题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a; nums [3,2,3] 输出&#xf…...

汽车维修类中译英的英语翻译

近年来&#xff0c;随着全球化的加速和汽车市场的不断扩大&#xff0c;汽车维修领域的交流与合作也日益频繁。汽车维修类中译英的英语翻译在汽车行业中扮演着至关重要的角色。那么&#xff0c;针对汽车维修类翻译&#xff0c;中译英的英语翻译有何技巧&#xff1f; 业内人士指出…...

java中的List,ArrayList和LinkedList集合

List集合&#xff1a; void add(int index, E element) Inserts the specified element at the specified position in this list (optional operation). 在此集合中的指定位置插入指定元素 E remove(int index) Removes the element at the specified position in this list (…...

RESTful API与Web应用程序构建:原理与实践

在现代Web开发中&#xff0c;RESTful API已经成为构建应用程序的核心组件之一。RESTful API不仅为前后端分离的开发模式提供了强有力的支持&#xff0c;还使得不同服务和应用之间的数据交互变得简单高效。本文将深入探讨RESTful API的原理&#xff0c;并展示如何使用它来构建We…...

输了,腾讯golang一面凉了

本月正值4月,是金三银四的找工作的最佳时机。同时竞争也是很大,因为每年这个时候快要毕业的大学生也进去了找工作的潮水中。 今天分享我的一位大佬朋友CC,勇闯腾讯golang的面试经历。 这次面试问题的方向主要集中在计算机基础个网络方面。 下面是主要问到的问题。 第一个…...

如何通过代码签名证书加强安全防护?

在当今数字化时代&#xff0c;安全防护是用户和企业保护其数据和应用程序免受恶意攻击的关键。代码签名证书是一种通过数字签名来验证软件代码来源和完整性的安全工具。通过对软件代码进行数字签名&#xff0c;代码签名证书可以加强安全防护&#xff0c;防止恶意软件和篡改攻击…...

Docker速成:新手变专家!

Docker介绍 容器历史 1、Chroot Jail 就是常见的chroot命令的用法。它在1979年的时候就出现了&#xff0c;被认为是最早的容器化技术之一。它可以把一个进程的文件系统隔离起来。 2、The FreeBSD Jail &#xff08;监狱&#xff09;实现了操作系统级别的虚拟化&#xff0c;他…...

numpy/arrayobject.h: No such file or directory

catkin编译时出现,numpy/arrayobject.h: No such file or directory 错误表明编译过程中找不到 NumPy 相关的头文件。这通常是因为环境中的 NumPy 没有被正确配置到包含路径中,或者 NumPy 没有被安装。以下是几个解决步骤来帮助你解决这个问题: 确认 NumPy 已安装 首先,确保…...

前端大文件分块上传、断点续传

文章目录 前端分块上传流程分块上传代码重点1. let start currentChunk * chunkSize;2. let end Math.min(file.size, start chunkSize);3. let chunk file.slice(start, end); 结合断点续传注意事项 大文件上传是一个复杂的过程&#xff0c;尤其是在前端&#xff0c;我们需…...

使用新版FLIR (FLIR_ADAS_v2) 数据集创建yolo格式数据集(目标检测)

FLIR在2022.1.19发布了新版的FLIR_ADAS_v2&#xff0c;有着更多的类别和数量更丰富的图像。数据集同步注释热图像和无注释RGB图像供参考。本文章主要介绍如何使用FLIR_ADAS_v2中的rgb图像和thermal图像来制作yolo格式数据集。 1.官方数据集下载&#xff1a;FLIR_ADAS_v2数据集…...

PHP发票查验接口未返回正确信息的原因、发票ocr识别接口

发票查验接口未返回正确信息的原因一般有以下几种&#xff0c;第一种可能是接口没有调通&#xff0c;第二种是本身这张发票就是一张错票、假票&#xff0c;第三种可能是税局系统或者网络问题等等。那么&#xff0c;遇到这种情况应该如何解决呢&#xff1f;翔云发票查验接口&…...

RA4000CE为汽车动力传动系统提供解决方案

目前汽车电气化的水平越来越高&#xff0c;其中比较显著的一个发展方向就是将发动机管理系统和自动变速器控制系统&#xff0c;集成为动力传动系统的综合控制(PCM)。作为汽车动力的核心部件&#xff0c;通过电子系统的运用&#xff0c;将外部多个传感器和执行环节的数据进行统一…...

算法中的二阶差分

众所周知&#xff0c;在往区间的每一个数都加上一个相同的数k&#xff0c;进行n次后会得到一个新的数列&#xff0c;如果每次加都循环区间挨个数加上k&#xff0c;这样时间复杂度无疑是O(n^2)&#xff0c;很高。这时可以采用一阶差分就可解决&#xff0c;这里默认会一阶差分&am…...

第十五届蓝桥杯Java A组参赛总结

一、比赛 4月13号那天上午9点到下午1点&#xff0c;线上比赛总共4小时。 因为很久没有参加过竞赛了&#xff0c;所以还是很紧张&#xff0c;睡觉都有点睡不好&#xff0c;生怕出什么差错 我参加的是java的A组&#xff0c;两道填空&#xff08;每道5分&#xff09;和六道大题…...

springCloudAlibaba集成seata实战(分布式事物详解)

一、分布式事务 1. 事务介绍 1.1 基础概念 事务&#xff1a;保证我们多个数据库操作的原子性&#xff0c;多个操作要么都成功要么都不成功 事务ACID原则 A&#xff08;Atomic&#xff09;原子性&#xff1a;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部…...

VRTK/SteamVR手柄震动功能

VRTK/SteamVR手柄震动功能 前言代码块 前言 手柄震动功能配合虚拟仿真模块的模拟电击等功能非常方便 代码块 SteamVR_Controller.DeviceRelation.Rightmost是右侧手柄 SteamVR_Controller.DeviceRelation.Leftmost是左侧手柄 var deviceIndex2 SteamVR_Controller.GetDevic…...

MYSQL索引优化方法

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是小周同志&#xff0c;25届双非校招生Java选手&#xff0c;很高兴认识大家 &#x1f4d5;学习出处&#xff1a;本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇 &#x1f525;如果感觉博主的文章还不错的…...

多模态 ——LLaVA 集成先进图像理解与自然语言交互GPT-4的大模型

概述 提出了一种大型模型 LLaVA&#xff0c;它使用 GPT-4 生成多模态语言图像指令跟随数据&#xff0c;并利用该数据将视觉和语言理解融为一体。初步实验表明&#xff0c;LLaVA 展示了出色的多模态聊天能力&#xff0c;在合成多模态指令上的表现优于 GPT-4。 在科学质量保证中…...

文献学习-33-一个用于生成手术视频摘要的python库

VideoSum: A Python Library for Surgical Video Summarization Authors: Luis C. Garcia-Peraza-Herrera, Sebastien Ourselin, and Tom Vercauteren Source: https://arxiv.org/pdf/2303.10173.pdf 这篇文章主要关注的是如何通过视频摘要来简化和可视化手术视频&#xff0c…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...

Excel 怎么让透视表以正常Excel表格形式显示

目录 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总 1、创建数据透视表 2、设计 》报表布局 》以表格形式显示 3、设计 》分类汇总 》不显示分类汇总...