STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶

1.定时器介绍

软件定时

缺点:不精确、占用CPU资源

void Delay500ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 4;j = 129;k = 119;do{do{while (--k);} while (--j);} while (--i);
}

定时器工作原理

使用精准的时基,通过硬件的方式,实现定时功能。定时器核心就是计数器。

2.PWM介绍

STM32F103C8T6 PWM资源:

高级定时器(TIM1):7路

通用定时器(TIM2~TIM4):各4路

PWM输出模式:

PWM模式1:在向上计数时,一旦 CNT < CCRx 时输出为有效电平,否则为无效电平; 在向下计数时,一旦 CNT > CCRx 时输出为无效电平,否则为有效电平。

PWM模式2:在向上计数时,一旦 CNT < CCRx 时输出为无效电平,否则为有效电平; 在向下计数时,一旦 CNT > CCRx 时输出为有效电平,否则为无效电平。
在这里插入图片描述

PWM周期与频率:
在这里插入图片描述

3.呼吸灯

LED灯为什么可以越来越亮,越来越暗?

这是由不同的占空比决定的。

代码实现

// 定义变量
uint16_t pwmVal=0; //调整PWM占空比
uint8_t dir=1; //设置改变方向。1:占空比越来越大;0:占空比越来越小
// 使能 Timer4 第3通道 PWM 输出
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
// while循环实现呼吸灯效果
while (1)
{HAL_Delay(1);if (dir)pwmVal++;elsepwmVal--;if (pwmVal > 500)dir = 0;if (pwmVal == 0)dir =1;//修改比较值,修改占空比__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, pwmVal);
}

项目实现

项目需求

检测靠近时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

发生震动时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

按下按键时,垃圾桶自动开盖并伴随滴一声,2秒后关盖

项目框图
在这里插入图片描述

硬件清单

SG90舵机,超声波模块,震动传感器,蜂鸣器

舵机介绍

在这里插入图片描述

角度控制

  • 0.5ms-------------0度; 2.5% 对应函数中CCRx为5
  • 1.0ms------------45度; 5.0% 对应函数中CCRx为10
  • 1.5ms------------90度; 7.5% 对应函数中CCRx为15
  • 2.0ms-----------135度; 10.0% 对应函数中CCRx为20
  • 2.5ms-----------180度; 12.5% 对应函数中CCRx为25

编程实现

需求

每隔1s,转动一个角度:0度 --> 45度 --> 90度 --> 135度 --> 180度 --> 0度

代码实现

HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
while (1)
{HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 10);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 20);HAL_Delay(1000);__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 25);
}

超声波传感器介绍

  • 怎么让它发送波

Trig ,给Trig端口至少10us的高电平

  • 怎么知道它开始发了

Echo信号,由低电平跳转到高电平,表示开始发送波

  • 怎么知道接收了返回波

Echo,由高电平跳转回低电平,表示波回来了

  • 怎么算时间

Echo引脚维持高电平的时间!

  • 波发出去的那一下,开始启动定时器

波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间

  • 怎么算距离

距离 = 速度 (340m/s)* 时间/2外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编程实现

需求:使用超声波测距,当手离传感器距离小于5cm时,LED1点亮,否则保持不亮状态。

接线

Trig — PB6

Echo — PB7

LED1 — PB8外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

编写微秒级函数

//使用TIM2来做us级延时函数
void TIM2_Delay_us(uint16_t n_us)
{/* 使能定时器2计数 */__HAL_TIM_ENABLE(&htim2);__HAL_TIM_SetCounter(&htim2, 0);while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );/* 关闭定时器2计数 */__HAL_TIM_DISABLE(&htim2);
}

主函数:

//1. Trig ,给Trig端口至少10us的高电平

//2. echo由低电平跳转到高电平,表示开始发送波

//波发出去的那一下,开始启动定时器

//3. 由高电平跳转回低电平,表示波回来了

//波回来的那一下,我们开始停止定时器

//4. 计算出中间经过多少时间

//5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)

//每500毫秒测试一次距离

int cnt;
float distance;
while (1)
{//1. Trig ,给Trig端口至少10us的高电平HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);//拉高TIM2_Delay_us(20);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);//拉低//2. echo由低电平跳转到高电平,表示开始发送波//波发出去的那一下,开始启动定时器while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_RESET);//等待输入电平拉高HAL_TIM_Base_Start(&htim2);__HAL_TIM_SetCounter(&htim2,0);//3. 由高电平跳转回低电平,表示波回来了while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_SET);//等待输入电平变低//波回来的那一下,我们开始停止定时器HAL_TIM_Base_Stop(&htim2);//4. 计算出中间经过多少时间cnt = __HAL_TIM_GetCounter(&htim2);//5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)distance = cnt*340/2*0.000001*100; //单位:cmif(distance < 5)HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);elseHAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);//每500毫秒测试一次距离HAL_Delay(500);
}        

封装成函数

void TIM2_Delay_us(uint16_t n_us)
{/* 使能定时器2计数 */__HAL_TIM_ENABLE(&htim2);__HAL_TIM_SetCounter(&htim2, 0);while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );/* 关闭定时器2计数 */__HAL_TIM_DISABLE(&htim2);
}double getDistance()
{int time=0;//1. Trig ,给Trig端口至少10us的高电平HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);TIM2_Delay_us(20);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);//2.2. echo由低电平跳转到高电平,表示开始发送波while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET);//3.波发出去的那一下,开始启动定时器HAL_TIM_Base_Start(&htim2);__HAL_TIM_SetCounter(&htim2,0);//让定时器从0开始数数//4. 由高电平跳转回低电平,表示波回来了while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_SET);//5.波回来的那一下,我们开始停止定时器HAL_TIM_Base_Stop(&htim2);//6. 计算出中间经过多少时间time=__HAL_TIM_GetCounter(&htim2);//7.距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)return (340*time*0.000001/2*100);
}int main()
{double distance=0;while (1){distance=getDistance();if(distance<5)HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);elseHAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//8.每500毫秒测试一次距离HAL_Delay(500);}}

项目设计及实现

项目设计

超声波模块:

Trig – PB6

Echo – PB7

sg90****舵机:

PWM – PB9

按键:

KEY1 – PA0

LED****灯:

LED1 – PB8

震动传感器:

D0 – PB5

VCC – 5V

蜂鸣器:

IO – PB4

VCC – 3V3

测距开关盖

硬件:超声波模块,舵机

void TIM2_Delay_us(uint16_t n_us)
{/* 使能定时器2计数 */__HAL_TIM_ENABLE(&htim2);__HAL_TIM_SetCounter(&htim2, 0);while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );/* 关闭定时器2计数 */__HAL_TIM_DISABLE(&htim2);
}double getDistance()
{int time=0;//1. Trig ,给Trig端口至少10us的高电平HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);TIM2_Delay_us(20);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);//2.2. echo由低电平跳转到高电平,表示开始发送波while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET);//3.波发出去的那一下,开始启动定时器HAL_TIM_Base_Start(&htim2);__HAL_TIM_SetCounter(&htim2,0);//让定时器从0开始数数//4. 由高电平跳转回低电平,表示波回来了while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_SET);//5.波回来的那一下,我们开始停止定时器HAL_TIM_Base_Stop(&htim2);//6. 计算出中间经过多少时间time=__HAL_TIM_GetCounter(&htim2);//7.距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)return (340*time*0.000001/2*100);
}void closeStatusLight()
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}void initSg90_0()
{HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
}void openDusBin()
{__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);HAL_Delay(2000);
}void closeDusBin()
{__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);HAL_Delay(150);
}int main(void)
{double distance=0;initSg90_0();while (1){distance=getDistance();if(distance<5){openDusBin();openStatusLight();}	else{closeDusBin();closeStatusLight();}	}
}

在测距开光盖的基础上加上按键开盖和震动开盖

void TIM2_Delay_us(uint16_t n_us)
{/* 使能定时器2计数 */__HAL_TIM_ENABLE(&htim2);__HAL_TIM_SetCounter(&htim2, 0);while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );/* 关闭定时器2计数 */__HAL_TIM_DISABLE(&htim2);
}double getDistance()
{int time=0;//1. Trig ,给Trig端口至少10us的高电平HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);TIM2_Delay_us(20);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);//2.2. echo由低电平跳转到高电平,表示开始发送波while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET);//3.波发出去的那一下,开始启动定时器HAL_TIM_Base_Start(&htim2);__HAL_TIM_SetCounter(&htim2,0);//让定时器从0开始数数//4. 由高电平跳转回低电平,表示波回来了while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_SET);//5.波回来的那一下,我们开始停止定时器HAL_TIM_Base_Stop(&htim2);//6. 计算出中间经过多少时间time=__HAL_TIM_GetCounter(&htim2);//7.距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)return (340*time*0.000001/2*100);
}void openStatusLight()
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
}void closeStatusLight()
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}void initSg90_0()
{HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
}void openDusBin()
{__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);HAL_Delay(2000);
}void closeDusBin()
{__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);HAL_Delay(150);
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin==GPIO_PIN_0||GPIO_Pin==GPIO_PIN_5){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET||HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)==GPIO_PIN_RESET){openStatusLight();openDusBin();}	}			
}int main(void)
{double distance=0;HAL_NVIC_SetPriority(SysTick_IRQn,0,0);initSg90_0();while (1){distance=getDistance();if(distance<10){openDusBin();openStatusLight();}	else{closeDusBin();closeStatusLight();}	}
}

项目完结

#define  OPEN  1
#define  CLOSE 0char flag=0;void TIM2_Delay_us(uint16_t n_us)
{/* 使能定时器2计数 */__HAL_TIM_ENABLE(&htim2);__HAL_TIM_SetCounter(&htim2, 0);while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );/* 关闭定时器2计数 */__HAL_TIM_DISABLE(&htim2);
}double getDistance()
{int time=0;//1. Trig ,给Trig端口至少10us的高电平HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);TIM2_Delay_us(20);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);//2.2. echo由低电平跳转到高电平,表示开始发送波while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_RESET);//3.波发出去的那一下,开始启动定时器HAL_TIM_Base_Start(&htim2);__HAL_TIM_SetCounter(&htim2,0);//让定时器从0开始数数//4. 由高电平跳转回低电平,表示波回来了while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7)==GPIO_PIN_SET);//5.波回来的那一下,我们开始停止定时器HAL_TIM_Base_Stop(&htim2);//6. 计算出中间经过多少时间time=__HAL_TIM_GetCounter(&htim2);//7.距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)return (340*time*0.000001/2*100);
}void openStatusLight()
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
}void closeStatusLight()
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}void initSg90_0()
{HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);
}void  beepDusBin()
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);HAL_Delay(100);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
}void openDusBin()
{if(flag==CLOSE){		flag=OPEN;__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 15);beepDusBin();}HAL_Delay(2000);
}void closeDusBin()
{__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_3, 5);flag=CLOSE;HAL_Delay(150);
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin==GPIO_PIN_0||GPIO_Pin==GPIO_PIN_5){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET||HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)==GPIO_PIN_RESET){openStatusLight();openDusBin();}	}			
}int main(void)
{double distance=0;HAL_NVIC_SetPriority(SysTick_IRQn,0,0);initSg90_0();while (1){distance=getDistance();if(distance<10){openDusBin();openStatusLight();}	else{closeDusBin();closeStatusLight();}	}
}

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

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

相关文章

算法面试八股文『 基础知识篇 』

博客介绍 近期在准备算法面试&#xff0c;网上信息杂乱不规整&#xff0c;出于强迫症就自己整理了算法面试常出现的考题。独乐乐不如众乐乐&#xff0c;与其奖励自己&#xff0c;不如大家一起嗨。以下整理的内容可能有不足之处&#xff0c;欢迎大佬一起讨论。 PS&#xff1a;…

Redis常见问题

击穿 概念&#xff1a;在Redis获取某一key时, 由于key不存在, 而必须向DB发起一次请求的行为, 称为“Redis击穿”。 引发击穿的原因&#xff1a; 第一次访问恶意访问不存在的keyKey过期 合理的规避方案&#xff1a; 服务器启动时, 提前写入规范key的命名, 通过中间件拦截对…

Flask介绍和优势

Flask诞生于2010年&#xff0c;是由Armin Ronacher用Python语言编写的一款轻量级Web开发框架。自发布以来&#xff0c;Flask逐渐成为开发人员喜爱的选择&#xff0c;并在2021年5月发布了Flask 2.0版本&#xff0c;引入了一些新增特性&#xff0c;如基本的异步支持。 使用Flask…

Kotlin:用源码来深入理解 ‘StateFlow和SharedFlow的区别和联系‘

Kotlin&#xff1a;用源码来深入理解 ‘StateFlow和SharedFlow的区别和联系’ 在这篇文章中&#xff0c;我们将深入研究Kotlin中的StateFlow和SharedFlow&#xff0c;以及它们的相似之处和不同之处。我们将通过查看它们的源代码来理解它们的工作原理&#xff0c;这将帮助我们更…

【五】【C++】类与对象(三)

const只读 在 C 中&#xff0c;const 关键字用于声明一个变量为常量&#xff0c;意味着一旦被初始化之后&#xff0c;它的值就不能被改变。 声明常量&#xff1a; 使用 const 关键字可以声明变量为常量。这意味着这个变量的值不能被修改。 const int MAX_SIZE 100; 指针与…

2024.1.31 寒假训练记录(14)

文章目录 CF 1918C XOR-distanceCF 1918D Blocking ElementsCF 1918E ace5 and Task Order CF 1918C XOR-distance 题目链接 这题出思路还挺快的&#xff0c;就是考虑二进制每一位的贡献&#xff0c;可惜写了个假的贪心 正确贪心是&#xff0c;考虑两种情况&#xff0c;第一…

Quartus生成烧录到FPGA板载Flash的jic文件

简要说明&#xff1a; Altera的FPGA芯片有两种基本分类&#xff0c;一类是纯FPGA&#xff0c;另一类是FPGASoc&#xff08;System on chip)&#xff0c;也就是FPGAHPS&#xff08;Hard Processor System&#xff0c;硬核处理器&#xff09;&#xff0c;对应两种Flash烧录方式&a…

