stm32入门-----EXTI外部中断(下——实践篇)
目录
前言
一、硬件介绍
1.对射红外线传感器
2.旋转编码器
二、EXTI外部中断C编程
1.开启RCC时钟
2.配置GPIOK口初始化
3.配置AFIO
4.配置EXIT
5.配置NVIC
三、EXIT外部中断项目实操
1.对射红外传感器计数
2.选择编码器计数
前言
本期接着上一期的内容继续学习stm32的外部中断系统(上一期链接:stm32入门-----EXTI外部中断(上 ——理论篇)-CSDN博客)。本期的主要是进行实践操作stm32的外部中断,分为两个部分:红外线传感器进行计数和转动旋转编码器进行计数。(视频:[5-2] 对射式红外传感器计次&旋转编码器计次_哔哩哔哩_bilibili)
一、硬件介绍
1.对射红外线传感器
工作电压:3.3V-5V
输出形式:数字开关量D0输出(0 和 1),模拟输出A0引脚无效使用方式: 接好VCC和GND,模块电源指示灯会亮,模块槽中无遮挡时,接收管导通,模块DO输出低电平,开关指示灯亮;遮挡时,DO输出高电平,开关指示灯灭。模块DO可与继电器相连,组成限位开关等功能,也可以与有源蜂鸣器模块相连,组成报警器。DO输出接口可以与单片机I0口直接相连,一般接外部中断,检测传感器是否有遮档,如用电机码盘则可检测电机的转速。


硬件电路:
2.旋转编码器
- 旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向
- 类型:机械触点式/霍尔传感器式/光栅式

硬件电路:
这里可以看到旋转编码器有两个输出口分别是A和B口,当没有进行旋转的时候此时两个输出口都会被拉升为高电平,当逆时针转动的时候A口的电路与GND导通,此时A口拉倒低电平,输出为低电平,但B处不变,顺时针就刚好反过来。(想了解详细可查看:江协科技STM32——旋转编码器计次(软件消抖)_旋转编码器消抖-CSDN博客)
二、EXTI外部中断C编程
我们可以用C语言的库函数来取调用这些外部中断,实际上只需要按照上一期理论的知识去进行相关的初始化设置就行了。大体上分为5步。
EXIT外部中断结构图:

1.开启RCC时钟
设置时钟包括GPIO口的时钟和AFIO的时钟,GPIO的时钟我们前面学习GPIO口的时候就已经学习过了,如果没有去指定开启GPIO的时钟,那么这个GPIO口是无法使用的。同样的AFIO的时钟如果不开的话也是无法使用的。
对于EXIT外部中断,这两个时钟都要开启,GPIO是作为输入口,二AFIO是作为中断引脚的选择口。这里我们就使用APB2外设的时钟
示例如下:
// 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2.配置GPIOK口初始化
这个的我们之前就已经学习过了,这里就不多讲了,不过要注意的是配置GPIOK口的工作方式最好选择上拉输入或者下拉输入或者浮空输入,以保证输入的电平是保持稳定的,当且仅当外部硬件输入变化才产生变化。
示例如下:
//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU;//选择上拉输入GPIO_initstruct.GPIO_Pin=GPIO_Pin_14; //选用14号引脚GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct); //GPIOB口初始化
3.配置AFIO
这里要用到void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)这个函数,这个函数是用来去配置AFIO,不过这个函数的名称连AFIO都没出现反而出现了EXIT,我觉得也挺奇怪的,但是这个函数的内部是实际对AFIO进行操作的。
AFIO配置GPIO线路关系图如下:

相关定义如下:

示例如下:
//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14); //AFIO打到GPIOB处的14号引脚
4.配置EXIT
配置EXIT包括配置工作方式(中断模式还是事件模式)、触发方式、以及配置外部中断的中断线路,上面我们配置好了AFIO与GPIO之间的线路,这里我们只需要去配置AFIO与EXIT之间的线路就行了。如下图所示:

