AD7606模块

news2024/11/14 2:24:40

了解一下ad7606模块,并学习制作一个。

认识AD7606

先了解一下关元AD7606的信息。(芯片手册的内容)

AD7606 采用 5V 单电源供电,不再需要正负 双电源,并支持真正±10V 或±5V 的双极性信号输。所有的通道均能以高达 200 kSPS 的速率进行采样(在数值上采样率与频率应该是相等的,不同的话就是频率Hz可以是小数而采样率S/s一定是整数 ), 同时输入端箝位保护电路可以承受最高达±16.5V 的电压。
AD7606 的数字接口可以配置在并行或串行模式。数字接口的电平 Vdrive 为 2.3V~5.25V,可以跟当 前任何主流的 CPU/DSP 连接。需要注意的是,当配置 AD7606 工作在串行接口模式时,数据总线的 DB[15:9] 和 DB[6:0]管脚需要做接地处理。
我将采用串行的连接方法。串行可以节约io口。
AD7606 提供了过采样和数字滤波功能。通过管脚 OS[2:0]可以设置过采样倍数(OSR)为 x2, x4, x8, x16, x32, x64。过采样打开后,内部的过采样控制电路和 1 阶 Sinc 数字滤波器会自动被使能,同时-3dB 带宽 也会相应的改变。
ADC 一般需要模拟电源和数字电源。大多数的系统都会有 5V 数字电源,却不一定具有 5V 模拟电源。 此时如果模拟电路和数字电路共用同一个 5V 电源,有害的数字噪声可能会耦合到模拟电路并降低 ADC 的 性能,通常应该避免这样的设计。如果不可避免,需要将 5V 的数字电源进行很好的滤波后再供给模拟电 路用。AD7606 的去耦设计十分简洁,仅需要 9 个电容,其中包括 2 个 10uF,2 个 1uF,5 个 0.1uF。参考 下图  所示。
AD7606 的管脚定义已经考虑了 PCB 设计中的布局布线。从管脚定义图中可以看出,LQFP 封装的 4 个 侧边,模拟输入端 Ain 在一侧,数据总线接口在另一侧,其余两侧分别为控制和配置管脚。设计中只需要 4 层 PCB 板,就可以发挥 AD7606 的性能。叠层建议如下图 。表层和底层为走线层,中间两个内层分别为 地平面、电源平面。除了叠层设计,AD7606 的手册中也给出了说明和示例
AD7606需要用到SPI通信协议,之前没有学习过,也需要学习一下。
SPI有四根线:

SPI总线包括4条逻辑线,定义如下:

  • MISOMaster input slave output 主机输入,从机输出(数据来自从机);
  • MOSIMaster output slave input 主机输出,从机输入(数据来自主机);
  • SCK :Serial Clock 串行时钟信号,由主机产生发送给从机;
  • NSSSlave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。

其他制造商可能会遵循其他命名规则,但是最终他们指的相同的含义。以下是一些常用术语;

  • MISO也可以是SIMODOUTDOSDOSO(在主机端);
  • MOSI也可以是SOMIDINDISDISI(在主机端);
  • NSS也可以是CECSSSEL;
  • SCK也可以是SCLK;

本文将按照以下命名进行讲解[MISO, MOSI, SCK,NSS]

在软件配置上将根据时序图进行配置。

软件配置

我是在网上找了相关的例程,后进行一点修改。

我采用的是STM32F103VCT6,全部引脚引出,用ZET6也可以。AD7606是用的;凌智电子的模块。

AD7606模块采用5v供电,J11跳线帽接3.3v,J2跳线帽接±5v。

采用串行连接。AD7606与单片机连接示意图

AD7606全称单片机功能介绍
+5 +5 
GNDGND
RESTRESETC8GPIO复位AD7606
SERPAR/SER/ BYTE SEL+3.3V并行/串行/字节接口选择输入,接3.3V
STBYSTBYB11待机模式输入
OS2OS2B13过采样模式引脚。
OS1OS1B14
OS0OS0B15
CO_ACONVST AB10启动模拟输入通道转换信号
CO_BCONVST BC9
CS_NCSA6片选,置低后标志可以开始输出模拟量
RD/SCRD/SCLKA7串行时钟输入(SCLK)。SCLK上升沿将随后的所有数据位逐个送至串行数据输出DOUTA和DOUTB
DB7DB7/DOUTAC6串行接口数据输出引脚(DOUTA)。
BUSYBUSYA5输出繁忙
DB15DB15/BYTE SELGND并行/串行/字节接口选择输入,接地
FR_DFRSTDATAA4数字输出(可不接)

