2020年电赛省赛题目A——无线运动传感器节点设计

2023-05-16

无线运动传感器节点设计

    • 题目要求
    • 设计方案分析
    • 心电检测模块方案
    • ADS1292的A/D转换计算
    • 心电信号的处理
    • 体表温度分析计算
    • 运动量分析计算
    • 无线传输模块设计
    • 显示屏的设计
    • 电路设计
    • 温度模块设计
    • 加速度计模块设计
    • 无线传输模块设计
    • PCB布线布局

题目要求

  1. 任务
    基于 TI 模拟前端芯片 ADS1292 和温度传感器 LMT70 设计制作无线运动传
    感器节点,节点采用电池供电,要求能稳定采集和记录使用者的心电信息、体表
    温度和运动信息。
  2. 要求
    (1)基于 ADS1292 模拟前端芯片设计心电检测电路,完成使用者的心电信
    号实时测量,要求: (30 分)
    ①实时采集和记录使用者的心电信号,实现动态心电图的测试与显示;
    ②分析计算使用者的心率,心率测量相对误差不大于 5%。
    (2)基于 LMT70 温度传感器测量使用者体表温度,要求: (20 分)
    ①实时采集和记录使用者的体表温度,温度采样率不低于 10 次/分钟;
    ②体表温度测量误差绝对值不大于 2℃。
    (3)基于加速度计等传感器检测使用者运动信息,实现运动步数和运动距
    离的统计分析,要求: (20 分)
    ①运动距离记录相对误差不大于 10%;
    ②运动步数记录相对误差不大于 5%。
    (4)无线运动传感器节点能通过无线上传使用者的基本心电信号、体表温
    度和运动信息,并在服务器(手机)端实时显示动态心电图、体表温度和运动信
    息,要求传输时延不大于 1 秒。 (25 分)

设计方案分析

本设计基于TI模拟前端芯片ADS1292、温度传感器LMT70以及MPU9250设计制作无线运动传感器节点,节点采用电池供电。使用ADS1292设计心电检测电路,实时采集和记录使用者的心电信号,实现动态心电图的测试与显示。LMT70用于实时采集和记录使用者体表温度。MPU9250实现运动步数和运动距离的统计分析。将各模块获取数据输入STM32F407单片机进行分析处理,并通过串口屏显示。该装置能通过无线上传使用者的基本心电信号、体表温度和运动信息,并在服务器端实时显示动态心电图、体表温度和运动信息。

心电检测模块方案

采用ADS1292芯片构成心电测量电路,采样频率为1000Hz,对通道返回的3个字节进行处理,用相应的公式得到对应的电压,从而画出心电图。
采用TI公司的集成芯片ADS1292, 它是一款适用于生物电信号采集的芯片。其内置2个24 bit模数转换器, 可以实现心电与呼吸信号双通道采集, 单个通道功耗仅为335μW, 且ADS1292R内置右腿驱动降噪电路和电极脱落检测电路 [8-9] 。信号采用差分输入方式, 两个电极右臂RA (负极) 和左臂LA (正极) 。通道1 (IN1N和IN1P) 用于采集呼吸信号, 通道2 (IN2N和IN2P) 用于
采集心电信号。右腿驱动电路连接到通道2上, 形成负反馈以减少心电信号中共模干扰。呼吸信号和心电信号由电极分别引入通道1和通道2后经过ADS1292R内部可编程放大器 (PGA) 放大6倍, 然后分别经过A/D模数转换, 转换后的数字信号由SPI接口输入到单片机中。单片机控制ADS1292R进行信号采集和AD转换。单片机与ADS1292R通过CS、SCLK、DIN、DUT四线实现SPI串行同步协议通讯。通过向ADS1292R内部寄存器写入相应值以配置相关设置, 比如通道放大倍数、测量通道漂移量、工作时钟选择、导联脱落使能等。

ADS1292的A/D转换计算

ADS1292的每一个通道都有一个24位的模数转换器(ADC)。输入信号与输出信号对应关系如下:

在这里插入图片描述

每次采样信号经过ADS1292内部的A/D模数转换后变成了一个72位的数据包:1100+LOFF_STAT[4:0]+GPIO[1:0]+13个‘0’+24位呼吸数据+24位心电数据。

心电信号的处理

直接获取原始数据,打印图像
在这里插入图片描述