下图是EXIT在C语言中的结构体定义:

代码的写法跟配置GPIO口的基本上是一模一样的,示例如下:
//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;//定义EXIT结构体EXTI_initstruct.EXTI_Line=EXTI_Line14;//选择中断线,这里选择外部中断14号线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用,进行使能操作,这里是设置ENABLE,进行使能EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式,这里选择中断模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等,这里选择下降沿触发EXTI_Init(&EXTI_initstruct);//初始化
5.配置NVIC
配置NVIC包括配置优先级(抢占优先级和响应优先级)、EXIT通道(也就是NVIC与上面配置好的EXIT之间的通道)、分组情况。
NVIC是分为5组的,不同的分组指定的抢占优先级和响应优先级的个数是不同的,分组配置的注释如下:

代码示例如下:
//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;//定义结构体NVIC_initstruct.NVIC_IRQChannel= EXTI15_10_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);//初始化
三、EXIT外部中断项目实操
1.对射红外传感器计数
先看现象:
对射红外传感器计数
硬件连线图:

工程文件:
可以看到我们要编写的是下图两个箭头指向的文件,然后将结果在OLED显示屏上显示出来。

C编程代码如下
Countsensor.c代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"
uint16_t count;//初始化
void Countsensor_init(){// 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_initstruct.GPIO_Pin=GPIO_Pin_14;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14); //AFIO打到GPIOB处的14号引脚//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;//定义EXIT结构体EXTI_initstruct.EXTI_Line=EXTI_Line14;//选择中断线,这里选择外部中断14号线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用,进行使能操作EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式,这里选择中断模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等,这里选择下降沿触发EXTI_Init(&EXTI_initstruct);//初始化//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;//定义结构体NVIC_initstruct.NVIC_IRQChannel= EXTI15_10_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);//初始化}//返回count的值
uint16_t count_get()
{return count;
}
//中断函数,其函数的名字是固定的,参数为空
void EXTI15_10_IRQHandler(){//中断标志位判断,这个中断是EXTI 10~15的,我们要的是EXTI14的,所以要去判断一下是不是当前需要的中断if(EXTI_GetITStatus(EXTI_Line14)==SET){ //判断,返回值为set就表示确定当前没有错误是执行这个if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==0)//消抖count++;//程序进入到中断的时候会产生中断标志位,强制进入中断//执行完成了之后要去清除中断的标志位,不然就会一直执行中断函数EXTI_ClearITPendingBit(EXTI_Line14);}}
Countsensor.h代码 :
#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_H
void Countsensor_init();
uint16_t count_get();#endif // !__COUNT_
main.c代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Countsensor.h"int main(void)
{ Countsensor_init();OLED_Init();OLED_ShowString(1,1,"count:");while(1){OLED_ShowNum(1,7,count_get(),4);Delay_ms(500);}
}
2.选择编码器计数
还是一样,我们先看现象:
选择编码器读取
电路连接图:

工程文件:

C语言代码如下
Encode.c代码
#include "stm32f10x.h"
int16_t count;
int16_t turn;//转动方向void Encode_init(){// 1.开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//2.配置GPIO口GPIO_InitTypeDef GPIO_initstruct;GPIO_initstruct.GPIO_Mode=GPIO_Mode_IPU; //默认设置为高电平GPIO_initstruct.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_0;GPIO_initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_initstruct);//3.配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//4.配置EXTIEXTI_InitTypeDef EXTI_initstruct;EXTI_initstruct.EXTI_Line=EXTI_Line1 | EXTI_Line0;//选择中断线EXTI_initstruct.EXTI_LineCmd=ENABLE;//设置上面选择好的中断线是否使用EXTI_initstruct.EXTI_Mode=EXTI_Mode_Interrupt;//配置模式,中断模式还是事件模式EXTI_initstruct.EXTI_Trigger=EXTI_Trigger_Falling;//选择触发方式,上升沿触发还是下降沿触发等等EXTI_Init(&EXTI_initstruct);//初始化//5.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置分组,可放到主函数去分NVIC_InitTypeDef NVIC_initstruct;NVIC_initstruct.NVIC_IRQChannel= EXTI0_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=1;//设置响应优先级NVIC_Init(&NVIC_initstruct);NVIC_initstruct.NVIC_IRQChannel= EXTI1_IRQn ; //选择通道,EXTI通道EXTI15_10_IRQnNVIC_initstruct.NVIC_IRQChannelCmd=ENABLE;//指定上面通道是否开启,同理//由于当前只有一个中断,优先级可以根据当前分组随便设置,如果多个的话才涉及这个NVIC_initstruct.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级NVIC_initstruct.NVIC_IRQChannelSubPriority=2;//设置响应优先级NVIC_Init(&NVIC_initstruct);
}
//返回转动方向的值,0表示逆时针,1表示顺时针
int16_t Turn_get(){return turn;
}
//返回数值的变化值
int16_t Encode_get(){int16_t temp=count;count=0;return temp;
}void EXTI0_IRQHandler(){if(EXTI_GetITStatus(EXTI_Line0)==SET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0&&GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){count--;turn=0; //0表示逆时针旋转}EXTI_ClearITPendingBit(EXTI_Line0);}
}void EXTI1_IRQHandler(){if(EXTI_GetITStatus(EXTI_Line1)==SET){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0&&GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0){count++;turn=1; //1表示顺时针}EXTI_ClearITPendingBit(EXTI_Line1);}
}
Encode.h代码:
#ifndef __ENCODE_H
#define __ENCODE_H
void Encode_init();
int16_t Encode_get();
int16_t Turn_get();#endif // !__ENCODE_H
main.c代码:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encode.h"int16_t num;int main(void)
{ OLED_Init();Encode_init();OLED_ShowString(1,1,"time:");while(1){num+=Encode_get();OLED_ShowSignedNum(1,6,num,4);OLED_ShowSignedNum(2,1,Turn_get(),1);}
}
相关的问题可查看:问题详情 (jiangxiekeji.com)
以上就是本期的全部内容了,我们下次见!
今日壁纸:

相关文章:
stm32入门-----EXTI外部中断(下——实践篇)
目录 前言 一、硬件介绍 1.对射红外线传感器 2.旋转编码器 二、EXTI外部中断C编程 1.开启RCC时钟 2.配置GPIOK口初始化 3.配置AFIO 4.配置EXIT 5.配置NVIC 三、EXIT外部中断项目实操 1.对射红外传感器计数 2.选择编码器计数 前言 本期接着上一期的内容继续学习stm3…...
深度学习落地实战:基于UNet实现血管瘤超声图像分割
前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …...
Python进阶(4)--正则表达式
正则表达式 在Python中,正则表达式(Regular Expression,简称Regex)是一种强大的文本处理工具,它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前,还记得之前我们是通过什么方法分割…...
RCA连接器是什么?一文读懂
RCA连接器,也就是我们在电视机、DVD播放器、通讯设备、立体声设备和游戏设备后面常见的彩色插头,其历史可以追溯到近一个世纪以前。这种现今广泛使用的电缆接口,最初是由美国无线电公司(RCA)开发并命名的,在…...
【linux】服务器安装NVIDIA驱动
【linux】服务器安装NVIDIA驱动 【创作不易,求点赞关注收藏】😀 文章目录 【linux】服务器安装NVIDIA驱动一、关闭系统自带驱动nouveau二、下载英伟达驱动三、安装英伟达驱动1、禁用X服务器和相关进程2、在TTY终端安装驱动3、验证是否安装成功4、重新启…...
【达梦数据库】关于用户、模式、表空间等如何理解?
与MySQL的用户有所区别,MySQL是单实例多库,DM7以上版本是单库多实例架构, MySQL访问方式: 一个root访问多个库,访问前切换一下就ok 比如MySQL到DM的迁移是,MySQL的一个库对应dm中的一个表空间和一个用户。比…...
一篇就够mysql高阶知识总结
一、事务的ACID原则 序号原则说明1原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做2一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一…...
CTF-Web习题:[BJDCTF2020]ZJCTF,不过如此
题目链接:[BJDCTF2020]ZJCTF,不过如此 解题思路 访问靶场链接,出现的是一段php源码,接下来做一下代码审阅,发现这是一道涉及文件包含的题 主要PHP代码语义: file_get_contents($text,r); 把$text变量所…...
【IEEE出版】第四届能源工程与电力系统国际学术会议(EEPS 2024)
第四届能源工程与电力系统国际学术会议(EEPS 2024) 2024 4th International Conference on Energy Engineering and Power Systems 重要信息 大会官网:www.iceeps.com 大会时间:2024年8月9-11日 大会…...
浅谈Vue:text-align: center、align-items: center、justify-content: center三种居中的区别和用法
text-align: center、align-items: center 和 justify-content: center 是用于不同布局场景下的CSS属性。它们在水平和垂直居中元素方面有所不同,具体取决于你使用的布局模型(如块级元素、Flexbox、Grid)。以下是它们的区别和适用场景&#x…...
理解UI设计:UI设计师的未来发展机遇
UI设计师的出现是互联网时代的设计变革。随着移动互联网的快速发展,移动产品设计师非常短缺。高薪资让许多其他行业的设计师已经转向了UI设计。那么什么是UI设计呢?UI设计师负责什么?UI设计的发展趋势和就业前景如何?这些都是许多…...
关键字 internal
在C#中,internal 关键字是一个访问修饰符,它用于限制类型或类型成员的访问性。当一个类型(类、结构体、接口、枚举等)或类型成员(字段、属性、方法、事件等)被声明为 internal 时,它只能在同一程…...
C学习(数据结构)-->单链表习题
目录 一、环形链表 题一:环形链表 思路: 思考一:为什么? 思考二:快指针一次走3步、4步、......n步,能否相遇 step1: step2: 代码: 题二: 环形链表 I…...
MATLAB6:M文件和控制流
文章目录 一、实验目的二、实验内容三、仿真结果四、实践中遇到的问题及解决方法 一、实验目的 1. 熟悉运用MATLAB的控制指令。 2. 理解M脚本文件和函数文件的本质区别。 3. 能够运用所学知识,编制程序解决一般的计算问题。 二、实验内容 1.for循环结构及注…...
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术
网页数据抓取:融合BeautifulSoup和Scrapy的高级爬虫技术 在当今的大数据时代,网络爬虫技术已经成为获取信息的重要手段之一。Python凭借其强大的库支持,成为了进行网页数据抓取的首选语言。在众多的爬虫库中,BeautifulSoup和Scrap…...
Linux应用——网络基础
一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机; CS结构通常采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。 例如&…...
白骑士的C++教学实战项目篇 4.3 多线程网络服务器
系列目录 上一篇:白骑士的C教学实战项目篇 4.2 学生成绩管理系统 在这一节中,我们将实现一个多线程网络服务器项目,通过该项目,我们将学习套接字编程的基础知识以及如何使用多线程处理并发连接。此外,我们还将实现一个…...
Go语言并发编程-Context上下文
Context上下文 Context概述 Go 1.7 标准库引入 context,译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息,包括:取…...
React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk
目录 1,介绍举例 2,原理和实现实现 3,注意点 1,介绍 一般情况下,action 是一个平面对象,并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…...
【Qt】QTcpServer/QTcpSocket通信
这里写目录标题 1.pro文件2.服务器3.客户端 1.pro文件 QT network2.服务器 h文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> #include <QTcpSocket>QT_BEGIN_NAMESPACE namespace Ui { class MainW…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
