AHT10原理讲解(I2C驱动)-基于江科大源码开发

一、原理图

根据数据手册中的要求(以上两图),可以看出SDA和SCL接主芯片的引脚就可以,但是注意我们在接的过程中,给了两个上拉电阻。

上拉电阻的作用:

  • 提高抗干扰能力:适当的上拉电阻值可以帮助减少外部噪声对信号的影响,增强系统的稳定性。
  • 降低功耗:相对于内部集成的上拉结构,外部选择合适的上拉电阻可以在一定程度上帮助控制整个电路的静态电流消耗。

ADR需要接地,NC就保持悬空,悬空就是保持直接什么也不接就可以。

二、原理介绍

1、启动与停止信号

首先,一个完整的传输序列一定是启动信号开始,停止信号结尾的,无论这个信号要给相应的器件传输何种信号。

启动信号的执行顺序与原理

这里的启动信号确切的说,就是I2C协议中的启动信号,如果大家了解I2C协议的启动原理,这里完全可以跳过,包括下面的停止信号

启动传输状态( S )当 SCL 为高电平时,SDA 由高电平转换为低电平。因此一般在写启动信号时,我们都会先把SCL时钟线和SDA数据线先同时置高位,然后把SDA置低位,这个时候就可以百分百保证是在SCL时钟线高电平期间将SDA置低位,形成了开始信号

/*** 函    数:I2C起始* 参    数:无* 返 回 值:无*/
void MyI2C_Start(void)
{MyI2C_W_SDA(1);							//释放SDA,确保SDA为高电平MyI2C_W_SCL(1);							//释放SCL,确保SCL为高电平MyI2C_W_SDA(0);							//在SCL高电平期间,拉低SDA,产生起始信号MyI2C_W_SCL(0);							//起始后把SCL也拉低,即为了占用总线,也为了方便总线时序的拼接
}

最后将时钟线置低位的作用(强调一下,在正常发送数据期间,当SCL高电平期间,SDA不可以发生跳变,以保证数据稳定,产生启动和停止信号的时候除外)

  • 控制总线:一旦产生起始条件后,主设备需要继续控制总线,防止其他可能成为主设备的节点抢占总线。
  • 同步时序:将SCL拉低可以确保下一个上升沿之前有足够的时间进行数据设置。I²C通信中的每一位数据都是在SCL的上升沿采样的。因此,在发送下一位数据之前,先将SCL保持在低电平状态,可以让发送方有时间改变SDA的状态。
  • 准备传输:它还允许系统准备好接下来的数据位或地址位的发送。通过这种方式,可以确保每次SCL上升沿时,SDA上的数据已经被正确设置了。

停止信号的执行顺序与原理

停止传输状态(P)-当SCL 高电平时,SDA 线上从 低电平转换为高电平。停止状态是由主机控制的一种特殊的 总线状态,指示从机传输结束(Stop 之后,BUS 总线一般被 认为处于闲置状态)。

/*** 函    数:I2C终止* 参    数:无* 返 回 值:无*/
void MyI2C_Stop(void)
{MyI2C_W_SDA(0);							//拉低SDA,确保SDA为低电平MyI2C_W_SCL(1);							//释放SCL,使SCL呈现高电平MyI2C_W_SDA(1);							//在SCL高电平期间,释放SDA,产生终止信号
}

先拉低SDA数据线,拉高时钟线,再拉低数据线,保证绝对产生停止信号

2、发送测量命令函数

将图中所示信息构成中的二进制转化为十六进制分别是0x70、0xAC、0x33、0x00。

