蓝桥杯电子类单片机提升三——NE555

目录

单片机资源数据包_2023

一、NE555和定时器工作模式

1.NE555的介绍

2.定时器的计数模式

二、NE555频率读取代码的实现

1.定时器0初始化

2.通过读取TH0和TL0来读取频率 

3.通过中断读取频率

三、完整代码演示

通过读取TH0和TL0来读取频率

main.c

通过中断读取频率

main.c


前言
关于蓝桥杯比赛时会提供的资料前几篇都有提到,这里就不在赘述了,只放一个下载链接:

单片机资源数据包_2023

除了基础部分的按键、LED灯,数码管扫描,还有温度传感器,AD/DA转化,EEPROM存储器,RTC之外,还有三个模块考试的时候可能会考,分别是超声波,NE555和串口。近几年的题也是越来越难,这三个模块也逐渐出现在了省赛的舞台上(当然如果进国赛了,这几个模块就都可能考了)。提升篇主要针对这三个模块进行介绍。

由于这三个模块比赛时不会提供底层代码,所以许多都需要咱们自己来完成,不同人写的代码,差异性可能会更大。此外这些代码会涉及到单片机运行的底层知识,关于单片机基础部分的内容,提升篇也会尽可能介绍一部分(当然如果你不会也没关系,文章会教你如何用stc生成或者查数据手册,就算不知道原理,小背一背也是能自己实现的)

一、NE555和定时器工作模式

这一章主要介绍一下NE555和单片机定时器有关的基础知识,当然,正如前边提到的,这些知识并不需要去背,在后面代码实现时,会教大家如何借助isp获取这些代码。

最近几年NE555也是和超声波一样,频繁出现在省赛考场上。

1.NE555的介绍

NE555是一款经典的集成电路,也被称为555定时器。555定时器在蓝桥杯板子上的主要作用是产生脉冲,让我们读取它的频率,真的是一个十分经典的集成电路,当然,蓝桥杯比赛不会考NE555该怎么连接电路,感兴趣的小伙伴可以自己查找一下555定时器的资料。

NE555由比较器、SR触发器和输出级组成。它通常有8个引脚,包括正电源引脚(VCC)、负电源引脚(GND)、控制电压引脚(CV)、复位引脚(RESET)、输出引脚(OUT)、触发引脚(TRIG)、非控制触发引脚(THRES)、控制电压引脚(DIS)。

NE555有三种工作模式,可以被设置为工作在单稳态(单触发)模式、多稳态模式或脉冲生成模式。它的工作稳定性高,可以通过改变电阻和电容的数值来调节脉冲宽度、周期和频率。同时,NE555还具有较高的输出驱动能力,可以直接驱动大功率装置。

NE555广泛应用于定时器、频率分频器、频率多倍器、脉冲宽度调制、脉冲位置调制、电压控制振荡器等各种电路中。它易于使用,功能强大,是电子爱好者和工程师常用的集成电路之一。

下图蓝桥杯原理图上的NE555电路:

我们只需要读取NET SIG引脚上电平的变化,我们可以通过P34引脚读取,因此在读取之前,我们需要使用跳线帽。将J13上的P34和NET SIG短接,如下图所示的两个引脚:

 刚才已经提到,读取NE555的信号,只需要读取其电平变化,也就是与NET 相连的P34引脚的电平变化即可。当然,选择P34引脚也是有原因的,通过查询stc15f2k60s2的引脚定义可知,P34的其中一个复用功能就是定时器0外部计数(引脚定义的内容有点多,关于P34的大概在stc15数据手册的第51页)这里也附上stc15的数据手册下载链接

stc15数据手册(点击查看或下载)
 

 前几篇文章已经提到,定时器不止有定时功能,还有计数功能,读取NE555,通俗点说就是要“记录电平变化次数”,这就用到定时器0的计数功能了。通过计数器记录电平在一段时间内的变化次数,就可以推算出1秒电平变化的次数,而1秒电平变化的次数就是频率了。

2.定时器的计数模式

通过配置定时器的TMOD寄存器,即可控制定时器的工作模式。我们需要使用定时器0记录NE555的电平变化,也就是需要使用定时器0的外部计数模式,此外定时器模式我们还是选择16位自动重载。

 由上图可知,我们需要将TMOD2置为1,使其处在外部计数模式,其他各位为0即可(定时器1初始化时,会自己在配置关于定时器1的模式)。也就是需要配置:

TMOD = 0x04;                    //设置定时器0为16位自动重装载外部记数模式