当选择串行接口时,应将引脚 DB[15:9]和DB[6:0]接地。

在实际使用时空接也是可以的。但画电路的时候建议接地。

只用一路DOUT 线的缺点是:如果在转换之后进行读 取,则吞吐速率会下降。串行模式下,不用的DOUT线应保 持不连接。

省电模式

过采样位解码

该引脚可以不接

源码分享

AD7606.C


#include <stm32f10x.h>
#include "Delay.h"
#include "AD7606.h"
//#include "lze_lcd.h"

extern u8 IO_TAG;	
//-----------------------------------------------------------------
// 初始化程序区
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// void GPIO_AD7606_Configuration(void)
//-----------------------------------------------------------------
//
// 函数功能: AD7606引脚配置函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块: RCC_APB2PeriphClockCmd(); GPIO_Init();
// 注意事项: 用GPIO驱动方式和FSMC驱动方式下的引脚配置不一样
//			
//-----------------------------------------------------------------
void GPIO_AD7606_Configuration(void)
{ 
	GPIO_InitTypeDef GPIO_InitStructure;

	// 使能IO口时钟
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA |	RCC_APB2Periph_GPIOB |
													RCC_APB2Periph_GPIOC |	RCC_APB2Periph_GPIOD |	
													RCC_APB2Periph_GPIOE,
													 ENABLE);  
	GPIO_DeInit(GPIOA);//将GPIOx外设寄存器初始化为默认复位值
	GPIO_DeInit(GPIOB);//除了B4和A15是高电平。B3没信号外,其他io口被拉低。(默认值)
	GPIO_DeInit(GPIOC);
	GPIO_DeInit(GPIOD);
	GPIO_DeInit(GPIOE);
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// AD7606 
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	// 控制线配置 
	//             CS_N       RD/SCLK      
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 ;							
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;						 
	GPIO_Init(GPIOA, &GPIO_InitStructure);
		
	//                 FRSTDATA     BUSY  
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5 	;							
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING ;						 
	GPIO_Init(GPIOA, &GPIO_InitStructure);
					 
	//        rst convstB convstA STby OS12 OS11 OS10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | 
																GPIO_Pin_13 | GPIO_Pin_14 | 
																GPIO_Pin_15 ;								
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;						 
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 	| GPIO_Pin_9 ;
																							
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;						 
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	
	//数据线配置(1)
	// DoutA
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;								
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;						 
	GPIO_Init(GPIOC, &GPIO_InitStructure);
}

//-----------------------------------------------------------------
// void AD7606_Init(void)
//-----------------------------------------------------------------
//
// 函数功能: AD7606初始化函数
// 入口参数: 无
// 返回参数: 无
// 全局变量: 无
// 调用模块:    
// 注意事项: 无
//-----------------------------------------------------------------
void AD7606_Init(void)
{
	convstA_Set;		//B10
	convstB_Set;		//C9
	delay_ms(1);		
	STby_Set;		//B11
	clk_Set;		//A7
	cs_Set;			//A6
  OS10_Reset;		//B15
	OS11_Reset;		//B14
	OS12_Reset;		//B13
	AD7606_reset();  		//复位
	delay_ms(1);		//
	AD7606_startconvst();		//	启动转换
}

/*   * 名称:AD7606_startconvst()  * 功能:启动转换  */  
void AD7606_startconvst(void)
{  
	convstA_Reset;		//B10	
	convstB_Reset;			//C9
	delay_us (1);
	convstA_Set;		//B10
	convstB_Set;		//C9
}
  
/*   * 名称:AD7606_reset()  * 功能:复位模块  */
void AD7606_reset(void) 
{ 
	rst_Reset;		//C8
	delay_us (1);		
	rst_Set; 		//C8
	delay_us(1);
	rst_Reset; 		//C8
}  

/* 
* 名称:AD7606_read_data() 
* 功能:读取数据 
* 返回值:返回一个结构体指针,该指针为指向结构体数组的首地址  
*/ 
void AD7606_read_data(s16 * DB_data) 
{  
	u8 i,j; 	
	for(i=0;i<8;i++)  
	{
		u16 DB_data1 = 0;
		cs_Reset; 		//A6
	  delay_us(1);	
		for(j=0;j<16;j++)
		{		
		clk_Reset;		//A7
		delay_us(1);	
//			DB_data1 = ((u16)(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0))<< (15-j)) + DB_data1 ;
		DB_data1 = ((u16)(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6))<< (15-j)) + DB_data1 ;
	  clk_Set;		//A7
		delay_us(1);				
		}		
		cs_Set;			//A6
		DB_data[i] = (u16)DB_data1;
	}	
} 

