蓝桥杯-单片机组基础6——定时计数器与外部中断混合使用(附小蜜蜂课程代码)

蓝桥杯单片机组备赛指南请查看这篇文章:戳此跳转蓝桥杯备赛指南文章

本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。

型号:国信天长4T开发板(绿板),芯片:IAP15F2K61S2

(使用国信天长蓝板也可以完美兼容,与绿板几乎无差别)


1.编程目的

        通过定时/计数器实现数码管的时钟显示,显示格式例如“12-13-14”,表示12点13分14秒时刻。并通过设置外部中断0,当S5按下时计时暂停,再次按下时继续计时。

2.定时/计数器原理

2.1 单片机的基本中断系统

        比赛用单片机最多允许两层中断的嵌套。即在低级的中断服务函数执行过程中,收到了更高级的中断信号,而去先执行更高级的中断工作,执行完再返回继续执行低级的中断工作,低级的中断工作做完,再回到最原本的代码继续执行。

        本文中,我们使用到的外部中断0与定时/计数器中断0,本身自带优先级,且INT0的优先级已经高于T0,因此我们不需要对两个中断的优先级进行单独设置。

比赛用芯片IAP15F2K61S2 涉及的中断共有14个,这里介绍常用的5个:

中断号中断名中断名解释
0INT0外部中断0
1T0定时/计数器中断0
2INT1外部中断1
3T1定时/计数器1
4TI/RI串口中断
5T2定时/计数器中断2

本文聚焦外部中断0与定时/计数器中断0,只对INT0和T0进行讲解,他们的中断号对应为0和1。比赛用开发板中还有INT2,INT3,INT4,T2共计5个外部中断信号源,三个定时/计数器中断信号源,其余中断源将在专栏“蓝桥杯-单片机组进阶”中讲解。

2.2 什么是定时/计数器中断

        定时/计数器可以想象成一个每隔一定时间,就会自动产生一次中断的开关。但它产生中断的时间间隔是固定的,由我们来设置。中断产生的感觉可以想象成一个正在接水的水桶,当水桶里的水接满溢出时产生中断,由此每次产生中断所需要的时间就可以比拟成水桶接满水的时间。那我们如果按照自己的需求,让水桶接满水的时间被人为精确控制呢?设置初值——即在最开始让水桶里装有一定数量的水,最开始水桶里面的水越多,水桶就越快溢出,产生中断所需要的时间就越短。上述为口语化的理解,更本质的解释如下:

        

        定时/计数器的核心是16位的加法计数器,在8位的51单片机中,使用两个8位的寄存器THx和TLx共同组成16位,并分别叫做高8位和低8位。当这16位加法计数器计数溢出,则产生一次定时/计数器中断。单片机的晶振我们假定是12Mhz,单片机会将12Mhz进行12分频后传入加法计数器中,即一个机器周期(12Mhz/12=1Mhz,Tcy=1us),此时,我们可以认为在晶振为12Mhz的单片机中,没经过1us的时长,加法计数器的值加1 。假设我们让16位加法计数器从0开始计数,即计数初值为0(0000 0000 0000 0000) ,当变成计数值变成(1111 1111 1111 1111)时在经过1us,计数器就会溢出,并产生一次定时/计数器中断,此时计数值为65535  。此时,我们可以认为在初值为0,16位计数器,晶振为12Mhz的单片机中,产生一次中断所需要的时间为65535us=65.535ms 。当我们需要单片机50ms就产生一次中断时,就可以设置初值为15535 (65.535ms-50.000ms) 。

        实际的单片机中,为了方便我们的使用,晶振频率可能为12Mhz,11.05926Mhz;同时在定时/计数器不同的工作方式下,计数器的位数可能为16位(最大值65535),13位(最大值8191),8位(最大值255);因此我们需要根据不同的设置,进行不同的计算。相关的计算过程可查看TMOD寄存器设置的部分。

2.3 定时/计数器中断涉及的寄存器

        为了简短篇幅,下面将寄存器IP、IE、TCON简略说明,详细内容可以查看文章:戳此跳转

我们着重介绍TMOD寄存器

两级中断允许控制:IE(interrupt enable)

EA-ET2ESET1EX1ET0EX0

IE中各位的功能如下:

EA—中断总开关控制位,EA=1,所有的中断请求开放。

ES—串行口中断允许位。

ET1—定时器/计数器T1溢出中断允许位。

EX1—外部中断1中断允许位。

ET0—定时器/计数器T0的溢出中断允许位。

