51单片机应用开发(进阶)---定时器应用(电子时钟)

实现目标

1、巩固定时器的配置流程;

2、掌握按键、数码管与定时器配合使用;

3、功能1:(1)简单显示时间。显示格式:88-88-88(时-分-秒)

4、功能2:(1)K1功能键,按下按键选中时分秒进行调节;(2)K2:数值+1;(3)K3:数值-1;(4)K4:确认键,设置数值后按下确认,开始走时;(5)显示格式:88-88-88(时-分-秒)

5、功能3:(1)上面功能上,轮流显示年月日


一、电子时钟

        电子时钟是一种使用电子技术来显示当前时间的设备。与传统的机械时钟不同,电子时钟通过电子电路和显示器来展示时间,通常具有更高的准确性和更多的功能。以下是关于电子时钟的简介:

1.1 基本结构

  1. 显示器:电子时钟的核心部分,用于显示时间。常见的显示器类型包括液晶显示屏(LCD)、发光二极管显示屏(LED)以及近年来逐渐兴起的有机发光二极管显示屏(OLED)。
  2. 电子电路:负责时间的计算、存储与显示。电子电路可以由模拟电路或数字电路构成,现代电子时钟多采用微处理器控制的数字电路。
  3. 电源:为电子时钟提供工作所需的电能。常见的电源类型包括电池、交流电源或两者的结合。

1.2 主要功能

  1. 时间显示:电子时钟可以准确显示当前的时间,包括小时、分钟和秒。
  2. 日期和星期显示:许多电子时钟还具备显示当前日期和星期的功能。
  3. 定时功能:可以设置闹钟或提醒功能,以便在特定时间发出声音或光信号。
  4. 其他功能:如温度显示、湿度显示、计时器、倒计时等附加功能,使电子时钟更加实用。

1.3 种类与特点

  1. 数字电子时钟:以数字形式显示时间,具有简洁明了的特点。数字电子时钟通常采用LED或LCD显示屏,易于读取且耗电量低。
  2. 模拟电子时钟:通过指针和表盘来模拟传统机械时钟的显示方式。模拟电子时钟通常具有更高的装饰性,适合追求复古或经典风格的用户。
  3. 智能电子时钟:结合了智能技术,如Wi-Fi连接、语音识别等,可以实现更多高级功能,如天气预报、音乐播放、智能家居控制等。智能电子时钟通常与智能手机或其他智能设备配合使用,提供更加个性化的用户体验。

1.4 技术原理

        电子时钟的工作原理主要基于晶体振荡器产生的稳定频率信号。这个信号经过分频、计数等处理后,可以得到精确的时间信息。微处理器或专用的时间控制芯片会根据这些信息来控制显示器的显示内容,从而实现时间的准确显示。

1.5应用领域

        电子时钟广泛应用于各个领域,包括家庭、办公室、公共场所等。由于其准确度高、功能丰富且易于携带,电子时钟已成为现代生活中不可或缺的时间测量工具。

二、原理图设计

  

三、程序设计

3.1  基本程序(不带按键功能)

#include <REGX52.H>
 
//定义数码管位选信号控制脚
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
 
sbit K1 = P3^1;//按键K1
sbit K2 = P3^0;//按键K2
 
char  H   = 22; //时计数
char  M   = 58; //分计数
char  S   = 45; //秒计数
 
//共阴极数码管显示0~F的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
 
void delay_10us(int ten_us)
{
	while(ten_us--);	
}

 
unsigned int g_Count;  //全局变量默认初始化为0
 
void Timer1_Init(void)
{
    TMOD = 0x10; //设置定时器1 工作模式1   0001 0000  
    TR1 = 1;     //开启定时器1
    TH1 = (65536-1000)/256;  //设置定时初值,高8位
    TL1 = (65536-1000)%256;  //设置定时初值,低8位
    ET1 = 1;  //开启定时器1 中断
	EA  = 1;  //开启总中断
}
 