可以看到,该信号有许多噪声,也就是高频信号。采用低通滤波器可将其滤掉。
IIR是无限长单位脉冲响应数字滤波器,其系统对应函数有如下形式:
在这里插入图片描述

在知道滤波器相应的系数b[],a[]后可根据相应的差分方程,完成对数据的滤波,而滤波器的系数可以通过MATLAB滤波器设计和分析工具箱Filter Designer求得。
用MATLAB设计IIR低通滤波器
在这里插入图片描述

滤波器阶数N=3,采样频率Fs=1000Hz,截止频率经过大体估算和反复测试得Fc=8Hz。
通过查看Filter Coefficients可得滤波器系数。
在这里插入图片描述

响应函数:
H(z)= Gain*(1+2Z-1+Z-2)/(1-a1Z-1-a2*Z-2)
上式是从Z域上分析的,因为具体应用在时域上,所以根据响应函数得到对应时域上的差分方程:
a[0]y[i]=Gain(b[0]*x[i]+b[1]*x[i-1]+b[2]*x[i-2])-a[1]*y[i-1]-a[2]*y(n-2)
其中Gain=0.000616045308738544347866572525873607447,b[]={1,2,1},
a[]={1,-1.948522813110796114699496683897450566292,0.950986994345750180634979642491089180112},
x为输入信号,y为滤波后信号。
根据系数设计C语言程序:
#define a 0.000616045308738544347866572525873607447
#define b 1.948522813110796114699496683897450566292
#define c 0.950986994345750180634979642491089180112

double xx[3]={0,0,0};
double yy[3]={0,0,0};

double iir(double x,double x1,double x2,double y1,double y2)//7hz
{
double y0;
y0=a*(x+2x1+x2)+by1-c*y2;
return y0;
}

double iirfilter(double e)
{
xx[2]=xx[1];
xx[1]=xx[0];
xx[0]=e;

yy[2]=yy[1];
yy[1]=yy[0];
yy[0]=iir(xx[0],xx[1],xx[2],yy[1],yy[2]);

return yy[0];

}
心电滤波后,获取数据,打印图像
在这里插入图片描述

可以看到噪声已经被清除了,但曲线并不平滑。采用滑动平均滤波法解决这一问题。
滑动平均滤波法(又称递推平均滤波法)
方法: 把连续取N个采样值看成一个队列 ,队列的长度固定为N , 每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则), 把队列中的N个数据进行算术平均运算,就可获得新的滤波。
优点: 对周期性干扰有良好的抑制作用,平滑度高 适用于高频振荡的系统 。
缺点: 灵敏度低 ,对偶然出现的脉冲性干扰的抑制作用较差 ,不易消除由于脉冲干扰所引起的采样值偏差 ,不适用于脉冲干扰比较严重的场合, 比较浪费RAM 。
将低通滤波后的波形放大看:
在这里插入图片描述

由图像可以看出,波形波动幅度不大,且没有偶然出现的脉冲性干扰,干扰频率相对于有用信号较高。所以采用滑动平均滤波法。
滑动平均滤波法N的选取:太大浪费RAM,太小效果不好。经过大体估算和反复测试取N=16。
设计C语言程序:
#define N 16
unsigned char n=N;
double medianfilter(double*p)
{
double sum=0;
unsigned char count=0;
for(count=0;count<N;count++)
{
sum+=*p;
p++;
}
return sum/N;
}
心电滑动平均滤波后,获取数据,打印图像
在这里插入图片描述

波形变得光滑很多,心电信号处理完成。
心率的计算
心电波形如下:
在这里插入图片描述

心率计算公式为:HR=60*(1/RR)(次/分钟)其中HR为心率,RR为跳动一次的时间,即R波之间的距离。所以要求心率,先求T, 即图上R波之间的距离。
求R波之间的距离:
首先找到一个准确的点。观察整个波形,A点更具有特征性。选取A点作为基准点。
在这里插入图片描述

A点的特征:

  1. 两边斜率大小几乎相等,互为相反数。
  2. 两边斜率左边大于0,右边小于0。
  3. 两边斜率大小明显大于波形上的其他点,阈值更好确定。
    心电采样频率Fs=1000Hz,即1ms采一个点,显然,利用相邻两点计算斜率准确率低,为了提高斜率计算的准确性,点与点之间应保持一定距离,但也不能太远,否则会出现错误,如下图所示:
    在这里插入图片描述