EX0—外部中断0中断允许位。

        该寄存器允许位寻址,在编程时,如果只用到一个外部中断0和T0,则我们只需要设置总开关EA、外部中断0允许位EX0 、T0中断允许为ET0。

两级优先级控制:IP(interrupt priority)

--PT2PSPT1PX1PT0PX0

中断优先级寄存器IP各位含义:

PS—串行口中断优先级控制位,1—高级;0—低级。

PT1—T1中断优先级控制位,1—高级;0—低级。

PX1—外部中断1中断优先级控制位,1—高级;0—低级。

PT0—T0中断优先级控制位,1—高级;0—低级。

PX0—外部中断0中断优先级控制位,1—高级;0—低级。

        该寄存器允许位寻址,本题中采用默认优先级,因此不用管这个寄存器。

特殊功能寄存器:TCON(timer controller)

TF1TR1TF0TR0IE1IT1IE0IT0

TCON寄存器中与中断系统有关各标志位功能如下:

TF1—定时器/计数器T1的溢出中断请求标志位。

TF0—定时器/计数器T0溢出中断请求标志位似。

IE1—外部中断请求1中断请求标志位。

IE0—外部中断请求0中断请求标志位,与IE1类似。

IT1—选择外中断1请求方式。0--电平触发方式,1--跳沿触发方式。

IT0—选择外中断0请求方式。0--电平触发方式,1--跳沿触发方式。

         该寄存器允许位寻址,在编程时,如果只用到一个外部中断0,则我们只需要设置IT0从而确定外部中断0的触发方式 。而对于TF0,它不需要我们设置,只是在程序中我们可以通过查询TF0是否等于1,从而判断T0是否溢出。

特殊方式寄存器:TMOD(timer mode)

GATEC/TM1M0GATEC/TM1M0
<----  定时器1(T1)  ----><----  定时器0(T0)  ---->

TMOD寄存器中与中断系统有关各标志位功能如下:

        通过观察可以发现,TMOD寄存器左边4位与右边4位几乎一样,只是左边针对定时/计数中断1,右边针对定时/计数中断2。本文中我们使用T0,因此我们介绍T0各位的含义,T1与T0相同:

GATE: 用于控制定时器启动是否受外部中断源的影响 
      当GATE=0时,只要用软件使TR0或TR1等于1,就可以启动T0或T1定时/计数器工作。
      当GATE=1时,除了用软件使TR0或TR1等于1外,还要使外部中断引脚INT0/1为高电平,这样定时/计数器才能启动工作。
      注意:GATE=0表示控制定时器启动不受外部中断源的影响

 C/T=0为定时模式,C/T=1为计数模式。
 

M1 M0工作方式选择位,两位一起看:

M1 M0工作方式工作说明
00方式013位定时/计数器,最大值8192
01方式116位定时/计数器,最大值65535
10方式28位自动重装定时/计数器,最大值255
11方式3T1分成两个独立的定时/计数器,T1停止计数

举例:我们在12Mhz的单片机中,不设置外部中断触发定时,设置T0工作在方式1,实现50ms的定时中断。则GATE=0,C/T=0,M1 M0=01 ,剩下的位全部赋值0,则TMOD应该赋值:TMOD=0000 0001=0x01  。

        该寄存器不可位寻址,编程时,我们必须对TMOD寄存器进行整体赋值,才能正确设置。充分考虑要使用T1或者T0,然后进行对应位的设置,并转换成BCD码写入代码。 

初值寄存器:THx TLx

        如果是使用T1,则初值的高8位寄存器为TH1,低8位寄存器为TL1

        如果是使用T0,则初值的高8位寄存器为TH0,低8位寄存器为TL0

        如果T1和T0都使用,则TH1,TL1,TH0,TL0都需要设置初值

        

        蓝桥杯比赛使用的开发板是12Mhz的,刚好对于加法器加1的时长为1us。假如我们设置TMOD寄存器使得定时/计数器工作在方式1,最大计数值为65535,则最长的中断间隔时长为65535us=65.535ms 。如果我们需要的中断间隔时长为50ms,即每50ms产生一次中断,则我们需要让加法器有一个固定的初值为65.535ms-50.000ms=15.535ms。则初值为15535,转换成16进制为:3caf。高8位为3c,需要赋值给THx,低8位位af,需要赋值给TLx。

        但每次转换进制很麻烦,因此我们可以通过以下公式,快速写出代码:

        最大值就是工作方式的最大计数值,方式1为16位定时/计数器,2 ^16=65535,即最大值为65535 。定时值是我们的定时时长,如果是50ms,则为50 000us,即定时值为50000 。带入式子即可在运行时由单片机自己进行运算,方便我们进行代码编写。注意:当计算式确定之后,还是要手动把计算结果替换进赋值表达式,减少单片机资源占用。