这样我们就可以用定时器0读取NE555的频率了。 

二、NE555频率读取代码的实现

 上文已经介绍了如何配置定时器的模式,接下来就是如何使用定时器读取NE555频率。主流的方法主要有两种,一种方法是是和读取超声波时间信息一样,将TH0和TL0置为0,过一段时间后读取TH0和TL0的值在经过换算就可以得到频率;另一种方法是将TH0和TL0都置为0xFF,同时允许中断,这样只要有一个脉冲过来,就会触发中断,只需要在中断服务函数里,写上频率++,每隔一段时间读取一次频率,并把频率清0,我们就可以读取到一段时间内有多少个脉冲,再算换成1s有多少个脉冲,这个值就是频率值。接下来会介绍这两种方法,在介绍这两中方法之前,我们需要配置定时器0,这里也先告诉大家定时器具体如何使用isp现成的代码进行配置。

1.定时器0初始化

其实,有了第一章的介绍,再小背一下代码,就能记住定时器0如何配置,但是isp已经提供了范例代码,现成的总是更香嘛。

与串口代码的类似,我们打开isp,找到范例程序里的外部中断0的范例程序

这串代码中,提供了一种外部计数的方法,具体代码如下:

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 T0扩展为外部下降沿中断举例--------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include "reg51.h"
#include "intrins.h"

//-----------------------------------------------

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr AUXR = 0x8e;                    //辅助寄存器
sbit P10 = P1^0;

//-----------------------------------------------
//中断服务程序
void t0int() interrupt 1            //中断入口
{
    P10 = !P10;                     //将测试口取反
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    AUXR = 0x80;                    //定时器0为1T模式
    TMOD = 0x04;                    //设置定时器0为16位自动重装载外部记数模式
    TH0 = TL0 = 0xff;               //设置定时器0初始值
    TR0 = 1;                        //定时器0开始工作
    ET0 = 1;                        //开定时器0中断

    EA = 1;

    while (1);
}

 我们现在只需要从中“提取”出我们想要的代码——定时器0初始化代码即可。初始化代码其实就是while(1)上边的那几行代码,我们写一个定时器0的初始化函数来包装一下那几行代码

void Time0_Init(void)
{
    AUXR = 0x80;                    //定时器0为1T模式
    TMOD = 0x04;                    //设置定时器0为16位自动重装载外部记数模式
    TH0 = TL0 = 0xff;               //设置定时器0初始值
    TR0 = 1;                        //定时器0开始工作
    ET0 = 1;                        //开定时器0中断
}

如果需要定时器中断(前面提到的第二种读取NE555的方法),我们还需要加上中断服务函数,中断号为1.

void Timer0_Isr(void) interrupt 1
{
    
}

2.通过读取TH0和TL0来读取频率 

我们需要先将TH0和TL0置为0,过1s之后再来读取TH0和TL0的值,这样读取出来的值就是频率值,注意读取时需要先停止定时器,如何1s读取一次已经在第七届代码中介绍过了,这里不再赘述,这里的is_read_NE555为0时,每隔1s就会被置为1。由于定时器0用来读取NE555了,所以我们这里是开启了定时器1来完成数码管等的处理

unsigned int fre=0;//频率

void Time0_Init(void)
{
    AUXR = 0x80;                    //定时器0为1T模式
    TMOD = 0x04;                    //设置定时器0为16位自动重装载外部记数模式
    TH0 = TL0 = 0x00;               //设置定时器0初始值
    TR0 = 1;                        //定时器0开始工作
    //ET0 = 1;                        //开定时器0中断
}

void main()
{
    Time0_Init();
    Timer1_Init();
    EA=1;
    while(1)
    {
        if(is_read_NE555==1)//1s读取一次,这样读取到的值刚好是频率
        {
            is_read_NE555=0;
            TR0=0;//先暂停
            fre=TH0;//再读取
            fre<<=8;
            fre|=TL0;
            TH0=0;
            TL0=0;
            TR0=1;
            Nixie_num[0]=fre/10000%10;//数码管显示频率
            Nixie_num[1]=fre/1000%10;
            Nixie_num[2]=fre/100%10;
            Nixie_num[3]=fre/10%10;
            Nixie_num[4]=fre/1%10;
        }

    }
}

注意这里的fre必须使用unsigned int。

3.通过中断读取频率

接下来介绍第二种方式,现将TH0和TL0置为0xFF,这样检查到一个脉冲之后就会进入中断服务函数,再中断服务函数内将频率++,每隔1s读取一次频率并将频率置为0.