【HTML】自定义属性(data)

自定义属性 data: 的用法&#xff08;如何设置,如何获取) &#xff0c;有何优势&#xff1f; data-* 的值的获取和设置&#xff0c;2种方法: 传统方法 getAttribute() 获取 data- 属性值; setAttribute() 设置 data- 属性值getAttribute() 获取 data- 属性值; setAttribute()…

什么是自动化测试分层?3个层次从高到低又是哪些?

自动化测试分层&#xff0c;可以理解为将测试任务分解为多个层次&#xff0c;并在每个层次中定义特定的测试任务和测试范围&#xff0c;通过这种方式&#xff0c;测试人员可以更好地管理和组织测试工作&#xff0c;确保测试的全面性和准确性。 自动化测试可以分解为3个层次&am…

@ControllerAdvice(实现全局异常、全局参数、请求参数预处理)

近期看到了ControllerAdvice这个注解&#xff0c;本身只是为了看下全局异常处理的&#xff0c;简单了解后发现可以分别与ExceptionHandler、ModelAttribute、InitBinder实现 全局异常、全局参数、请求参数预处理 的功能。 目录 一、全局异常处理二、全局参数处理三、请求参数预…

LPC804开发(11.ADC使用)

1.前言 刚刚研究ADC的时候发现芯片里面还有应该mrt 16位的定时器没有搞&#xff0c;那回头补上吧。下午研究了一下ADC的使用&#xff0c;我也只是能用上&#xff0c;这里我只是抛砖引玉一下吧&#xff0c;有需要的还请各位自行深入探究&#xff0c;我这里讲解的是软件触发模式…

一部分cpp的新特性:左右值的深入理解、函数返回引用报错详解以及在此过程中涉及到的指针和引用的部分区别和一点点关于std::array的简单介绍

目录 写在前面 explicit 关键字 左值&#xff08;left value&#xff09;和右值&#xff08;left value&#xff09; 引用类型作为函数的返回值 std::array 总结 致谢 写在前面 昨天博主完成了cpp基础的学习的最后一部分&#xff0c;cpp新特性&#xff0c;今天开始来逐一…

AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)

Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期&#xff08;待优化&#xff09;2.3.5 实测 3.总结 1.简…

Unity SRP 管线【第九讲:URP 点光源与聚光灯】

文章目录 CPU数据搜集GPU数据使用光照计算 CPU数据搜集 我们只能支持有限数量的其他灯。并将这些灯光数据&#xff08;位置、颜色、阴影强度、方向光光源、灯光遮蔽Probe、灯光层级Mask&#xff09;发送到GPU以供场景中所有物体渲染使用。 //ForwardLights.cs 额外光源数量与…

字符串string详细使用(计算机考研复试上机知识点)

字符串去重&#xff1a; 字符串去重 #include <bits/stdc.h> using namespace std;int main() { a"11322";sort(a.begin(),a.end());a.erase(unique(a.begin(),a.end()),a.end());cout<<a<<endl;return 0; } //unique函数返回没有重复区间的区间…

uniform initialization(一致化初始化)

目录 std::initializer_list 和 std::array std::initializer_list 的作用&#xff1a; std::array 的作用&#xff1a; std::initializer_list 和 std::array 使用联系 标准库里面的initializer_list 使用 vector std::initializer_list 和 std::array std::initializer_…

RabbitMQ实战指南(二)—— 基本概念

RabbitMQ实战指南&#xff08;二&#xff09;—— 基本概念 RabbitMQ是一个开源的消息中间件&#xff0c;用于在应用程序之间进行可靠的消息传递。它遵循AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;支持多种编程语言和平台。 下面是RabbitMQ的基本概念&…

qt内存自动释放的两种情况

qt内存管理机制 QObject的parent 我们时常能看到QWidget或者其他的控件的构造函数中有一项参数parent&#xff0c;默认值都为NULL&#xff0c;例如&#xff1a; QLineEdit(const QString &contents, QWidget *parent nullptr); QWidget(QWidget *parent nullptr, Qt::…

vue3学习——初始化项目及配置

初始化项目 环境 node 16pnpm 8.0.0 命令 pnpm create vite进行以下选择 &#x1f447; – 项目名 – VUe – Ts – cd/目录 – pnpm run dev 浏览器自动打开 package.json 配置eslint 安装依赖包 pnpm i eslint -D npx eslint --init // 生成配置文件进行以下选择 &a…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初&#xff0c;学习状态回顾 开稿时间&#xff1a;2024-1-23 归家百里去&#xff0c;飘雪送客迟。 搁笔日又久&#xff0c;一顾迷惘时。 我们饱含着过去的习惯&#xff0c;缺乏自我意识是毒药&#xff0c;反思和回顾是解药。 文章目录 2024年初&#xff0c;学习状态回顾一…