3.编程中涉及的中断函数

3.1 定时/计数器初始化函数

        目的:使用T0产生一个9.216ms的定时/计数中断

        该函数中,首先是对TMOD进行设置,方式一,定时中断,无需外部中断,只是用T0,因此为0x01 。然后设定计数初值,对TH0,TL0进行赋值。EA和ET0是IE寄存器的对应位,作用分别为打开总中断,打开定时/计数器T0中断。TR0是TCON寄存器的对应位,作用为T0开始计数。

3.2 定时/计数器服务函数

        中断的服务函数,作用是当中断产生时,系统暂停当前工作,而去执行中断服务函数里面的程序,执行完服务函数的程序后,再返回继续执行先前的工作。在这个函数中,首先我们对初值寄存器TH0和TL0进行赋值,因为工作方式1不会自动重装初值,只有工作方式2(8位自动重装方式)会自动重新装载初值,因此除了方式2以外的所有方式,都需要在中断服务函数中重新对THx和TL0重新赋值。然后下面的自增指令是我们自己定义的功能。

4.代码参考

4.1 编程目的代码,代码效果:

实现数码管的时钟显示,显示格式例如“23-20-00”,表示23点20分00秒时刻。并通过设置外部中断0,当S5按下时计时暂停,再次按下时继续计时。

//写一个计时器,分-秒-20ms
#include < REGX52.h >
#include < INTRINS.h >

unsigned char code SMG_duanma [18]=
			{ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 
				0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,
				0xbf , 0x7f };
			
sbit S5 = P3^2;
				
void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P2 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P2 & 0x1f ) | 0xa0;
		break;		
		case 6:
			P2 = ( P2 & 0x1f ) | 0xc0;
		break;
		case 7:
			P2 = ( P2 & 0x1f ) | 0xe0;
		break;
	}
}

void Input_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 6 );
	P0 = 0x01 << pos_SMG;
	select_HC573 ( 7 );
	P0 = value_SMG;
}

void Delay ( unsigned char t )
{
	while ( t-- )
	{
		unsigned char i,j;
		
		_nop_ ();
		_nop_ ();
		i = 22;
		j = 128;
		do 
		{
			while ( --j );
		}while ( --i );	
	}
}

//=======================================
void Init_timer0_INT0 ()
{
	//设置T0初始化
	TMOD = 0x01;
	TH0 = ( 65535 - 18433 ) / 256;
	TL0 = ( 65535 - 18433 ) % 256;
	ET0 = 1;

	//设置INT0初始化
	IT0 = 1;
	EX0 = 1;
	
	//打开总中断开关,以及启动定时器
	EA = 1;
	TR0 = 1;
}

unsigned char state_INT0 = 0;
void Service_INT0 () interrupt 0
{	
	state_INT0+=1;
	//注意 这里有按键产生中断的操作,但是没有进行消抖处理
	//但是中断的执行过程会过滤掉部分抖动时间
	//因此按下S5只要不是很刁钻,单片机都会正确响应
	//正常情况下,不推荐在服务函数中写入if语句,这里为了使用外部中断,无法使用消抖处理,因此出此下策
	if( state_INT0%2==0 )
	{
		TR0 = 1;
	}
	else
	{
		TR0 = 0;
	}
	
}

unsigned char timer0_50ms = 0;
void Service_timer0 () interrupt 1
{
	TH0 = ( 65535 - 50000 ) / 256;
	TL0 = ( 65535 - 50000 ) % 256;
	
	timer0_50ms ++;
}
//========================================



unsigned char timer0_s = 00;
unsigned char timer0_m = 20;
unsigned char timer0_h = 23;
void time_SMGrunning ()
{

	if ( timer0_50ms == 20 )
	{
		timer0_s ++;
		timer0_50ms = 0;
		if ( timer0_s == 60 )
		{
			timer0_m ++;
			timer0_s = 0;
			timer0_50ms = 0;
			if ( timer0_m == 60 )
			{ 
				timer0_m = 0;
				timer0_h++;
			}			
		}
	}
	

	Input_SMG ( 7 , SMG_duanma[ timer0_s%10 ] );
	Delay ( 1 );
	Input_SMG ( 6 , SMG_duanma[ timer0_s/10 ] );
	Delay ( 1 );
	Input_SMG ( 5 , SMG_duanma[16] );
	Delay ( 1 );
	Input_SMG ( 4 , SMG_duanma[ timer0_m%10 ] );
	Delay ( 1 );
	Input_SMG ( 3 , SMG_duanma[ timer0_m/10 ] );
	Delay ( 1 );
	Input_SMG ( 2 , SMG_duanma[16] );
	Delay ( 1 );
	Input_SMG ( 1 , SMG_duanma[ timer0_h%10 ] );
	Delay ( 1 );
	Input_SMG ( 0 , SMG_duanma[ timer0_h/10 ] );
	Delay ( 1 );
}