void Timer0_Isr(void) interrupt 1
{
    fre++;
}
void Time0_Init(void)
{
    AUXR = 0x80;                    //定时器0为1T模式
    TMOD = 0x04;                    //设置定时器0为16位自动重装载外部记数模式
    TH0 = TL0 = 0xFF;               //设置定时器0初始值
    TR0 = 1;                        //定时器0开始工作
    ET0 = 1;                        //开定时器0中断
}

void main()
{
    Time0_Init();
    Timer1_Init();
    EA=1;
    while(1)
    {
        if(is_read_NE555==1)
        {
            is_read_NE555=0;
            Nixie_num[0]=fre/10000%10;
            Nixie_num[1]=fre/1000%10;
            Nixie_num[2]=fre/100%10;
            Nixie_num[3]=fre/10%10;
            Nixie_num[4]=fre/1%10;
            fre=0;
        }
    }
}

三、完整代码演示

读取NE555其实很简单,但是需要提醒一点,P34和NE555相连的那个跳线帽用完记得拔下来,其他项目可能需要用到矩阵键盘,如果那个跳线帽忘记拔了会影响矩阵键盘的读取。

下面的代码是读取NE555频率并将其显示到数码管上

通过读取TH0和TL0来读取频率

main.c

#include <stc15.h>
#include "intrins.h"


code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xFF
};
unsigned char Led_Num=0xFF;
#define LED_ON(x)			Led_Num&=~(0x01<<x);P0=Led_Num;	P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF(x)		Led_Num|=0x01<<x;		P0=Led_Num;	P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF_ALL()	Led_Num=0xFF;				P0=0xFF;		P2|=0x80;P2&=0x9F;P2&=0x1F;

#define NIXIE_CHECK()	P2|=0xC0;P2&=0xDF;P2&=0x1F;
#define NIXIE_ON()		P2|=0xE0;P2&=0xFF;P2&=0x1F;

void Time0_Init(void);
void Timer1_Init(void);		//1毫秒@11.0592MHz

unsigned char Nixie_num[]={10,10,10,10,10,10,10,10};//数码管要显示的数据
unsigned char location=0;
unsigned int fre=0;//定义频率
bit is_read_NE555=0;//每隔1s读取一次
void main()
{
	Time0_Init();//注意定时器0的初始化一定要放在定时器1的前边,因为定时器0初始化代码是抄的,写的不够完备,初始化时会干扰定时器1
	Timer1_Init();
	EA=1;
	while(1)
	{
		if(is_read_NE555==1)
		{
			TR0=0;
			fre=TH0;
			fre<<=8;
			fre|=TL0;
			TH0=0;//TH0和TL0清零
			TL0=0;
			TR0=1;//重新开始计数
			is_read_NE555=0;//为了1s数的更精确,在重新开始计时之后,才重新开始数1s(其实影响不大)
			/*数码管显示读取到的数据*/
			Nixie_num[0]=fre/10000%10;
			Nixie_num[1]=fre/1000%10;
			Nixie_num[2]=fre/100%10;
			Nixie_num[3]=fre/10%10;
			Nixie_num[4]=fre/1%10;
		}
	}
}
unsigned int count_1s=0;//中间变量
void Timer1_Isr(void) interrupt 3
{
	P0=0x01<<location;NIXIE_CHECK();
	P0=Seg_Table[Nixie_num[location]];NIXIE_ON();
	
	if(++location==8)
		location=0;
	
	if(is_read_NE555==0)//is_read_NE555为0时
	{
		if(++count_1s>1000)
		{
			is_read_NE555=1;
			count_1s=0;
		}
	}
}

void Time0_Init(void)
{
	AUXR = 0x80;                    //定时器0为1T模式
	TMOD = 0x04;                    //设置定时器0为16位自动重装载外部记数模式
	TH0 = TL0 = 0x00;               //设置定时器0初始值
	TR0 = 1;                        //定时器0开始工作
	ET0 = 1;                        //开定时器0中断
}
void Timer1_Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x40;			//定时器时钟1T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0xCD;				//设置定时初始值
	TH1 = 0xD4;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;				//使能定时器1中断
}

通过中断读取频率

main.c

#include <stc15.h>
#include "intrins.h"


code unsigned char Seg_Table[] =
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0xFF
};
unsigned char Led_Num=0xFF;
#define LED_ON(x)			Led_Num&=~(0x01<<x);P0=Led_Num;	P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF(x)		Led_Num|=0x01<<x;		P0=Led_Num;	P2|=0x80;P2&=0x9F;P2&=0x1F;
#define LED_OFF_ALL()	Led_Num=0xFF;				P0=0xFF;		P2|=0x80;P2&=0x9F;P2&=0x1F;