点应始终在R波上,根据采样数据与图形横纵坐标值,取间隔50个点来计算斜率。(备注:这个数据无法百分之百做到准确,大概就好,不会影响心率准确度即可)。
斜率阈值slope的确定:选择自动适应和实时更新的阈值以便更确定不同的检测对象或检测环境的R波位置。根据上述特征3,即要找到恰好能够找到点且不能够找到点的斜率阈值slope。
阈值设定采用二分法的思路。
二分法:
给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
2 求区间(a,b)的中点c.
在这里插入图片描述

3 计算f©.
(1) 若f©=0,则c就是函数的零点;
(2) 若f(a)·f©<0,则令b=c;
(3) 若f©·f(b)<0,则令a=c.
(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复(2)-(4).
具体应用方式如下:

  1. 先根据数据大致估算一个斜率阈值的初始值slope=K0,根据上述特征2设计程序:if((k[49]-k[0])*20>slope && (k[50]-k[99])*20>slope)
    其中k为采集到的点,(k[49]-k[0])*20与(k[50]-k[99])*20为两边的斜率,如果满足上if中的条件计算心率,否则不计算心率。先不管心率是否准确。情况一,如果能计算心率,则代表找到了点,但不一定是A点,则此时令斜率阈值为a;情况二,如果不能计算心率,则表示没有找到任何点,则此时令斜率阈值为b。如果是情况一,下一次斜率阈值为上一次斜率阈值的2倍,再进行判断能否计算心率;如果是情况二,下一次斜率阈值为上一次斜率阈值的1/2倍,再进行判断能否计算心率。反复进行上述步骤,直到确定a,b的值。
    2.然后求区间(a,b)的中点c,再进行判断能否计算心率,情况一,如果能计算心率,则代表找到了点,则此时a=c,;情况二,如果不能计算心率,则表示没有找到任何点,则此时b=c。反复进行上述步骤,直到|b-a|<ξ。则确定斜率阈值slope=a。
    C语言设计程序如下:
    //slope为斜率阈值 key为是否找到斜率阈值标志位 ξ=1

unsigned char aaa=0,bbb=0,ccc=0,slope=10,key=0;
void counter_slope(double e)
{
unsigned char t=0;

for(t=0;t<99;t++)
{
	k[t]=k[t+1];  
}
k[99]=filter(e);//获取心电滤波后的数据

if(key==0)
{
		if((k[49]-k[0])*20>slope && (k[50]-k[99])*20>slope)//找到点
		{
			aaa=slope;		
			if(bbb==0) slope=2*slope;
			else
			{
				ccc=(aaa+bbb)/2;
				slope=ccc;
			}
		}
		else           //没找到点
		{
			bbb=slope;
			if(aaa==0) slope=slope/2;
			else
			{
				ccc=(aaa+bbb)/2;
				slope=ccc;
			}
		}
}

if((bbb-aaa)<1)
{
	slope=aaa;
	key=1;      //设置斜率阈值slope
}

}
采用定时器计时,每T时间后将找斜率阈值标志位key置0,即可做到斜率阈值的自动适应和实时更新。
提高A点的准确性:根据A点特征1可进一步提高A点的准确性。两边斜率大小几乎相等,即|K1-K2|<ξ,采用ξ=0.1(备注:这个数据无法百分之百做到准确,大概就好,不会影响心率准确度即可)。
C语言设计程序如下:
if(((k[49]-k[0])-(k[50]-k[99]))<0.1 && ((k[49]-k[0])-(k[50]-k[99]))>-0.1)
综上所述,测量心率C语言设计程序如下:
double k[100];//心电滤波后的数据
unsigned int counter_time=0,time=1;//counter_time计数 time为RR之间距离
unsigned char b=0;//找到点开始计数标志位
unsigned int count_rate(double e)
{
unsigned char t=0;
if(b1) counter_time++;
for(t=0;t<99;t++)
{
k[t]=k[t+1];
}
k[99]=filter(e);//心电滤波后的数据
if((k[49]-k[0])*20>slope && (k[50]-k[99])*20>slope)
{
if(((k[49]-k[0])-(k[50]-k[99]))<0.1 && ((k[49]-k[0])-(k[50]-k[99]))>-0.1)
{
if(b
0) b=1;
else
{
time= counter_time;
counter_time=0;
}
}
}
if(time==1) return 0; //不合理心率
else return 60000/time;//计算心率
}
验证上述理论能否测出心率。
利用心电信号发生器产生心电信号输入设备。
心电信号发生器产生心电信号频率为60,即心率为60。
获取数据,打印图像如下
在这里插入图片描述

可以看到只有部分数据为60,其它情况为0,并且数据具有明显的周期性,所以可以判断误差不是随机误差,而是可以避免的系统误差。
分析原因:因为心率与RR的值有关,而要RR的值准确,则必须A点找准确,但实际上无论如何精确,都无法精确找到那一点。现实中,只能找到A点及其附近尽可能少的点,如下图
在这里插入图片描述

其中画红线的就是系统找到的A点,在红线段内,两A点相距为1,根据计算公式算出来为60000,显然这个数据不合理,自然系统得出的心率为0,只有在本红线的最后一点与下一红线第一点之间,相距不为0,且理论上会导致心率测量偏大,但通过数据分析,该误差较小可以不管,也说明A点找得比较精确。
解决方法:对计数counter_time设置阈值。可以知道人的心跳不可能超过600次/秒,所以time=counter_time应大于100。
重新设计程序:
unsigned int count_rate(double e)
{
unsigned char t=0;

if(b==1) counter_time++;

for(t=0;t<99;t++)
{
	k[t]=k[t+1];  
}
k[99]=filter(e);//心电滤波后的数据

if((k[49]-k[0])*20>slope && (k[50]-k[99])*20>slope)
{
	if(((k[49]-k[0])-(k[50]-k[99]))<0.1 && ((k[49]-k[0])-(k[50]-k[99]))>-0.1)
	{
			if(b==0) b=1;
			else 
			{	
     if(counter_time>100)		//时间阈值
			 {	
       	time=	counter_time;			 
				  counter_time=0;
			 }
			}
	}
}
if(time==1) return 0;
else return 60000/time;//计算心率

}
再次验证上述理论能否测出心率。
获取数据,打印图像如下
在这里插入图片描述

可以看到心率比较准确,满足要求。
为了避免数据的偶然性等因数,设置心电信号发生器产生心电信号频率分别为44,77,99,111再次验证。
获取数据,打印图像,结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到心率测量比较准确,误差较小,心率测量相对误差不大于 5%。

体表温度分析计算

温度传感器模块方案:采用LMT70芯片构成温度测量电路,按照芯片手册上的对应比例,根据返回的值算出对应的温度。
LMT70输出电压传递函数不是线性的,可以用一阶,二阶或三阶传递函数方程描述。在实践中发现一阶传递函数最为准确,因此采用一阶传递函数。为使温度测量更加稳定准确,软件配置增加了平滑滤波。一阶传递函数计算公式:
Temp = p1VTAO (mV) + p2
p1 = -0.1913
p2 = 209.6
Temp时温度值;
VTAO 是AD采集TAO端口的电压,单位mV。
平滑滤波代码如下:
unsigned short SmoothProcess(unsigned short
array,int point)
{
unsigned short temp;
char i,j;
float ret=0;

for(i=0;i<point;i++)
{
	for(j=point-1;j>i;j--)
	{
		if(array[j-1]>array[j])//smaller one at the front
		{
			temp=array[j-1];
			array[j-1]=array[j];
			array[j]=temp;
		}
	}
}
for(i=0;i<point;i++)
	printf("%d\t",array[i]);

ret=(array[point/2]+array[point/2+1])/2;
return (unsigned short)ret;

}

运动量分析计算

测量运动信息模块方案:采用MPU9250芯片测量运动信息,分别用以检测人步行中三个方向的加速度变化,根据其数据变化,再结合相应的算法,算出其运动步数和距离。
步数参数:
系统每50个样本不断更新3轴加速度的最大值和最小值。平均值(Max + Min)/ 2被称为动态阈值水平。对于以下50个样本,此阈值水平用于确定是否已采取步骤。
线性移位寄存器包含两个寄存器,一个sample_new寄存器和一个sample_old寄存器。这些数据分别称为sample_new和sample_old。当新的数据样本到来时,sample_new将无条件地移至sample_old寄存器。但是,是否将sample_result移入sample_new寄存器取决于以下条件:如果加速度的变化大于预定义的精度,则最新的采样结果sample_result,移到sample_new寄存器;否则,sample_new寄存器将保持不变。因此,移位寄存器组可以消除高频噪声并使决策更加精确。

在这里插入图片描述

步伐判断:由图1可知,判断为一步的条件是,先找到最活跃轴,然后最活跃轴的old_sample > 动态阈值,new_sample < 动态阈值。满足上述条件,认为走了一步。在运动过程中,可以认为连续运动大于5步才认为是走步,这样可以过滤一些不必要的错误步数,最快大约每秒5步,相当于200ms一步。
距离参数
在根据上述算法计算了步数参数之后,我们可以如下公式来获得距离参数。
距离=步数×每步距离
每步距离取决于用户的速度和身高。如果用户较高或以较高速度跑步,则步长会更长。该参考设计每两秒钟更新一次距离,速度和卡路里参数。因此,我们使用每两秒计数的步长来判断当前的步幅长度。

无线传输模块设计

方案一:采用蓝牙模块来上传基本心电信号,单片机与蓝牙模块进行串行异步通讯, 这种通讯方式实现简单 。只需要配置相应的输出和输入管脚、串口时钟、以及波特率即可。为保证心电及呼吸数据能高速无延时地传输, 波特率选择115 200。体表温度和运动的信息,并在服务器端实时显示动态心电图,体表温度和运动信息。但它的缺点就是速度非常慢且距离信号受限,传输距离大约为10米。
方案二:采用wifi模块(ESP8266 ESP-01S)来实现无线传输实时动态的信息,所支持的速度最高54Mbps,通过互联网连接上安装访问点来创建,传输距离大概为300英尺。只要手头有支持WiFi连接的设备,在热点覆盖的区域即可随时联网。在传输距离和速率方面,wifi比蓝牙会有较大的优势。
经过综合考虑,决定采用方案二芯片型号ESP8266 ESP-01S。

显示屏的设计

采用TFT_LCD显示屏 尺寸为240*320的显示屏来显示使用者心电图,体表温度与运动的信息。但是不能持续显示心电图,且操作的难度很大 ,对于显示汉字的能力较差。采用USART_HMI 串口屏来显示使用者心电图,体表温度与运动的信息。它的使用比较方便,通过绘图的方式来搭建界面,且可以连续显示心电图信号.

电路设计

心电测量模块设计
利用ADS1292R和TXS0108EPWR来采样心电信号与数据分析,利用SPI与STM32F4进行通信,最后发生到串口屏。
在这里插入图片描述

温度模块设计

通过LMT70采样温度数据,在计算出精确温度,基于LMT70的温度采样电路如下:
在这里插入图片描述

加速度计模块设计

基于MPU9250测量使用者的加速度的电路:
在这里插入图片描述

无线传输模块设计

无线传输模块基于ESP8266芯片
电路如下图:
在这里插入图片描述

PCB布线布局

由于心电信号很微弱, 典型幅值约为1 m V, 易受到干扰, 所以在硬件设计上除了需要右腿驱动电路消除共模干扰外, 在PCB的布线布局上也应注意以下几点: (1) 由于心电及呼吸信号是差分信号, 所以在布线正负输入信号线时, 尽量保持靠近和对称走线, 以减少共模干扰; (2)为减少外界对输入信号线的干扰, 用地线将输入信号线包裹起来; (3) 电源数字电源单独供电, 模拟地和数字地单独地, 在一点处连接, 避免模拟电路和数字电路之间相互干扰。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020年电赛省赛题目A——无线运动传感器节点设计 的相关文章

  • 一文揭秘字节跳动、华为、京东的薪资职级

    声明 xff1a 本文所有数字均不是官方数据 xff0c 为网络资料收集整理 字节跳动 01 全球员工总数 字节的员工数量目前超过5万人 图片来源 xff1a 字节范 02 岗位职级 字节跳动的职级研发序列一共10级 xff1a 字节跳动创
  • ESP_C3在ubuntu下运行RT-Thread

    1 clone源代码RT Thread git clone git 64 github com RT Thread rt thread git 2 开始搭建ESP IDF环境 进入源码到bsp文件夹下找到ESP32 C3 xff0c 开始配
  • uniapp中使用弹出层

    uniapp中使用弹出层 因为业务的需要 xff0c 需要弹出一个复选框 xff0c 使用uniapp中自带的框架 使用 xff1a 第一步 xff1a 下载下示例项目 xff0c 找到主要的文件夹 第二步 xff1a 将该文件夹放到组件的
  • 手写一个uniapp的步骤条组件

    span class token operator lt span template span class token operator gt span span class token operator lt span view span
  • uniapp中的分页

    数据量过多就会使用分页 第一种 xff1a API span class token comment 和data同级 span span class token function variable function onReachBotto
  • uniapp中生成随机的二维码并进行保存

    需求 xff1a 需要根据用户id的不同生成不同的二维码 xff0c 并进行本地保存 第一步 xff1a 下载插件 这里对于二维码的生成 xff0c 使用的是第三方插件weapp qrcode min js xff0c 主要用到的文件是 d
  • Pc端的基本Echarts

    Pc端的基本Echarts 双环传态图组件 span class token operator lt span template span class token operator gt span span class token oper
  • el-table表格的sortable排序的使用以及出现小数、%排序错乱

    前端实现排序 xff1a 只需要在表头上加上一个sortable属性即可 span class token tag span class token tag span class token punctuation lt span el t
  • 浏览器的回退和导航栏的选中转态不同步,路由在新窗口打开

    问题1 xff1a 浏览器的回退和导航栏的选中状态不能同步的问题 问题 xff1a 用户后退时候 xff0c 左边导航栏显示的还是上一个页面的导航 xff0c 但是路由和页面已经变了 span class token operator lt
  • 左右联动-左侧点击相应的位置,右侧随之滚动

    第一步 xff1a npm下载 npm install better scroll save 第二步 xff1a 局部注册 xff08 当前组件 xff09 span class token keyword import span BScr
  • 杂技-各种css小技巧

    渐变字体 background image webkit linear gradient bottom 379ED7 0FE2EE webkit background clip text webkit text fill color tra
  • 深入理解Kotlin无参构造函数

    Unsafe 创建实例 在java中 创建一个对象 其实主要就是3种方法 通过new 关键字来创建 这种是最常见的 通过反射构造方法来创建对象 这种也不少见 很多框架中都有使用 Unsafe类来创建实例 xff0c 这种情况非常少见 这里先
  • VScode 快捷键

    一 VScode 快捷键 这里主要记录是 VScode开发工具常用的快捷键 xff0c 以便提高工作效率 xff0c 以及今后方便查阅 xff01 xff01 xff01 SHIFT 43 ALT 43 I 在选定的每行末尾插入光标CTRL
  • 结构体与共用体 链表 编译预处理

    结构图和共同体 单科成绩分析统计程序 题目要求 xff1a 1 输入学生个数 成绩 2 计算平均分 最高分 最低分 3 计算各个分数段人数并计算平均分 4 排序从高到低 刚开始计算各分段人数时是这样写的 排序是这样写的 发现case2 ca
  • 【已解决】terminate called after throwing an instance of ‘cv::Exception‘,已放弃 (核心已转储)

    这是运行高翔slambook2的代码出现的错误 terminate called after throwing an instance of cv Exception what OpenCV 3 4 15 home diyu opencv
  • C语言打印文件中指定位置所在行内容

    函数说明 void PrintFileOfPosition int position file char src file xff0c 参数1为指定位置 xff0c 参数2为文件名 文件读取方式为行读取 xff0c 所以读完一行要记录该行字
  • C语言中屏蔽空格和吐出getchar吃掉的字符实例

    屏蔽空格 新的改变功能快捷键合理的创建标题 xff0c 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中 居左 居右SmartyPants 创建一个自定义列表如何创建一个注
  • Object类(所有类的父类)

    文章目录 前言一 Object类1 1概述1 2 Object常用方法1 3 Object类型变量1 4 Objects类注意事项 总结 前言 提示 xff1a 常用类学习篇 xff0c 掌握节奏就变得简单易懂了 xff0c 没有甚么特别难
  • Set接口那些事(包含hash值简单了解与HashSet类与TreeSet类介绍)

    文章目录 前言一 Set接口是什么 xff1f 三 哈希值四 HashSet与TreeSet总结 前言 Set集合是Collection的直接的子类 xff0c API完全一致 xff0c 仅拥有一些特点 一 Set接口是什么 xff1f
  • LinkedList类(Queue和List的实现类)与ArrayList类(的异同)

    文章目录 前言一 LinkedList二 ArrayList与LinkedList异同2 1 数据结构2 2 增删改查2 3 使用场景 总结 前言 LinkedList Queue与List的实现类 底层数据结构是Node节点 data数据

随机推荐