void main ()
{
	Init_timer0_INT0 ();
	while ( 1 )
	{
		time_SMGrunning ();
	}
}

4.2 小蜜蜂课程代码:

代码1://使用定时器实现间隔时间闪烁灯光

//使用定时器实现间隔时间闪烁灯光
#include < REGX52.h >

sbit L1 = P0^0;
sbit L8 = P0^7;
unsigned char code SMG_duanma [18]=
			{ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 
				0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,
				0xbf , 0x7f };
			

void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P0 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P0 & 0x1f ) | 0xa0;
		break;		
		case 6:
			P2 = ( P0 & 0x1f ) | 0xc0;
		break;		
		case 7:
			P2 = ( P0 & 0x1f ) | 0xe0;
		break;		
	}
}

void Input_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 6 );
	P0 = 0x01 << pos_SMG;
	select_HC573 ( 7 );
	P0 = value_SMG;

}


///============================================
void Init_Timer0 ()
{
	TMOD = 0x01;
	TH0 = (65535-9216) / 256;
	TL0 = (65535-9216) % 256;
	EA = 1;		
	TR0 = 1;	
	ET0 = 1;	
}

unsigned char count_timer0;
unsigned char value_SMG=0;
void Service_timer0 () interrupt 1
{
	TH0 = (65535-9216) / 256;
	TL0 = (65535-9216) % 256;
	count_timer0++;
}

void Time_Led_Timer0 ()
{	
	if ( count_timer0 == 100 )
	{
		count_timer0 = 0;
		value_SMG++;		
		Input_SMG ( 0 , SMG_duanma [value_SMG] );


	}
	if ( value_SMG == 9 )
	{
		value_SMG = 0;
	}
	
	
}
	
	
//=============================================

void main ()
{
	Init_Timer0 ();
	while ( 1 )
	{
		Time_Led_Timer0 ();
	}
}

代码2://写一个计时器,分-秒-20ms

//写一个计时器,分-秒-20ms
#include < REGX52.h >
#include < INTRINS.h >

unsigned char code SMG_duanma [18]=
			{ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 
				0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,
				0xbf , 0x7f };
			
sbit S5 = P3^2;
sbit S4 = P3^3;
				
void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P2 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P2 & 0x1f ) | 0xa0;
		break;		
		case 6:
			P2 = ( P2 & 0x1f ) | 0xc0;
		break;
		case 7:
			P2 = ( P2 & 0x1f ) | 0xe0;
		break;
	}
}

void Input_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 6 );
	P0 = 0x01 << pos_SMG;
	select_HC573 ( 7 );
	P0 = value_SMG;
}

void Delay ( unsigned char t )
{
	while ( t-- )
	{
		unsigned char i,j;
		
		_nop_ ();
		_nop_ ();
		i = 22;
		j = 128;
		do 
		{
			while ( --j );
		}while ( --i );	
	}
}

//=======================================
void Init_timer0 ()
{
	TMOD = 0x01;
	TH0 = ( 65535 - 18433 ) / 256;
	TL0 = ( 65535 - 18433 ) % 256;
	ET0 = 1;
	EA = 1;
	TR0 = 1;
}

unsigned char timer0_20ms = 0;
void Service_timer0 () interrupt 1
{
	TH0 = ( 65535 - 18433 ) / 256;
	TL0 = ( 65535 - 18433 ) % 256;
	
	timer0_20ms ++;
}
//========================================