#define NIXIE_CHECK()	P2|=0xC0;P2&=0xDF;P2&=0x1F;
#define NIXIE_ON()		P2|=0xE0;P2&=0xFF;P2&=0x1F;

void Time0_Init(void);
void Timer1_Init(void);		//1毫秒@11.0592MHz

unsigned char Nixie_num[]={10,10,10,10,10,10,10,10};//数码管要显示的数据
unsigned char location=0;
unsigned int fre=0;//定义频率
bit is_read_NE555=0;//每隔1s读取一次
void main()
{
	Time0_Init();//注意定时器0的初始化一定要放在定时器1的前边,因为定时器0初始化代码是抄的,写的不够完备,初始化时会干扰定时器1
	Timer1_Init();
	EA=1;
	while(1)
	{
		if(is_read_NE555==1)
		{
			is_read_NE555=0;
			/*数码管显示读取到的数据*/
			Nixie_num[0]=fre/10000%10;
			Nixie_num[1]=fre/1000%10;
			Nixie_num[2]=fre/100%10;
			Nixie_num[3]=fre/10%10;
			Nixie_num[4]=fre/1%10;
			fre=0;
		}
	}
}
unsigned int count_1s=0;//中间变量
void Timer1_Isr(void) interrupt 3
{
	P0=0x01<<location;NIXIE_CHECK();
	P0=Seg_Table[Nixie_num[location]];NIXIE_ON();
	
	if(++location==8)
		location=0;
	
	if(is_read_NE555==0)//is_read_NE555为0时
	{
		if(++count_1s>1000)
		{
			is_read_NE555=1;
			count_1s=0;
		}
	}
}
void Timer0_Isr(void) interrupt 1
{
	fre++;
}
void Time0_Init(void)
{
	AUXR = 0x80;                    //定时器0为1T模式
	TMOD = 0x04;                    //设置定时器0为16位自动重装载外部记数模式
	TH0 = TL0 = 0xFF;               //设置定时器0初始值
	TR0 = 1;                        //定时器0开始工作
	ET0 = 1;                        //开定时器0中断
}
void Timer1_Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x40;			//定时器时钟1T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0xCD;				//设置定时初始值
	TH1 = 0xD4;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;				//使能定时器1中断
}

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

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

相关文章

领导力提升,才是高绩效的关键

作为企业的CEO或团队管理者&#xff0c;在日常的团队管理工作中无论是领导力还是执行力&#xff0c;都是非常重要的。在领导力的提升方面&#xff0c;我们可以通过一整套方案来进行&#xff0c;包括如何设定目标&#xff0c;动机刺激、任务拆解、鼓励参与、责任承担、建立制度、…

NLP_ChatGPT的RLHF实战

文章目录 介绍小结 介绍 ChatGPT 之所以成为ChatGPT&#xff0c;基于人类反馈的强化学习是其中重要的一环。而ChatGPT 的训练工程称得上是复杂而又神秘的&#xff0c;迄今为止&#xff0c;OpenAl也没有开源它的训练及调优的细节。 从 OpenAl已经公开的一部分信息推知&#xff…

STM32——OLED菜单(二级菜单)

文章目录 一.补充二. 二级菜单代码 简介&#xff1a;首先在我的51 I2C里面有OLED详细讲解&#xff0c;本期代码从51OLED基础上移植过来的&#xff0c;可以先看完那篇文章&#xff0c;在看这个&#xff0c;然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

大模型专题:2023爱分析·大模型厂商全景报告

今天分享的是大模型系列深度研究报告&#xff1a;《大模型专题&#xff1a;2023爱分析大模型厂商全景报告》。 &#xff08;报告出品方&#xff1a;爱分析&#xff09; 报告共计&#xff1a;80页 研究范围定义 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成…

java8-使用流-2

筛选各异的元素 流还支持一个叫作aistinct的方法&#xff0c;它会返回一个元素各异(根据流所生成元素的hashcode和eguals方法实现)的流。例如&#xff0c;以下代码会筛选出列表中所有的偶数&#xff0c;并确保没有重复。图5-2直观地显示了这个过程。 List<Integer>number…

Redis面试题整理(持续更新)

1. 缓存穿透&#xff1f; 缓存穿透是指查询一个一定不存在的数据&#xff0c;如果从存储层查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到 DB 去查询&#xff0c;可能导致DB挂掉&#xff0c;这种情况大概率是遭到了攻击。 解决方案&#xff1a; …