void main(void)
{
	Timer1_Init();  //定时器1初始化
	while(1)
	{
	   	LSC=1;LSB=1;LSA=1;
		P0 = gsmg_code[H/10];
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=1;LSB=1;LSA=0;
		P0 = gsmg_code[H%10];		
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=1;LSB=0;LSA=1;
		P0 = gsmg_code[16];
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=1;LSB=0;LSA=0;
		P0 = gsmg_code[M/10];		
		delay_10us(5);
		P0 = 0x00;//消影	

		LSC=0;LSB=1;LSA=1;
		P0 = gsmg_code[M%10];
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=0;LSB=1;LSA=0;
		P0 = gsmg_code[16];
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=0;LSB=0;LSA=1;
		P0 = gsmg_code[S/10];		
		delay_10us(5);
		P0 = 0x00;//消影	

		LSC=0;LSB=0;LSA=0;
		P0 = gsmg_code[S%10];
		delay_10us(5);
		P0 = 0x00;//消影		
	}
}
 
void Timer1_Rountine(void) interrupt 3  //1ms进一次中断
{
    TH1 = (65536-1000)/256;  //
    TL1 = (65536-1000)%256;  //重新赋初值才能保证下一次还是1ms
	  
    g_Count++;
    if(g_Count>=1000)  // 1S 计时
	{
		g_Count = 0;   //计数清零
		S++;
		if(S > 59)//1Min
		{
			S = 0;
			M++;
			if(M > 59)//1H
			{
				M = 0;
				H++;
			   if(H > 23)//1H
			   {
					H = 0;				
			   }
			}
		}	
	}
}



3.2  带按键调值功能程序

#include <REGX52.H>
 
//定义数码管位选信号控制脚
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
 
sbit K1 = P3^1;//按键K1
sbit K2 = P3^0;//按键K2
sbit K3 = P3^2;//按键K3
sbit K4 = P3^3;//按键K4
 
char  H   = 22; //时计数
char  M   = 58; //分计数
char  S   = 45; //秒计数
 
char  mode = 0; //模式 
 
//共阴极数码管显示0~F的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
 
void delay_10us(int ten_us)
{
	while(ten_us--);	
}
 
 
unsigned int g_Count;  //全局变量默认初始化为0
 
void Timer1_Init(void)
{
    TMOD = 0x10; //设置定时器1 工作模式1   0001 0000  
    TR1 = 1;     //开启定时器1
    TH1 = (65536-1000)/256;  //设置定时初值,高8位
    TL1 = (65536-1000)%256;  //设置定时初值,低8位
    ET1 = 1;  //开启定时器1 中断
	EA  = 1;  //开启总中断
}
 
void main(void)
{
	Timer1_Init();  //定时器1初始化
	while(1)
	{
	   	LSC=1;LSB=1;LSA=1;
		P0 = gsmg_code[H/10];
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=1;LSB=1;LSA=0;
		P0 = gsmg_code[H%10];		
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=1;LSB=0;LSA=1;
		P0 = gsmg_code[16];
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=1;LSB=0;LSA=0;
		P0 = gsmg_code[M/10];		
		delay_10us(5);
		P0 = 0x00;//消影	
 
		LSC=0;LSB=1;LSA=1;
		P0 = gsmg_code[M%10];
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=0;LSB=1;LSA=0;
		P0 = gsmg_code[16];
		delay_10us(5);
		P0 = 0x00;//消影
		
	   	LSC=0;LSB=0;LSA=1;
		P0 = gsmg_code[S/10];		
		delay_10us(5);
		P0 = 0x00;//消影	
 
		LSC=0;LSB=0;LSA=0;
		P0 = gsmg_code[S%10];
		delay_10us(5);
		P0 = 0x00;//消影	


		if(K1 == 0)//如果按键K1按下
		{
			while(!K1);//松手检测
		    TR1 = 0;
			mode++;
			if(mode >3)
				mode = 1;
		}
		if(K4 == 0)//如果按键K4按下
		{
			while(!K4);//松手检测
            TR1 = 1; 
			mode = 0;
		}		
		
		if(K2 == 0)//如果按键K2按下
		{
			while(!K2);//松手检测
			switch (mode)
			{
				case 1:
					H++;
				    if(H > 23)
			        {
					   H = 0;				
			        }
					break;
				case 2:
					M++;
				    if(M > 59)
			        {
					   M = 0;				
			        }					
					break;
				case 3:
					S++;
				    if(S > 59)
			        {
					   S = 0;				
			        }										
					break;
			}
		}
		if(K3 == 0)//如果按键K2按下
		{
			while(!K3);//松手检测
			switch (mode)
			{
				case 1:
					H--;
				    if(H < 0)
			        {
					   H = 23;				
			        }
					break;
				case 2:
					M--;
				    if(M < 0)
			        {
					   M = 59;				
			        }					
					break;
				case 3:
					S--;
				    if(S < 0)
			        {
					   S = 59;				
			        }										
					break;
			}
		}
	}
}
 
void Timer1_Rountine(void) interrupt 3  //1ms进一次中断
{
    TH1 = (65536-1000)/256;  //
    TL1 = (65536-1000)%256;  //重新赋初值才能保证下一次还是1ms
	  
    g_Count++;
    if(g_Count>=1000)  // 1S 计时
	{
		g_Count = 0;   //计数清零
		S++;
		if(S > 59)//1Min
		{
			S = 0;
			M++;
			if(M > 59)//1H
			{
				M = 0;
				H++;
			   if(H > 23)//1H
			   {
					H = 0;				
			   }
			}
		}	
	}
}
 
 
 

3.3  轮换显示年月日功能程序

#include <REGX52.H>
 
//定义数码管位选信号控制脚
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
 
sbit K1 = P3^1;//按键K1
sbit K2 = P3^0;//按键K2
sbit K3 = P3^2;//按键K3
sbit K4 = P3^3;//按键K4
 
char  H   = 22; //时计数
char  M   = 58; //分计数
char  S   = 45; //秒计数
 
char  mode = 0; //模式 
bit   Display_falg = 0; //显示标志位
char  S1   = 0; //秒计数
char  S2   = 0; //秒计数
//共阴极数码管显示0~F的段码数据
unsigned char gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
				0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
 
void delay_10us(int ten_us)
{
	while(ten_us--);	
}
 
 
unsigned int g_Count;  //全局变量默认初始化为0
 
void Timer1_Init(void)
{
    TMOD = 0x10; //设置定时器1 工作模式1   0001 0000  
    TR1 = 1;     //开启定时器1
    TH1 = (65536-1000)/256;  //设置定时初值,高8位
    TL1 = (65536-1000)%256;  //设置定时初值,低8位
    ET1 = 1;  //开启定时器1 中断
	EA  = 1;  //开启总中断
}
 
void main(void)
{
	Timer1_Init();  //定时器1初始化
	while(1)
	{
        if (Display_falg == 1)
        {
			LSC=1;LSB=1;LSA=1;
			P0 = gsmg_code[2];
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=1;LSB=1;LSA=0;
			P0 = gsmg_code[4];		
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=1;LSB=0;LSA=1;
			P0 = gsmg_code[16];
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=1;LSB=0;LSA=0;
			P0 = gsmg_code[1];		
			delay_10us(5);
			P0 = 0x00;//消影	
	 
			LSC=0;LSB=1;LSA=1;
			P0 = gsmg_code[1];
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=0;LSB=1;LSA=0;
			P0 = gsmg_code[16];
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=0;LSB=0;LSA=1;
			P0 = gsmg_code[0];		
			delay_10us(5);
			P0 = 0x00;//消影	
	 
			LSC=0;LSB=0;LSA=0;
			P0 = gsmg_code[8];
			delay_10us(5);
			P0 = 0x00;//消影		
			
		}
		else
		{
			LSC=1;LSB=1;LSA=1;
			P0 = gsmg_code[H/10];
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=1;LSB=1;LSA=0;
			P0 = gsmg_code[H%10];		
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=1;LSB=0;LSA=1;
			P0 = gsmg_code[16];
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=1;LSB=0;LSA=0;
			P0 = gsmg_code[M/10];		
			delay_10us(5);
			P0 = 0x00;//消影	
	 
			LSC=0;LSB=1;LSA=1;
			P0 = gsmg_code[M%10];
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=0;LSB=1;LSA=0;
			P0 = gsmg_code[16];
			delay_10us(5);
			P0 = 0x00;//消影
			
			LSC=0;LSB=0;LSA=1;
			P0 = gsmg_code[S/10];		
			delay_10us(5);
			P0 = 0x00;//消影	
	 
			LSC=0;LSB=0;LSA=0;
			P0 = gsmg_code[S%10];
			delay_10us(5);
			P0 = 0x00;//消影		
		}

		if(K1 == 0)//如果按键K1按下
		{
			while(!K1);//松手检测
		    TR1 = 0;
			mode++;
			if(mode >3)
				mode = 1;
		}
		if(K4 == 0)//如果按键K4按下
		{
			while(!K4);//松手检测
            TR1 = 1; 
			mode = 0;
		}		
		
		if(K2 == 0)//如果按键K2按下
		{
			while(!K2);//松手检测
			switch (mode)
			{
				case 1:
					H++;
				    if(H > 23)
			        {
					   H = 0;				
			        }
					break;
				case 2:
					M++;
				    if(M > 59)
			        {
					   M = 0;				
			        }					
					break;
				case 3:
					S++;
				    if(S > 59)
			        {
					   S = 0;				
			        }										
					break;
			}
		}
		if(K3 == 0)//如果按键K2按下
		{
			while(!K3);//松手检测
			switch (mode)
			{
				case 1:
					H--;
				    if(H < 0)
			        {
					   H = 23;				
			        }
					break;
				case 2:
					M--;
				    if(M < 0)
			        {
					   M = 59;				
			        }					
					break;
				case 3:
					S--;
				    if(S < 0)
			        {
					   S = 59;				
			        }										
					break;
			}
		}
	}
}
 
void Timer1_Rountine(void) interrupt 3  //1ms进一次中断
{
    TH1 = (65536-1000)/256;  //
    TL1 = (65536-1000)%256;  //重新赋初值才能保证下一次还是1ms
	  
    g_Count++;
    if(g_Count>=1000)  // 1S 计时
	{
		g_Count = 0;   //计数清零
		S++;
		if(++S1 == 5)
		{
			S1 = 0;
			Display_falg = 1;
		}
		if(Display_falg == 1)
		{
			if(++S2 == 2)
			{
				S2 = 0;
				Display_falg = 0;
			}
		}		
		if(S > 59)//1Min
		{
			S = 0;
			M++;
			if(M > 59)//1H
			{
				M = 0;
				H++;
			   if(H > 23)//1H
			   {
					H = 0;				
			   }
			}
		}	
	}
}
 
 
 

四、实验效果

五、仿真实现


总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【外包】软件行业的原始形态,项目外包与独立开发者

【外包】互联网软件行业的原始形态&#xff0c;项目外包与独立开发者 本科期间写的一些东西&#xff0c;最近整理东西看到了&#xff0c;大致整理一下放出来&#xff0c;部分内容来自其他文章&#xff0c;均已引用。 文章目录 1、互联网软件行业的原始形态2、项目订单&#xff…

Python酷库之旅-第三方库Pandas(208)

目录 一、用法精讲 971、pandas.MultiIndex.set_levels方法 971-1、语法 971-2、参数 971-3、功能 971-4、返回值 971-5、说明 971-6、用法 971-6-1、数据准备 971-6-2、代码示例 971-6-3、结果输出 972、pandas.MultiIndex.from_arrays类方法 972-1、语法 972-2…

基于ConvNeXt的矿石种类识别

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

C++入门基础知识140—【关于C++ 类构造函数 析构函数】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 类构造函数 & 析构函数的相关内容…

【Linux】-学习笔记03

第十一章-管理Linux软件包和进程 1.源码下载安装软件 1.1概念 源码文件&#xff1a;程序编写者使用C或C等语言编写的原始代码文本文件 源码文件使用.tar.gz或.tar.bz2打包成压缩文件 1.2特点 源码包可移植性好&#xff0c;与待安装软件的工作环境依赖性不大 由于有编译过程…

鸿蒙HarmonyOS(ArkUI基础篇大合集!)

文章目录 ArkUI&#xff08;方舟UI框架&#xff09;1.简介2.基本概念3.概述4.布局1.概述2.通用布局属性&#x1f388;1.盒子属性2.背景属性3.定位属性4.通用属性&#x1f388; 3.线性布局4.弹性布局(Flex)5.层叠布局(Stack) 5.组件1.使用文本1.文本显示(Text/Span)2.文本输入 (…

Prompt 工程

Prompt 工程 1. Prompt 工程简介 “预训练-提示预测”范式是近年来自然语言处理&#xff08;NLP&#xff09;领域的一个重要趋势&#xff0c;它与传统的“预训练-微调-预测”范式相比&#xff0c;提供了一种更为灵活和高效的模型应用方式。 Prompt工程是指在预训练的大型语言…

十天入门javaScript第四天(Promises对象异步 )(睡眠函数) (json)

Promise 是一个 JavaScript 的内置对象&#xff0c;它代表了一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。Promise 对象是异步编程的一种解决方案&#xff0c;它可以使异步操作以更简洁、更易于管理的方式进行。 Promise 对象有三个状态&#xff1a; Pen…

【C#设计模式(8)——过滤器模式(Adapter Pattern)】

前言 滤液器模式可以很方便地实现对一个列表中的元素进行过滤的功能&#xff0c;能方便地修改滤器的现实&#xff0c;符合开闭原则。 代码 //过滤接口public interface IFilter{List<RefuseSorting> Filter(List<RefuseSorting> refuseList);}//垃圾分类public cla…

开源共建 | 长安链开发常见问题及规避

长安链开源社区鼓励社区成员参与社区共建&#xff0c;参与形式包括不限于代码贡献、文章撰写、社区答疑等。腾讯云区块链王燕飞在参与长安链测试工作过程中&#xff0c;深入细致地总结了长安链实际开发应用中的常见问题及其有效的规避方法&#xff0c;相关内容多次解答社区成员…

华为云创建ECS前台展示规格类型选项是怎么做到的?

前台展示很多规格可选&#xff0c;怎么做到的&#xff1f;先了解规格其实都是管理员在后台service_OM创建好规格 1.规格 1.1设置自定义标签打通规格和主机组还能体验调度功能 引申&#xff1a;AZ可用分区&#xff08;为了做容灾&#xff09; 为什么在界面可以让我√az0.dc0,…

Linux网络——自定义协议与序列化

一、协议 协议是一种 " 约定 ". socket api 的接口 , 在读写数据时 , 都是按 " 字符串 " 的方式来发送接收的。如 果我们要传输一些 " 结构化的数据 "&#xff0c;依然可以通过协议。 其实&#xff0c;协议就是双方约定好的结构化的数据。…

《TCP/IP网络编程》学习笔记 | Chapter 6:基于UDP的服务器端/客户端

《TCP/IP网络编程》学习笔记 | Chapter 6&#xff1a;基于UDP的服务器端/客户端 《TCP/IP网络编程》学习笔记 | Chapter 6&#xff1a;基于UDP的服务器端/客户端理解UDPUDP套接字的特点UDP内部工作原理UDP的高效使用 实现基于UDP的服务器端/客户端UDP中的服务器端和客户端没有连…

Linux也有百度云喔~

一、写在前面 经常有粉丝向我抱怨&#xff0c;为什么每次发放资料都用百度云&#xff0c;自己下载了一遍之后还得再上传一遍服务器才能分析。其实大家大可不必这么周转&#xff0c;百度云也有Linux的发行版本&#xff0c;利用python包bypy来管理/传输百度云盘资源也很方便(别问…

从0开始机器学习--Day23--支持向量机

经过前面的学习&#xff0c;我们已经知道在解决问题时&#xff0c;重要的不仅仅是要在算法A或算法B中选择更优的&#xff0c;而是考虑怎么选择用于学习算法的特征和正则化参数&#xff0c;相比神经网络和逻辑回归&#xff0c;支持向量机在这两个方面做得更好。 优化目标(Optimi…

JavaScript 中实例化生成对象的相关探讨

JavaScript 中实例化生成对象的相关探讨 在 JavaScript 世界中&#xff0c;对象的实例化是一个关键且基础的概念。当我们使用构造函数创建对象时&#xff0c;会引发一系列关于对象之间联系、原型链以及相关概念的思考。 让我们通过一段代码来深入探讨这些问题&#xff1a; f…

MatSci-LLM ——潜力和挑战以及大规模语言模型在材料科学中的应用

概述 大规模语言模型的出现正在从根本上改变技术开发和研究的方式。大规模语言模型不仅对自然语言处理领域产生了重大影响&#xff0c;而且对许多相关领域也产生了重大影响&#xff0c;例如从文本生成图像的计算机视觉&#xff08;Zhang 等人&#xff0c;2023 年&#xff09;。…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C 个人主页&#xff1a;Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

Linux(光速安装+ubuntu镜像 serve live-serve desktop)

ubuntu镜像_ubuntu下载地址_ubuntu安装教程-阿里巴巴开源镜像站 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 清华大学的镜像好一点速度比较快&#xff01; 下载镜像 都是推荐使用服务器版&#xff0c;桌面版一般自己用 amd64 就…

Linux命令详解,全网最详细,看这一篇就够了

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…