void time_SMGrunning ()
{
	static unsigned char timer0_s = 0;
	static unsigned char timer0_m = 0;
	if ( timer0_20ms == 50 )
	{
		timer0_s ++;
		timer0_20ms = 0;
		if ( timer0_s == 60 )
		{
			timer0_m ++;
			timer0_s = 0;
			timer0_20ms = 0;
			if ( timer0_m == 99 )
			{ 
				timer0_m = 0;
			}			
		}
	}
	
	if ( S5 == 0 )
	{
		Delay ( 3 );
		if ( S5 == 0 )
		{
			TR0 = 0;
		}
		else ;
	}
	else 
	{
		TR0 = 1;
	}
	
	if ( S4 == 0 )
	{
		Delay ( 3 );
		if ( S4 == 0 )
		{
			timer0_20ms = 0;
			timer0_s = 0;
			timer0_m = 0;
		}
	}

	Input_SMG ( 7 , SMG_duanma[ timer0_20ms%10 ] );
	Delay ( 1 );
	Input_SMG ( 6 , SMG_duanma[ timer0_20ms/10 ] );
	Delay ( 1 );
	Input_SMG ( 5 , SMG_duanma[16] );
	Delay ( 1 );
	Input_SMG ( 4 , SMG_duanma[ timer0_s%10 ] );
	Delay ( 1 );
	Input_SMG ( 3 , SMG_duanma[ timer0_s/10 ] );
	Delay ( 1 );
	Input_SMG ( 2 , SMG_duanma[16] );
	Delay ( 1 );
	Input_SMG ( 1 , SMG_duanma[ timer0_m%10 ] );
	Delay ( 1 );
	Input_SMG ( 0 , SMG_duanma[ timer0_m/10 ] );
	Delay ( 1 );
}

void main ()
{
	Init_timer0 ();
	while ( 1 )
	{
		time_SMGrunning ();
	}
}

5.编程思路重述

        对定时计数器的使用在比赛中至关重要,主要就是在初始化的时候:对TMOD的正确设置(GATE、C/T),对THx和TLx的初值正确赋值,然后不要忘记对TCON寄存器的TR0和TR1要赋值为1启动,最后是IE寄存器里面的各个开关要打开。

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

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

相关文章

Android 混淆是啥玩意儿?

什么是混淆 Android混淆&#xff0c;是伴随着Android系统的流行而产生的一种Android APP保护技术&#xff0c;用于保护APP不被破解和逆向分析。简单的说&#xff0c;就是将原本正常的项目文件&#xff0c;对其类、方法、字段&#xff0c;重新命名a,b,c…之类的字母&#xff0c…

[AutoSar]BSW_Com07 CAN报文接收流程的函数调用

目录 关键词平台说明一、背景二、顺序总览三、函数说明3.1 Com_RxIndication&#xff08;&#xff09; 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c;芯片厂商TI 英飞凌编程语言C&#xff0c;C编译器HighTec (GCC)…

win11安装nodejs

一、下载安装包 链接: https://pan.baidu.com/s/1_df8s1UlgNNaewWrWgI59A?pwdpsjm 提取码: psjm 二、安装步骤 1.双击安装包 2.Next> 3.勾选之后&#xff0c;Next> 4.点击Change&#xff0c;选择你要安装的路径&#xff0c;然后Next> 5.点击Install安装 二、…

MySQL 存储过程批量插入总结

功能需求背景&#xff1a;今天接到产品经理核心业务表的数据压测功能&#xff0c;让我向核心业务表插入百万级的业务量数据&#xff0c;我首先想到的办法就是存储过程实现数据的批量 。 由于无法提供核心业务表&#xff0c;本文仅仅提供我刚刚自己创建的表bds_base_user 表做相…

【Vue3】深入理解Vue中的ref属性

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

VSCode通过SSH连接Docker环境进行开发

文章目录 VSCode 插件Docker 镜像构建镜像部署环境 VSCode 连接本地Docker容器VSCode SSH连接Docker容器VSCode 打开容器内目录文件 VSCode 插件 Remote - SSH Docker 镜像 https://hub.docker.com/_/golang # Golang 镜像 docker pull golang:1.22构建镜像 Dockerfile F…

Shell条件判断

一、文件类型判断 示例&#xff1a; # 判断文件是否存在&#xff0c;存在为0&#xff0c; 不存在为1 [rootlocalhost ~]# test -e person.txt [rootlocalhost ~]# echo $? 0 [rootlocalhost ~]# [rootlocalhost ~]# test -e aba [rootlocalhost ~]# echo $? 1 # 出test外&am…

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…

小程序实现定位城市切换且城市根据首字母A-Z排序后端数据实现逻辑

场景&#xff1a; 话不多说后端提供数据实现步骤&#xff1a; 1.controller层 Api(tags {"[地区]-城市相关接口"}) RestController RequestMapping("region") Slf4j public class RegionController extends BaseController {Resourceprivate RegionServ…