/*
*********************************************************************************************************
*	函 数 名: void AHT10_SendAC(void)
*	功能说明: 触发传感器进行测量
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void AHT10_SendAC(void)
{MyI2C_Start();MyI2C_SendByte(0x70);MyI2C_ReceiveAck();MyI2C_SendByte(0xAC);MyI2C_ReceiveAck();MyI2C_SendByte(0x33);MyI2C_ReceiveAck();MyI2C_SendByte(0x00);MyI2C_ReceiveAck();MyI2C_Stop();
}

3、软复位函数

这个命令(见表9)用于在无需关闭和再次打 开电源的情况下,重新启动传感器系统。在接 收到这个命令之后,传感器系统开始重新初始 化,并恢复默认设置状态,软复位所需时间不超过20毫秒

/*
*********************************************************************************************************
*	函 数 名: void AHT10_SendBA(void)
*	功能说明: 软复位模块
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void AHT10_SendBA(void)
{MyI2C_Start();MyI2C_SendByte(0x70);MyI2C_ReceiveAck();MyI2C_SendByte(0xBA);MyI2C_ReceiveAck();MyI2C_Stop();
}

4、读取检测到的数据

根据上图所示,读取信息的过程应该是发送读信号,写入0x71,这个信号意味着要读取信息了,其中蓝色代表的是从机发过来的数据,第一位字节代表的是状态信息,可以忽略,后面五个字节对半分为湿度和温度的对应的字节

/*
*********************************************************************************************************
*	函 数 名: void AHT10_Read_CTdata(uint32_t *ct) //读取AHT10的温度和湿度数据
*	功能说明: 
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void AHT10_Read_CTdata(uint32_t *ct) //读取AHT10的温度和湿度数据
{uint8_t Byte_1th = 0;uint8_t Byte_2th = 0;uint8_t Byte_3th = 0;uint8_t Byte_4th = 0;uint8_t Byte_5th = 0;uint8_t Byte_6th = 0;uint32_t RetuData = 0;uint16_t cnt = 0;AHT10_SendAC(); //向AHT10发送AC指令Delay_ms(75); //等待75mscnt = 0;while(((AHT10_Read_Status()&0x80)==0x80))//等待忙状态结束{Delay_us(1508);if(cnt++>=100){break;}}MyI2C_Start();MyI2C_SendByte(0x71);MyI2C_ReceiveAck();Byte_1th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_2th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_3th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_4th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_5th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_6th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();MyI2C_Stop();RetuData = (RetuData|Byte_2th)<<8;RetuData = (RetuData|Byte_3th)<<8;RetuData = (RetuData|Byte_4th);RetuData =RetuData >>4;ct[0] = RetuData;RetuData = 0;RetuData = (RetuData|Byte_4th)<<8;RetuData = (RetuData|Byte_5th)<<8;RetuData = (RetuData|Byte_6th);RetuData = RetuData&0xfffff;ct[1] =RetuData; }

5、AHT10初始化函数

/*
*********************************************************************************************************
*	函 数 名: uint8_t AHT10_Init(void)//初始化AHT10
*	功能说明: AHT10初始化函数
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/uint8_t AHT10_Init(void)//初始化AHT10
{uint16_t count=0;MyI2C_Start();MyI2C_SendByte(0x70);		//进行写操作MyI2C_ReceiveAck();MyI2C_SendByte(0xE1);		//写系统配置寄存器MyI2C_ReceiveAck();MyI2C_SendByte(0x08);		//校准位置1MyI2C_ReceiveAck();MyI2C_SendByte(0x00);MyI2C_ReceiveAck();MyI2C_Stop();Delay_ms(500);while( AHT10_Read_Cal_Enable() == 0)//如果校准位没有置1,就一直初始化{AHT10_SendBA();Delay_ms(100);MyI2C_Start();MyI2C_SendByte(0x70);		//进行写操作MyI2C_ReceiveAck();MyI2C_SendByte(0xE1);		//写系统配置寄存器MyI2C_ReceiveAck();MyI2C_SendByte(0x08);		//校准位置1MyI2C_ReceiveAck();MyI2C_SendByte(0x00);MyI2C_ReceiveAck();MyI2C_Stop();if(count++>=10)return 0;Delay_ms(500);}return 1;}

6、应答位

大家一路看过来,应该发现每段信号的发送都有一个MyI2C_ReceiveAck();不要急,我现在就给大家解释一下这里。

应答位的作用

  1. 确认数据接收:当从设备正确接收到主设备发送的数据字节后,它会通过拉低SDA线来发送一个应答位,表示已经成功接收了数据。
  2. 错误检测:如果从设备没有准备好接收数据或未能识别出其地址,则不会响应应答位,SDA保持高电平(称为NACK, No Acknowledge)。这可以提示主设备存在通信问题,如地址不匹配、从设备忙或未准备好等。
  3. 控制流:在某些情况下,例如读操作期间,主设备也可以发送NACK来通知从设备停止发送更多的数据。

应答时序

  • 在每个数据字节的第9个时钟周期(即最后一个时钟周期),SCL为高时,SDA的状态由接收方决定:
    • 如果是应答(ACK),则SDA会被拉低;
    • 如果是非应答(NACK),则SDA保持高电平。
/*** 函    数:I2C接收应答位* 参    数:无* 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答*/
uint8_t MyI2C_ReceiveAck(void)
{uint8_t AckBit;							//定义应答位变量MyI2C_W_SDA(1);							//接收前,主机先确保释放SDA,避免干扰从机的数据发送MyI2C_W_SCL(1);							//释放SCL,主机机在SCL高电平期间读取SDAAckBit = MyI2C_R_SDA();					//将应答位存储到变量里MyI2C_W_SCL(0);							//拉低SCL,开始下一个时序模块return AckBit;							//返回定义应答位变量
}

三、源码分享

AHT10.c

#include <stm32f10x.h>
#include "I2C.h"
#include "Delay.h"
#include "uart.h"
#include "SHT10.h"#define AHT10_ADDRESS   0x38		//Sht10的I2C从机地址/*
*********************************************************************************************************
*	函 数 名: uint8_t AHT10_Read_Status(void)
*	功能说明: 读取AHT10状态寄存器
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
uint8_t AHT10_Read_Status(void)
{uint8_t Byte_first;MyI2C_Start();MyI2C_SendByte(0x71);MyI2C_ReceiveAck();Byte_first = MyI2C_ReceiveByte();MyI2C_Stop();return Byte_first;
}
/*
*********************************************************************************************************
*	函 数 名: uint8_t AHT10_Read_Cal_Enable(void)
*	功能说明: 查询校准使能位有没有使能
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
uint8_t AHT10_Read_Cal_Enable(void)
{uint8_t val = 0;val = AHT10_Read_Status();if((val & 0x68)==0x08)  //判断NOR模式和校准输出是否有效return 1;else  return 0;
}/*
*********************************************************************************************************
*	函 数 名: void AHT10_SendAC(void)
*	功能说明: 触发传感器进行测量
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void AHT10_SendAC(void)
{MyI2C_Start();MyI2C_SendByte(0x70);MyI2C_ReceiveAck();MyI2C_SendByte(0xAC);MyI2C_ReceiveAck();MyI2C_SendByte(0x33);MyI2C_ReceiveAck();MyI2C_SendByte(0x00);MyI2C_ReceiveAck();MyI2C_Stop();
}
/*
*********************************************************************************************************
*	函 数 名: void AHT10_SendBA(void)
*	功能说明: 软复位模块
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void AHT10_SendBA(void)
{MyI2C_Start();MyI2C_SendByte(0x70);MyI2C_ReceiveAck();MyI2C_SendByte(0xBA);MyI2C_ReceiveAck();MyI2C_Stop();
}/*
*********************************************************************************************************
*	函 数 名: void AHT10_Read_CTdata(uint32_t *ct) //读取AHT10的温度和湿度数据
*	功能说明: 
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void AHT10_Read_CTdata(uint32_t *ct) //读取AHT10的温度和湿度数据
{uint8_t Byte_1th = 0;uint8_t Byte_2th = 0;uint8_t Byte_3th = 0;uint8_t Byte_4th = 0;uint8_t Byte_5th = 0;uint8_t Byte_6th = 0;uint32_t RetuData = 0;uint16_t cnt = 0;AHT10_SendAC(); //向AHT10发送AC指令Delay_ms(75); //等待75mscnt = 0;while(((AHT10_Read_Status()&0x80)==0x80))//等待忙状态结束{Delay_us(1508);if(cnt++>=100){break;}}MyI2C_Start();MyI2C_SendByte(0x71);MyI2C_ReceiveAck();Byte_1th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_2th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_3th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_4th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_5th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();Byte_6th = MyI2C_ReceiveByte();MyI2C_ReceiveAck();MyI2C_Stop();RetuData = (RetuData|Byte_2th)<<8;RetuData = (RetuData|Byte_3th)<<8;RetuData = (RetuData|Byte_4th);RetuData =RetuData >>4;ct[0] = RetuData;RetuData = 0;RetuData = (RetuData|Byte_4th)<<8;RetuData = (RetuData|Byte_5th)<<8;RetuData = (RetuData|Byte_6th);RetuData = RetuData&0xfffff;ct[1] =RetuData; }
/*
*********************************************************************************************************
*	函 数 名: uint8_t AHT10_Init(void)//初始化AHT10
*	功能说明: AHT10初始化函数
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/uint8_t AHT10_Init(void)//初始化AHT10
{uint16_t count=0;MyI2C_Start();MyI2C_SendByte(0x70);MyI2C_ReceiveAck();MyI2C_SendByte(0xE1);MyI2C_ReceiveAck();MyI2C_SendByte(0x08);MyI2C_ReceiveAck();MyI2C_SendByte(0x00);MyI2C_ReceiveAck();MyI2C_Stop();Delay_ms(500);while( AHT10_Read_Cal_Enable() == 0){AHT10_SendBA();Delay_ms(100);MyI2C_Start();MyI2C_SendByte(0x70);MyI2C_ReceiveAck();MyI2C_SendByte(0xE1);MyI2C_ReceiveAck();MyI2C_SendByte(0x08);MyI2C_ReceiveAck();MyI2C_SendByte(0x00);MyI2C_ReceiveAck();MyI2C_Stop();if(count++>=10)return 0;Delay_ms(500);}return 1;}
/*
*********************************************************************************************************
*	函 数 名: Get_Value()
*	功能说明: 获取温湿度的值
*	形    参:无
*	返 回 值: 无
*********************************************************************************************************
*/
void Set_temp_humid()
{float c1,t1;uint32_t CT_data[2];while(AHT10_Read_Cal_Enable()==0){AHT10_Init();Delay_ms(10);}AHT10_Read_CTdata(CT_data);  //读取温度和湿度 , 可间隔1.5S读一次c1= CT_data[0]*1000/1024/1024/10.00;  //计算得到湿度值(放大了10倍,如果c1=523,表示现在湿度为52.3%)t1= (CT_data[1] *200*10/1024/1024-500)/10.00;//计算得到温度值(放大了10倍,如果t1=245,表示现在温度为24.5℃)Serial_Printf("湿度:%.2f,温度:%.2f",c1,t1);}

AHT10.h

#ifndef __SHT10_H
#define __SHT10_Huint8_t AHT10_Read_Status(void);//读取状态
uint8_t AHT10_Read_Cal_Enable(void);//检测校准位
uint8_t AHT10_Init(void);//初始化AHT10void AHT10_SendAC(void);//发送触发检测信号
void AHT10_SendBA(void);//软复位信号
void AHT10_Read_CTdata(uint32_t *ct);//读取AHT10的温度和湿度数据
void Set_temp_humid();//计算湿度和温度#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "uart.h"
#include "Sht10.h"
#include "I2C.h"
#include "Delay.h"uint8_t RxData;int main(void)
{		UART_Init();MyI2C_Init();AHT10_Init();					while (1){
//			Serial_Printf("湿度:%.2f,温度:%.2f",AHT10_Data -> humi,AHT10_Data -> temp);Set_temp_humid();Delay_s(2);}}

四、工程分享

以下是我分享的资源,我设置了免费下载,大家同时可以在评论区留言邮箱

https://download.csdn.net/download/weixin_54210362/89853007?spm=1001.2014.3001.5503icon-default.png?t=O83Ahttps://download.csdn.net/download/weixin_54210362/89853007?spm=1001.2014.3001.5503

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

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

相关文章

论文阅读笔记-LogME: Practical Assessment of Pre-trained Models for Transfer Learning

前言 在NLP领域,预训练模型(准确的说应该是预训练语言模型)似乎已经成为各大任务必备的模块了,经常有看到文章称后BERT时代或后XXX时代,分析对比了许多主流模型的优缺点,这些相对而言有些停留在理论层面,可是有时候对于手上正在解决的任务,要用到预训练语言模型时,面…

数据库三大范式

第一范式&#xff08;1NF&#xff09; 确保每个列中的数据是不可再分的。即&#xff0c;每个列只能包含一个值&#xff0c;而不是一个列表或数组。 每个列有多个数据的要拆成多个表。 错误&#xff1a; 正确&#xff1a; 第二范式 &#xff08;2NF&#xff09; 在第一范式的基…

探索Spring Boot:实现“衣依”服装电商平台

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

数据结构与算法——Java实现 30.合并多个有序链表 小顶堆实现

后来我们都走了很久&#xff0c;远到提及往事时&#xff0c; 总会加上once upon a time —— 24.10.6 23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1…

【EXCEL数据处理】000010 案列 EXCEL文本型和常规型转换。使用的软件是微软的Excel操作的。处理数据的目的是让数据更直观的显示出来,方便查看。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000010 案列 EXCEL单元格格式。EXCEL文本型和常规型转…

推荐一个可以把PDF样本册转换为翻页电子书的网站

​随着互联网的普及&#xff0c;越来越多的企业和个人开始意识到线上展览的重要性。如何将实体样本册转化为线上版本&#xff0c;让更多人了解和欣赏自己的产品与服务&#xff1f; 一、网站简介 这款PDF样本册免费上传网站名为“FLBOOK”&#xff0c;致力于为广大用户提供便捷…

构建 10 万卡 GPU 集群的技术挑战

构建 10 万卡 GPU 集群的技术挑战 摘要 揭示AI训练集群关键基础设施挑战&#xff0c;探讨突破现有AI瓶颈的必要性与10万GPU集群&#xff08;如OpenAI、Meta&#xff09;建设所面临挑战与需求。 构建网络拓扑&#xff0c;需权衡多层交换机成本、带宽与维护。本文对比Ethernet与…

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习04(环境准备)

4 创建docker容器 4.1创建网络 [rootlocalhost wutool]# docker network create -d macvlan --subnet192.168.137.0/24 --gateway192.168.137.2 --ip-range192.168.137.0/24 -o parentens33 nat 52af11381bfd655d175e4168265b2a507793e8fe48f119db846949ffd4dd27de [rootlocal…

【JavaWeb】javaweb目录结构简介【转】

以上图说明&#xff1a; bbs目录代表一个web应用bbs目录下的html,jsp文件可以直接被浏览器访问WEB-INF目录下的资源是不能直接被浏览器访问的web.xml文件是web程序的主要配置文件所有的classes文件都放在classes目录下jar文件放在lib目录下

Stream流的终结方法(二)——collect

1.Stream流的终结方法 2. collect方法 collect方法用于收集流中的数据放到集合中去&#xff0c;可以将流中的数据放到List&#xff0c;Set&#xff0c;Map集合中 2.1 将流中的数据收集到List集合中 package com.njau.d10_my_stream;import java.util.*; import java.util.f…

鸿蒙开发(NEXT/API 12)【管理应用与Wear Engine服务的连接状态】手机侧应用开发

监测应用与Wear Engine服务的连接状态 华为运动健康App在后台停止服务&#xff08;如功耗过高&#xff09;&#xff0c;从而导致应用与Wear Engine服务的连接状态发生变化。对于类似这种不确定的断开情况&#xff0c;开发者可以通过本功能特性了解当前应用和Wear Engine的连接…

五子棋双人对战项目(3)——匹配模块

目录 一、分析需求 二、约定前后端交互接口 匹配请求&#xff1a; 匹配响应&#xff1a; 三、实现游戏大厅页面&#xff08;前端代码&#xff09; game_hall.html&#xff1a; common.css&#xff1a; game_hall.css&#xff1a; 四、实现后端代码 WebSocketConfig …

初识算法 · 双指针(2)

目录 前言&#xff1a; 盛最多水的容器 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 有效三角形的个数 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 前言&#xff1a; 本文介绍两个题目&#xff0c;盛最多水的容器和有效三…

【Blender Python】5.Blender场景中的集合

概述 这里的“集合”是指Blender场景中的集合。你可以在“大纲视图”面板中看到 图标的&#xff0c;就是集合&#xff0c;可以看做是文件夹&#xff0c;用于分类和整理场景中的对象。 获取场景的集合 >>> C.scene bpy.data.scenes[Scene]>>> C.scene.coll…

AI 大模型的核心能力与应用场景全解析

深入理解 AI 大模型&#xff1a;核心能力与应用场景全解析 AI大模型是什么 通过概念考察的方式了解AI大模型&#xff0c;拆开来看。 AI领域术语丰富&#xff0c;涵盖模式识别、自然语言处理、神经网络、机器学习、深度学习、强化学习及人类反馈强化学习。大模型&#xff1a;把…

【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段

文章目录 【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段1 问题由来2 操作流程步骤1&#xff1a;打开代码片段定制页步骤2&#xff1a;在新标签页输入定制 XML步骤3&#xff1a;保存定义内容步骤4&#xff1a;功能测试 3 拓展 【工欲善其事】巧用 Sublime Text 生成带…

【笔记】信度检验

一、信度 信度是指测量结果的一致性和稳定性。 1.一致性&#xff08;Consistency&#xff09; 一致性指的是测量工具内部各个部分或项目之间的协调一致程度。高一致性意味着测量工具的不同部分都在测量同一个概念或特质。 例子&#xff1a;智力测试 假设我们有一个包含100…

ai智能论文生成系统有用吗?分享5款ai文献综述自动生成器

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术在学术写作领域的应用越来越广泛&#xff0c;尤其是在文献综述的自动生成方面。AI智能论文生成系统通过深度学习和自然语言处理技术&#xff0c;能够帮助研究人员快速生成高质量的文献综述&#xff0c;从而提高写作效…