【C++】:位图、布隆过滤器、哈希分割

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下位图、布隆过滤器、哈希分割&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精…

【JAVA-Day90】Java如何主动发起Http、Https请求?

Java如何主动发起Http、Https请求&#xff1f; Java如何主动发起Http、Https请求&#xff1f;摘要引言一、什么是Http和Https二、如何发起Http请求三、如何发起Https请求四、Http请求的状态码和数据解析五、Http请求面试题六、总结参考资料未来展望 博主 默语带您 Go to New Wo…

公需课考试怎么搜题找答案?推荐你使用这5个公众号和工具 #知识分享#其他#知识分享

大学生必备&#xff0c;这条笔记大数据一定定要推给刚上大学的学弟学妹&#xff01;&#xff01; 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试…

Android 回退页面不是上个页面

问题 Android 回退页面不是上个页面 详细问题 笔者进行Android 开发&#xff0c;点击返回上一层&#xff0c;显示页面不是上个页面&#xff0c;而是之前的某个页面 页面跳转代码 private void navigateToActivity(Context context, Class<?> targetActivityClass) {I…

[python] 罗技动态链接驱动库DLL 控制 键鼠

[python] 罗技动态链接驱动库DLL 控制 键鼠 最近在玩搬砖游戏晶核, 每天有很多重复繁琐的"打卡"操作, 得知隔壁御三家游戏就有大佬做了自动收割的辅助工具,我就想模仿写一个.不过大佬们写的开源工具厉害得多,加了神经网络自动识别,实现寻路和点击功能.我目前最多就是…

视觉slam十四讲学习笔记(六)视觉里程计 1

本文关注基于特征点方式的视觉里程计算法。将介绍什么是特征点&#xff0c;如何提取和匹配特征点&#xff0c;以及如何根据配对的特征点估计相机运动。 目录 前言 一、特征点法 1 特征点 2 ORB 特征 FAST 关键点 BRIEF 描述子 3 特征匹配 二、实践&#xff1a;特征提取…

Vue核心基础1:数据代理

1 回顾Object.defineProperty方法 let str hello const person {name: 张三,age: 18 } Object.defineProperty(person, sex, {// value: 男,// enumerable: true, // 控制属性是否可以枚举&#xff0c;默认值是false// writable: true, // 控制属性是否可以被修改&#xff0…

使用 Mermaid 创建流程图,序列图,甘特图

使用 Mermaid 创建流程图和图表 Mermaid 是一个流行的 JavaScript 库&#xff0c;用于创建流程图、序列图、甘特图和其他各种图表。它的简洁语法使得创建图表变得非常简单&#xff0c;无需复杂的绘图工具或专业的编程技能。在本文中&#xff0c;我们将讲解如何使用 Mermaid 来创…

《合成孔径雷达成像算法与实现》Figure6.12

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.7; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

自定义类型详解 结构体,位段,枚举,联合

目录 结构体 1.不完全声明 2.结构体的自引用 3.定义与初始化 4.结构体内存对齐与结构体类型的大小 结构体嵌套问题 位段 1.什么是位段&#xff1f; 2.位段的内存分配 枚举 1.枚举类型的定义 2.枚举的优点 联合&#xff08;共同体&#xff09; 1.联合体类型的声明以…

第4讲引入JWT前后端交互

引入JWT前后端交互 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准&#xff08;(RFC 7519)&#xff1b; JWT就是一段字符串&#xff0c;用来进行用户身份认证的凭证&#xff0c;该字符串分成三段【头部、载荷、签证】 后端接口测试&…

七天爆肝flink笔记

一.flink整体介绍及wordcount案例代码 1.1整体介绍 从上到下包含有界无界流 支持状态 特点 与spark对比 应用场景 架构分层 1.2示例代码 了解了后就整个demo吧 数据源准备 这里直接用的文本文件 gradle中的主要配置 group com.example version 0.0.1-SNAPSHOTjava {sour…

[office] EXCEL怎么制作大事记图表- #学习方法#其他

EXCEL怎么制作大事记图表? 在宣传方面&#xff0c;经常会看到一些记录历史事件、成长历程的图&#xff0c;非常的直观、好看(如下图所示)。那么是怎么做到呢呢?这里我们介绍一下用EXCEL表格快速做出事件记录图的方法。 1、首先&#xff0c;做出基础表格(如下图一所示)。表格…

猫头虎分享已解决Bug ‍ || Go Error: redeclared as imported package name

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …