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

基于单片机的煤气泄漏检测报警装置设计

一、项目介绍

煤气泄漏是一种常见的危险情况,可能导致火灾、爆炸和人员伤亡。为了及时发现煤气泄漏并采取相应的安全措施,设计了一种基于单片机的煤气泄漏检测报警装置。

主控芯片采用STM32F103C8T6作为主控芯片,具有强大的计算和控制能力。煤气检测传感器选择了MQ-5,它能够检测到环境中的煤气浓度,并将其转换为电信号输出。装置通过读取传感器输出的模拟信号,并经过ADC转换获得相应的数字值,实时监测煤气浓度。

当检测到煤气浓度超过设定的安全阈值时,装置会触发报警机制。通过控制蜂鸣器发出高频报警声,吸引人的注意并提醒危险情况。同时,装置会控制LED灯光闪烁,以视觉方式提醒用户。这样的多重报警方式可以在不同环境中有效地引起人们的警觉。

为了进一步提高报警的及时性和可靠性,还集成了SIM800C模块,用于发送报警短信给指定的联系人。当煤气浓度超标时,装置会通过SIM800C模块发送预先设定的报警短信,通知相关人员及时采取措施。

通过以上设计,基于单片机的煤气泄漏检测报警装置能够实时监测环境中的煤气浓度,并在检测到异常情况时通过声光报警和短信通知提醒用户。这样的装置可以广泛应用于家庭、工业和商业环境中,为人们的生命财产安全提供有效的保障。

image-20230802163612836

image-20230802163555635

二、硬件选型

在这个设计中,选择了下面的硬件来实现煤气泄漏检测报警装置。

【1】主控芯片:STM32F103C8T6。该芯片是一款强大的低功耗微控制器,具有丰富的外设和良好的性能。它集成了多个通用输入输出引脚、模数转换器 (ADC)、定时器和串行接口等功能,适合用于各种嵌入式应用。

【2】煤气检测传感器:MQ-5。MQ-5是一种常见的煤气传感器,可检测到液化石油气(LPG)、天然气和甲烷等可燃气体。它基于半导体气敏材料,当检测到目标气体浓度超过设定阈值时,其电阻值发生变化。通过测量电阻值的变化,可以判断煤气的浓度是否超标。

【3】蜂鸣器:用于发出报警声音,提醒人们注意。选择合适的蜂鸣器需要考虑其音量大小、工作电压和驱动方式等因素。

【4】LED灯:用于提醒人们注意并指示报警状态。选择合适的LED需要考虑其亮度、工作电压和颜色等因素。

【5】SIM800C模块:用于发送报警短信。SIM800C是一款支持GSM/GPRS通信的模块,可以通过AT指令与主控芯片进行通信。它具有较小的体积、低功耗和稳定的性能,适合物联网应用中的短信通信需求。

三、系统设计思路

软件设计思路:

【1】初始化:对STM32F103C8T6单片机和外设进行初始化设置,包括引脚配置、时钟设置等。

【2】煤气检测:使用ADC模块读取MQ-5传感器的模拟信号,并转换为相应的数字值。

【3】煤气浓度判断:根据传感器的特性曲线,将读取到的数字值转换为实际的煤气浓度。

【4】报警判断:判断煤气浓度是否超过设定的安全阈值。

【5】报警处理:

  • 控制蜂鸣器发出报警声。
  • 控制LED灯光闪烁。
  • 使用SIM800C模块发送报警短信给指定的联系人。

【6】主循环:在主循环中不断进行煤气检测和报警判断,保持系统的实时监测和报警功能。

伪代码示例:

初始化:初始化STM32F103C8T6单片机和外设设置主循环:while (true) {煤气检测();煤气浓度判断();报警判断();延时一段时间;}煤气检测:读取MQ-5传感器的模拟信号;将模拟信号转换为数字值;煤气浓度判断:根据传感器的特性曲线,将数字值转换为实际的煤气浓度;报警判断:if (煤气浓度超过安全阈值) {报警处理();}报警处理:控制蜂鸣器发出报警声;控制LED灯光闪烁;使用SIM800C模块发送报警短信给指定的联系人;

四、代码实现

4.1 主程序

#include "stm32f10x.h"// 定义蜂鸣器控制引脚和LED控制引脚
#define BUZZER_PIN      GPIO_Pin_0
#define BUZZER_PORT     GPIOA#define LED_PIN         GPIO_Pin_1
#define LED_PORT        GPIOA// 定义煤气传感器控制引脚
#define GAS_SENSOR_PIN  GPIO_Pin_2
#define GAS_SENSOR_PORT GPIOA// 定义SIM800C模块的发送引脚
#define SIM800C_SEND_PIN    GPIO_Pin_3
#define SIM800C_SEND_PORT   GPIOA// 定义报警阈值
#define THRESHOLD           1000// 声明函数原型
void GPIO_Init(void);
void ADC_Init(void);
void Buzzer_Alarm(void);
void LED_Flash(void);
void Send_SMS(void);int main(void)
{// 初始化GPIO和ADCGPIO_Init();ADC_Init();while (1){// 进行煤气浓度检测u16 gasValue = ADC_GetConversionValue(ADC1);// 如果煤气浓度超过阈值,则触发报警if (gasValue > THRESHOLD){Buzzer_Alarm();LED_Flash();Send_SMS();}}
}// GPIO初始化函数
void GPIO_Init(void)
{// 打开GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef gpioInitStruct;// 配置蜂鸣器引脚为推挽输出gpioInitStruct.GPIO_Pin = BUZZER_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(BUZZER_PORT, &gpioInitStruct);// 配置LED引脚为推挽输出gpioInitStruct.GPIO_Pin = LED_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(LED_PORT, &gpioInitStruct);// 配置煤气传感器引脚为模拟输入gpioInitStruct.GPIO_Pin = GAS_SENSOR_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GAS_SENSOR_PORT, &gpioInitStruct);// 配置SIM800C模块的发送引脚为推挽输出gpioInitStruct.GPIO_Pin = SIM800C_SEND_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_Out_PP;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(SIM800C_SEND_PORT, &gpioInitStruct);
}// ADC初始化函数
void ADC_Init(void)
{// 打开ADC时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);ADC_InitTypeDef adcInitStruct;// ADC配置adcInitStruct.ADC_Mode = ADC_Mode_Independent;adcInitStruct.ADC_ScanConvMode = DISABLE;adcInitStruct.ADC_ContinuousConvMode = ENABLE;adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right;adcInitStruct.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &adcInitStruct);// 配置ADC通道ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5);// 打开ADCADC_Cmd(ADC1, ENABLE);// 开始ADC转换ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}// 触发蜂鸣器报警
void Buzzer_Alarm(void)
{GPIO_SetBits(BUZZER_PORT, BUZZER_PIN);   // 打开蜂鸣器Delay(1000);                            // 延时一段时间GPIO_ResetBits(BUZZER_PORT, BUZZER_PIN); // 关闭蜂鸣器
}// LED闪烁提醒
void LED_Flash(void)
{for (int i = 0; i < 10; i++){GPIO_SetBits(LED_PORT, LED_PIN);     // 打开LEDDelay(500);                          // 延时一段时间GPIO_ResetBits(LED_PORT, LED_PIN);   // 关闭LEDDelay(500);                          // 延时一段时间}
}// 发送报警短信
void Send_SMS(void)
{// 这里编写与SIM800C模块通信的代码,发送报警短信
}

4.2 SIM800C代码

#include "stm32f10x.h"
#include <stdio.h>
#include <string.h>// 定义SIM800C模块的串口引脚
#define SIM800C_USART           USART2
#define SIM800C_USART_GPIO      GPIOA
#define SIM800C_USART_TX_PIN    GPIO_Pin_2
#define SIM800C_USART_RX_PIN    GPIO_Pin_3// 定义发送缓冲区和接收缓冲区的大小
#define TX_BUFFER_SIZE  128
#define RX_BUFFER_SIZE  128// 声明全局变量
char tx_buffer[TX_BUFFER_SIZE]; // 发送缓冲区
char rx_buffer[RX_BUFFER_SIZE]; // 接收缓冲区
uint8_t rx_index = 0;           // 接收缓冲区索引// 函数原型
void USART2_Init(void);
void USART2_SendString(const char* string);
void USART2_IRQHandler(void);
void Send_AT_Command(const char* at_command);
void Send_SMS(void);int main(void)
{USART2_Init();while (1){// 在主循环中调用Send_SMS函数即可触发发送短信}
}// 初始化USART2
void USART2_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);    // 打开GPIOA和AFIO时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);                          // 打开USART2时钟GPIO_InitTypeDef gpioInitStruct;USART_InitTypeDef usartInitStruct;NVIC_InitTypeDef nvicInitStruct;// 配置USART2的GPIO引脚gpioInitStruct.GPIO_Pin = SIM800C_USART_TX_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(SIM800C_USART_GPIO, &gpioInitStruct);gpioInitStruct.GPIO_Pin = SIM800C_USART_RX_PIN;gpioInitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(SIM800C_USART_GPIO, &gpioInitStruct);// 配置USART2usartInitStruct.USART_BaudRate = 115200;usartInitStruct.USART_WordLength = USART_WordLength_8b;usartInitStruct.USART_StopBits = USART_StopBits_1;usartInitStruct.USART_Parity = USART_Parity_No;usartInitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;usartInitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_Init(SIM800C_USART, &usartInitStruct);// 配置USART2中断nvicInitStruct.NVIC_IRQChannel = USART2_IRQn;nvicInitStruct.NVIC_IRQChannelPreemptionPriority = 0;nvicInitStruct.NVIC_IRQChannelSubPriority = 0;nvicInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&nvicInitStruct);// 启动USART2接收中断USART_ITConfig(SIM800C_USART, USART_IT_RXNE, ENABLE);// 启动USART2USART_Cmd(SIM800C_USART, ENABLE);
}// 发送字符串到USART2
void USART2_SendString(const char* string)
{uint16_t length = strlen(string);for (uint16_t i = 0; i < length; i++){USART_SendData(SIM800C_USART, string[i]);while (USART_GetFlagStatus(SIM800C_USART, USART_FLAG_TXE) == RESET);}
}// USART2中断处理函数
void USART2_IRQHandler(void)
{if (USART_GetITStatus(SIM800C_USART, USART_IT_RXNE) != RESET){char receivedData = USART_ReceiveData(SIM800C_USART);rx_buffer[rx_index++] = receivedData;// 处理接收到的数据// ...USART_ClearITPendingBit(SIM800C_USART, USART_IT_RXNE);}
}// 发送AT指令
void Send_AT_Command(const char* at_command)
{memset(rx_buffer, 0, RX_BUFFER_SIZE); // 清空接收缓冲区rx_index = 0;USART2_SendString(at_command);// 等待模块返回数据while (strncmp(rx_buffer, "OK", 2) != 0 && strncmp(rx_buffer, "ERROR", 5) != 0){// 延时一段时间Delay(10);}// 处理模块返回的数据// ...
}// 发送短信
void Send_SMS(void)
{// 发送AT指令设置短信模式Send_AT_Command("AT+CMGF=1\r\n");// 发送AT指令设置短信收件人和内容Send_AT_Command("AT+CMGS=\"+861**********\"\r\n");Send_AT_Command("Hello, this is a test message.\r\n");// 发送短信结束标志(Ctrl+Z)USART2_SendString("\x1A");
}

五、总结

本项目设计了一个基于单片机的煤气泄漏检测报警装置,通过使用STM32F103C8T6作为主控芯片和MQ-5煤气传感器进行煤气检测,有效地提醒用户煤气泄漏的危险。通过控制蜂鸣器和LED灯的报警机制,以及使用SIM800C模块发送报警短信,用户可以及时采取措施来避免潜在的危险。这个项目结合了硬件设计和嵌入式软件开发的知识,为用户提供了一个可靠的煤气泄漏检测报警解决方案。

相关文章:

基于单片机的煤气泄漏检测报警装置设计

一、项目介绍 煤气泄漏是一种常见的危险情况&#xff0c;可能导致火灾、爆炸和人员伤亡。为了及时发现煤气泄漏并采取相应的安全措施&#xff0c;设计了一种基于单片机的煤气泄漏检测报警装置。 主控芯片采用STM32F103C8T6作为主控芯片&#xff0c;具有强大的计算和控制能力。…...

[导弹打飞机H5动画制作] 导弹每次飞行的随机路线制作

技术核心提示: 第一步:检测引导层插件是否具备,如果没有手工添加: createjs.MotionGuidePlugin.install(); 第二步:增加全局变量: var fValue=0; var iOddEven =0; var missileObj=null; 第三步:填写 第一帧 代码: if (missileObj)stage.removeChild(missileObj);missile…...

OpenCV实现FAST算法角点检测 、ORB算法特征点检测

目录 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 非极大值抑制 1.3 代码实现 1.4 结果展示 2 &#xff0c;ORB算法 2.1代码实现 2.2 结果展示 1 Fast算法 1.1 Fast算法原理 1.2 实现办法 1.2.1 机器学习的角点检测器 1.2.2 …...

【Unity的 Built-in 渲染管线下实现好用的GUI模糊效果_Blur_案例分享(内附源码)】

CGPROGRAM实现好用的GUI模糊效果 实现Blur模糊方式1C#代码如下方式1_Shader代码如下实现Blur模糊方式2方式2_Shader如下实现Blur模糊方式1 其他的模糊效果,在这一篇。 效果如图: 新建一个C#文件,命名为"CommandBlur",打开C#,删除内容,复制粘贴下面的代码:…...

AR智能眼镜:提升现场服务技能、效率与盈利能力的利器(一)

随着技术的不断进步&#xff0c;现场服务组织正朝着远程支持转变&#xff0c;用以解决技能差距和生产力问题&#xff0c;提高员工培训和操作效率&#xff0c;同时为企业提高利润率&#xff0c;创造竞争优势。 本文将探讨增强现实&#xff08;AR&#xff09;、辅助现实&#xf…...

ChatGPT 在机器学习中的应用

办公室里一个机器人坐在人类旁边&#xff0c;Artstation 上的流行趋势&#xff0c;美丽的色彩&#xff0c;4k&#xff0c;充满活力&#xff0c;蓝色和黄色&#xff0c; DreamStudio出品 一、介绍 大家都知道ChatGPT。它在解释机器学习和深度学习概念方面也非常高效&#xff0c;…...

【JavaEE】锁策略

文章目录 前言1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重入锁6. 读写锁Java synchronized 分别对应哪些锁策略1. 乐观锁和悲观锁2. 重量级锁和轻量级锁3. 自旋锁和挂起等待锁4. 公平锁和非公平锁5. 可重入锁和非可重…...

在 SDXL 上用 T2I-Adapter 实现高效可控的文生图

T2I-Adapter 是一种高效的即插即用模型&#xff0c;其能对冻结的预训练大型文生图模型提供额外引导。T2I-Adapter 将 T2I 模型中的内部知识与外部控制信号结合起来。我们可以根据不同的情况训练各种适配器&#xff0c;实现丰富的控制和编辑效果。 同期的 ControlNet 也有类似的…...

Python分支结构和循环结构

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一.分支结构 分支结构是根据判断条件结果而选择不同向前路径的运行方式&#xff0c;分支结构分为&#xff1a;单分支&#xff0c;二分支和多分支。 1&#xff0…...

Unity调用API函数对系统桌面和窗口截图

Unity3D调用WINAPI函数对系统窗口截图 引入WINAPI函数调用WINAPI函数进行截图使用例子 引入WINAPI函数 using System; using System.Collections; using System.Runtime.InteropServices; using System.Drawing;[DllImport("user32.dll")]private static extern Int…...

【问题思考总结】CPU怎么访问磁盘?CPU只有32位,最多只能访问4GB的空间吗?

问题 在学习操作系统的时候发现了这样一个问题&#xff0c;32位的CPU寻址空间只有4GB&#xff0c;难道只有4GB的空间可以使用吗&#xff1f;以此为始&#xff0c;我开始了一些思考。 思考 Q1&#xff1a;首先&#xff0c;我似乎混淆了一个概念&#xff0c;内存和外存&#x…...

UG NX二次开发(C++)-CAM-根据刀具对程序组进行重新分组

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX中创建一个三维模型3、在UG NX/CAM中创建多个加工程序4、采用UG NX二次开发(NXOpen)实现按照刀具分组程序组4.2 创建UI Styler4.1 实现逻辑4.2 生成的代码如下:4.3 测试效果4.…...

Unity如何实现TreeView

前言 最近有一个需求,需要实现一个TreeView的试图显示,开始我一直觉得这么通用的结构,肯定有现成的UI组件或者插件可以使用,结果,找了好久,都没有找到合适的插件,有两个效果差强人意。 最后在回家的路上突然灵光一闪,想到了一种简单的实现方式,什么插件都不用,仅使用…...

Android widget 小部件使用指南强化版

Android widget 小部件使用指南强化版 一、简单UI的小部件二、含集合的小部件三、可配置的小部件四、可控制的小部件五、Android 12 Widget 更新 小部件是主屏幕定制的一个重要方面。您可以将它们视为应用程序最重要的数据和功能的“概览”视图&#xff0c;这些数据和功能可以直…...

Linux下C语言操作网卡的几个代码实例?特别实用

前面写了一篇关于网络相关的文章&#xff1a;如何获取当前可用网口。 《简简单单教你如何用C语言列举当前所有网口&#xff01;》 那么如何使用C语言直接操作网口&#xff1f; 比如读写IP地址、读写MAC地址等。 一、原理 主要通过系统用socket()、ioctl()、实现 int sock…...

noip2011选择旅馆

1.审题&#xff1a;第一个人与第二个人入住的旅馆要求是同色的&#xff1b; 两个人去消费的旅馆并没有要求与入住的旅馆是同色的&#xff08;这点要小心&#xff09; 2.要求记录以下数据&#xff1a; 1&#xff09;a[color]表示当前同为颜色color的旅馆数 2&#xff09;b[co…...

vue造轮子完整指南--npm组件包开发步骤

一、项目包文件的创建和初始化。 1. 新建项目包。 vue create <Project Name> //用于发布npm包的项目文件名 ps:一般选择自定义&#xff0c;然后不需要Vuex和Router&#xff0c;其他选项按自己实际情况选择安装即可。 2.修改原始src文件名、新增组件项目存放文件和修改…...

28 drf-Vue个人向总结-1

文章目录 前后端分离开发展示项目项补充知识开发问题浏览器解决跨域问题 drf 小tips设置资源root目录使用自定义的user表设置资源路径media数据库补充删除表中数据单页面与多页面模式过滤多层自关联后端提交的数据到底是什么jwt token登录设置普通的 token 原理使用流程解析 jw…...

线性代数(七) 矩阵分析

前言 从性线变换我们得出&#xff0c;矩阵和函数是密不可分的。如何用函数的思维来分析矩阵。 矩阵的序列 通过这个定义我们就定义了矩阵序列的收敛性。 研究矩阵序列收敛性的常用方法&#xff0c;是用《常见向量范数和矩阵范数》来研究矩阵序列的极限。 长度是范数的一个特…...

myArm 全新七轴桌面型机械臂

引言 在不断演进的科技世界中&#xff0c;我们始终追求创新和卓越&#xff0c;以满足客户的需求并超越他们的期望。今天&#xff0c;我们很高兴地宣布我们的最新产品——myArm 300 Pi&#xff0c;一款七轴的桌面型机械臂。这款产品的独特之处在于其灵活性和可编程性&#xff0c…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...