盲人出行:科技创造美好的未来

在繁忙的都市中&#xff0c;我每天都要面对许多挑战&#xff0c;盲人出行安全保障一直难以得到落实。我看不见这个世界&#xff0c;只能依靠触觉和听觉来感知周围的一切。然而&#xff0c;我从未放弃过对生活的热爱和对未来的憧憬。在一次机缘巧合下&#xff0c;我认识了一款名…

信息系统项目管理师--项目管理概述

开展项⽬是为了通过可交付成果达成⽬标。⽬标是所指向的结果、要取得的战略地位、要达到的⽬的、要获得的成果、要⽣产的产品或者要提供的服务。 可交付成果形成的独特并可验证的产品、成果或服务。可交付成果可能是有形的&#xff0c;也可能是⽆形的。产⽣⼀个或多个可交付成…

【ArcGIS】渔网分割提取栅格图+网格化分析图绘制

ArcGIS按渔网分割提取栅格图并绘制网格化分析图 准备数据操作步骤步骤1&#xff1a;创建渔网&#xff08;Create Fishnet&#xff09;步骤2&#xff1a;栅格数据处理步骤3&#xff1a;栅格插值步骤4&#xff1a;数据关联 参考 网格化的目的是让各个数据更加标准化的进行统计。因…

C语言-指针(上)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 本篇文章将为大家介绍C语言中的核心内容-指针&#xff0c;指针在C语言的中知识内容比…

全新挑战:微软 AI 奥德赛邀您全方位 Get AI 应用技能!

点击蓝字 关注我们 AI 风暴的火速席卷&#xff0c;大语言模型的不断迭代&#xff0c;在企业面临着机遇与挑战并存的新形势下&#xff0c;许许多多的个人也在经历着职业生涯的巨大压力与变革。在这场人工智能的浪潮之中&#xff0c;AI 技能无疑是我们破局焕新的关键利器。 为助力…

Dell R730 2U服务器实践3:安装英伟达上代专业AI训练Nvidia P4计算卡

Dell R730是一款非常流行的服务器&#xff0c;2U的机箱可以放入两张显卡&#xff0c;这次先用一张英伟达上代专业级AI训练卡&#xff1a;P4卡做实验&#xff0c;本文记录安装过程。 简洁步骤&#xff1a; 打开机箱将P4显卡插在4号槽位关闭机箱安装驱动 详细步骤&#xff1a; 对…

k8s单机部署zookeeper

&#xff08;作者&#xff1a;陈玓玏&#xff09; 拉取镜像&#xff1a;docker pull zookeeper&#xff1b;编辑yaml&#xff1a; apiVersion: v1 kind: Service metadata:name: zookeeperlabels:app: zookeeper spec:ports:- name: clientport: 2181protocol: TCPtargetP…

图片说话软件一览

目录 ~~tokkingheads~~~~myvoiceyourface~~~~avatarify~~wav2lip(值得研究) 最近刷到很多古画唱歌视频&#xff0c;搜了一下&#xff0c;好多教你怎么做的&#xff0c;今天来尝试了一下&#xff0c;感觉不咋地&#xff0c;就没有成功的 tokkingheads 网页一直转圈&#xff0c;…

Python环境下一种改进的基于梯度下降的自适应短时傅里叶变换

在数字信号处理技术中&#xff0c;傅里叶变换及其逆变换是一种信号时频分析方法。该方法将信号的时域描述及频域描述联系在一起&#xff0c;时域信号可通过正变换转变为频域信号&#xff0c;频域信号可通过逆变换转变为时域信号进行分析。但傅里叶变换及其逆变换是一种信号的整…

基于阿里云平台 通过树莓派实现 1:1人脸识别

之前的学习中&#xff0c;曾经在香橙派上使用阿里云平台的服务实现过类型识别&#xff1a; 使用香橙派并基于Linux实现最终版智能垃圾桶项目 --- 下_香橙派 项目-CSDN博客 现在&#xff0c;尝试在树莓派上通过阿里云平台的服务实现人脸识别&#xff01; 通过VScode远程连接树莓…

EasyRecovery数据恢复软件2024最新版包括Windows和Mac

EasyRecovery数据恢复软件适用于多种环境和使用场景。首先&#xff0c;它适用于各种操作系统&#xff0c;包括Windows和Mac。无论用户使用的是哪种操作系统&#xff0c;都可以使用该软件进行数据恢复。 其次&#xff0c;EasyRecovery支持从各种存储设备和媒介中恢复数据&#…