AD7606.H

#ifndef _AD7606_H
#define _AD7606_H


#define sampling_0times 0 
#define sampling_2times 1 
#define sampling_4times 2 
#define sampling_8times 3 
#define sampling_16times 4 
#define sampling_32times 5 
#define sampling_64times 6

#define STby_Set 	  GPIO_SetBits(GPIOB,GPIO_Pin_11)

#define OS10_Set 	  GPIO_SetBits(GPIOB,GPIO_Pin_15)
#define OS10_Reset   GPIO_ResetBits(GPIOB,GPIO_Pin_15)
#define OS11_Set 	  GPIO_SetBits(GPIOB,GPIO_Pin_14)
#define OS11_Reset   GPIO_ResetBits(GPIOB,GPIO_Pin_14)
#define OS12_Set 	  GPIO_SetBits(GPIOB,GPIO_Pin_13)
#define OS12_Reset   GPIO_ResetBits(GPIOB,GPIO_Pin_13)
#define convstA_Set 	  GPIO_SetBits(GPIOB,GPIO_Pin_10)
#define convstA_Reset   GPIO_ResetBits(GPIOB,GPIO_Pin_10)
#define convstB_Set 	  GPIO_SetBits(GPIOC,GPIO_Pin_9)
#define convstB_Reset   GPIO_ResetBits(GPIOC,GPIO_Pin_9)
#define rst_Set 	 		  GPIO_SetBits(GPIOC,GPIO_Pin_8)
#define rst_Reset  		  GPIO_ResetBits(GPIOC,GPIO_Pin_8)
#define clk_Set 	  			GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define clk_Reset   			GPIO_ResetBits(GPIOA,GPIO_Pin_7)
#define cs_Set 	  			GPIO_SetBits(GPIOA,GPIO_Pin_6)
#define cs_Reset   			GPIO_ResetBits(GPIOA,GPIO_Pin_6)
#define frstdata_Set 	  GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define frstdata_Reset  GPIO_ResetBits(GPIOA,GPIO_Pin_4)
#define busy_Set 	  		GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define busy_Reset   		GPIO_ResetBits(GPIOA,GPIO_Pin_5)
#include "stm32f10x.h"                  // Device header

extern void GPIO_AD7606_Configuration(void);
extern void AD7606_Init(void);
extern void AD7606_startconvst(void);
extern void AD7606_reset(void);
extern void AD7606_read_data(s16 * DB_data) ;

#endif

//-----------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------

//数字:0
//CH1:  1789.4 mv  0xadcf  44495
//CH2:  4547.4 mv  0xf46a  62570
//CH3:  1540.5 mv  0xa770  42864
//CH4:  4823.5 mv  0xfb7b  64379
//CH5:  1000.4 mv  0x999c  39324
//CH6:  2565.0 mv  0xc1aa  49578
//CH7:  1362.2 mv  0xa2df  41695
//CH8:  2978.1 mv  0xcc3d  52285

main.c

#include "stm32f10x.h"                  // Device header

#include "AD7606.h"
#include "PeripheralInit.h"


//注意:
//		(1) 串行:SER = 1;D15 = 0;
//		(2) 通过J3跳帽选择输入电压的范围,修改程序第92行中sprintf里面的(float)(DB_data[i]*5000.0/32768)的5000.0,在5000.0和10000.0根据跳帽改变。
//		(3) J2跳帽这里连接3.3V,具体选择看引脚功能。


int main(void)
{	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	u8 dis_buf[40];
	u8 i;
	uint8_t  temp;
	s16 DB_data[8] = {0};
	delay_init();														//延时初始化
	PeripheralInit();													// 外设初始化

	while(1)
	{		

		printf("数字:%d\r\n",Num++);
		delay_ms (1000);
		
		AD7606_startconvst();						//AD7606开始转换
		temp = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);			 // 读取 BUSY的状态
		
		while(temp == 0)				//当busy为低电平时,数据转换完毕,此时可以读取数据 
		{
			delay_us(1);
			temp = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);		// 读取 BUSY的状态 	 
		}
		AD7606_read_data(DB_data); //读取数据放至数组DB_data[]

		for(i=0;i<8;i++)
		{
			sprintf((char*)dis_buf,"CH%1d:%8.1f mv  0x%04x %6d\r\n", i+1, (float)(DB_data[i]*5000.0/32768), (u16)(DB_data[i]^0x8000), (u16)(DB_data[i]^0x8000));
			printf("CH%1d:%8.1f mv  0x%04x %6d\r\n", i+1, (float)(DB_data[i]*5000.0/32768), (u16)(DB_data[i]^0x8000), (u16)(DB_data[i]^0x8000));                  //在串口显示结果
			delay_ms(20);
		}	
		delay_ms(100);
		
	}
}

之前有一个疑问,为什么不用单片机自带的ad而用模块?

整理一下网上的答案

1、AD7606是8路同步采样,内部ADC不是,最高只能三路同步。
2、内置的精度有效位没有7606高
3、7606是真双极性,支持正负10V,而内置的只能0-3.3V,不支持负压采集。
4、7606最高是200Ksps。内置是3.6Msps

AD7606优势在于高精度,支持宽电压,可达±10V。抗干扰能力强。

单片机的优势在于价格便宜。

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

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

相关文章

JVM第二讲:JVM 基础 - 字节码详解

JVM 基础 - 字节码详解 本文是JVM第二讲&#xff0c;JVM 基础-字节码详解。源代码通过编译器编译为字节码&#xff0c;再通过类加载子系统进行加载到JVM中运行。 文章目录 JVM 基础 - 字节码详解1、多语言编译为字节码在JVM运行2、Java字节码文件2.1、Class文件的结构属性2.2、…

基于保密信息学科平台系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 教师信息管理 学科动态管理 文献资源管理 征订目录管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步…

注解和依赖注入框架

依赖注入是一种比较流行的设计模式&#xff0c;在 Android 开发中有很多实用的依赖注入框架&#xff0c;可以帮助开发人员少些样板代码&#xff0c;达到各个类之间解耦的目的。 1 注解 从 JDK 5 开始&#xff0c;Java 增加了注解&#xff08;Annotation&#xff09;&#xff…

Maven系列第2篇:安装、配置、mvn运行过程详解

maven系列目标&#xff1a;从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第2篇。 本文主要内容 linux中安装maven window中安装maven mvn命令运行的原理 maven配置设置 本篇环境 jdk1.8 maven3.6.2 我们要写java代码&#xff0c;需要安装jdk&…

Zend Framework 3.1.3 gadget chain

前言 在推特上的PT SWARM账号发布了一条消息。 一个名为Zend Framework的php框架出现了新的gadget chain&#xff0c;可导致RCE。笔者尝试复现&#xff0c;但失败了。所幸&#xff0c;我基于此链&#xff0c;发现在这个框架的最新版本中的另一条链。 复现过程 这里使用vscod…

利达卓越:关注环保事业,持续赋能科技

随着全球环境问题的日益突出,绿色金融作为一种新兴的金融模式逐渐受到各国的重视。绿色金融是指在金融活动中,通过资金、信贷和风险管理等手段,支持环境友好和可持续发展的项目和产业。绿色金融的出现是为了应对气候变化、资源短缺、污染问题等现实挑战,促进经济的绿色转型和可…

【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化教程

详情点击公众号链接&#xff1a;【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化教程 第一&#xff1a;基础 1、Earth Engine平台及应用、主要数据资源 2、Earth Engine遥感云重要概念、数据类型与对象等 3、JavaScript与Python遥感云编程比较与选择 4、…

南美哥伦比亚市场最全分析开发攻略,收藏一篇就够了

哥伦比亚作为南美洲最大的经济体之一&#xff0c;其外贸市场潜力巨大&#xff0c;吸引了越来越多的国际企业寻求商机。哥伦比亚跟中国的贸易往来也是非常的密切&#xff0c;今天就来分享一下如何开发南美比较重要的国家哥伦比亚&#xff0c;文章略长&#xff0c;建议大家点赞收…

【RocketMQ】(十一)Dledger模式下的日志复制

RocketMQ在开启Dledger时&#xff0c;使用DLedgerCommitLog&#xff0c;其他情况使用的是CommitLog来管理消息的存储。在Dledger模式下&#xff0c;消息写入时Leader节点还需要将消息转发给Follower节点&#xff0c;有过半的节点响应成功&#xff0c;消息才算写入成功。 Leade…

spring学习小笔记

spring学习小笔记&#xff08;1&#xff09; 一、Spring开发1.1 Spring简介1.2 Spring Framework系统架构1.3 Spring Framework学习路线1.4 Spring Farmework核心概念1.5 Spring入门 二、Bean的基础配置2.1 Bean的别名配置2.2 Bean的作用范围2.3 Bean的实例化2.3.1 构造方法实例…

本地vscode安装GPU版本PyTorch

操作系统 windows, IDE环境vscode&#xff0c;本地GPU 可以新建一个jupyter文件&#xff0c;运行一些测试代码 确保装好显卡驱动 在底下调出终端窗口&#xff0c;默认是power shell&#xff0c;我喜欢用cmd窗口 激活自己的虚拟环境&#xff0c;输入命令 nvidia-smi 确保自己…

ctfshow-web12(glob绕过)

打开链接&#xff0c;在网页源码里找到提示 要求以get请求方式给cmd传入参数 尝试直接调用系统命令&#xff0c;没有回显&#xff0c;可能被过滤了 测试phpinfo&#xff0c;回显成功&#xff0c;确实存在了代码执行 接下来我们尝试读取一下它存在的文件&#xff0c;这里主要介…

E. Li Hua and Array

Problem - E - Codeforces 思路&#xff1a;观察给定的函数&#xff0c;其实就是求与这个数互质的数的个数&#xff0c;即欧拉函数&#xff0c;我们发现一个数迭代欧拉函数不会很多&#xff0c;那么对于第一个操作来说我们可以直接暴力修改&#xff0c;而对于第二个操作来说&am…

软件测试/测试开发丨为什么接口自动化测试是提升职业技能的关键?

接口测试背景和必要性 接口测试是测试系统组件间接口&#xff08;API&#xff09;的一种测试&#xff0c;主要用于检测内部与外部系统、内部子系统之间的交互质量&#xff0c;其测试重点是检查数据交换、传递的准确性&#xff0c;控制和交互管理过程&#xff0c;以及系统间相互…

ElementPlus Switch 开关基础使用

昨天开发用到开关组件 后台返回字段是 can_write 默认是0 or 1 但是Switch 组件绑定的默认值默认是 true or false 直接绑定会导致默认是关闭状态 在页面一加载 值发生变化时 会自己调用 查了文档 需要使用 active-value 和 inactive-value 来指定绑定的数据类型 …

C#,工业化软件与院校软件的对比及编程语言的选择建议

飞机发动之之一&#xff0c;涡轮喷气航空发动机&#xff08;JET ENGINE&#xff09; 火箭发动机之一&#xff0c;俄罗斯RD-180煤油和液氧发动机&#xff08;ROCKET ENGINE&#xff09; 1 飞机发动机与火箭发动机的简明对比 2 工业软件与院校软件的简单对比 除了以上类似的对比…

【java学习】方法的参数传递(21)

文章目录 相关概念1. 方法传递之基本数据类型2. 方法的参数传递之引用对象3. 总结 相关概念 方法&#xff0c;必须有其所在类或对象调用才有意义。若方法含有参数&#xff1a; 形参&#xff1a;方法声明时的参数 实参&#xff1a;方法调用时实际传给形参的参数值 问题&#xf…

数据建模设计

数据库系统——建模与设计 一、数据建模 数据库的设计不仅需要处理规则的理解&#xff0c;更重要的是数据需求的理解与表达。 表达计算机世界的模型称为数据模型&#xff0c;而表达信息世界的模型称为概念模型。抽象是具有层次的&#xff0c;将现实世界的问题抽象成概念模型…

[ValueError: not enough values to unpack (expected 3, got 2)]

项目场景&#xff1a; 在使用opencv进行关键点识别、边缘轮廓提取的时候&#xff0c;提示以上错误。 import cv2 import numpy as npdef preprocess(image):# 进行图像预处理&#xff08;例如灰度化、高斯模糊等&#xff09;gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)blu…

Vuex的使用,详细易懂

目录 一.前言 二.Vuex的简介 三.vuex的使用 3.1 安装Vuex 3.2 使用Vuex的步骤&#xff1a; 四.vuex的存值取值&#xff08;改变值&#xff09; 五.vuex的异步请求 好啦&#xff0c;今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.前言 今天我们继续前面的E…