当前位置: 首页 > news >正文

蓝桥杯-单片机组基础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寄存器里面的各个开关要打开。

相关文章:

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

蓝桥杯单片机组备赛指南请查看这篇文章&#xff1a;戳此跳转蓝桥杯备赛指南文章 本文章针对蓝桥杯-单片机组比赛开发板所写&#xff0c;代码可直接在比赛开发板上使用。 型号&#xff1a;国信天长4T开发板&#xff08;绿板&#xff09;&#xff0c;芯片&#xff1a;IAP15F2K6…...

交友社交软件开发-php交友聊天系统-

为了开发一个高效的交友系统&#xff0c;需要一个完善的信息管理和筛选机制。这个系统应该能够根据用户的个人信息、兴趣爱好、价值观等标准进行筛选&#xff0c;并向用户提供符合他们要求心仪的人的信息。为了实现这个目标&#xff0c;系统可以利用人工智能技术&#xff0c;分…...

vue2 开发记录

el-select 如何修改选择项的样式/el-select-dropdown__item 文字上下显示 测试代码 <div stylemargin-left: 100px><!-- 测试代码--><el-select filterablesizemini><div classxxx-el-select><el-optionv-foritem in [{key:1,des:2,…...

QML中表格中数据获取

1.在生成的动态表格中获取某格数据的内容 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableMod…...

【mysql 数据库事务】开启事务操作数据库,写入失败后,不回滚,会有问题么? 这里隐藏着大坑,复试,面试时可以镇住面试老师!!!!

建表字段: CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,nickname VARCHAR(32) NOT NULL COLLATE utf8mb4_general_ci,email VARCHAR(32) NOT NULL COLLATE utf8mb4_general_ci,status SMALLINT(6) UNSIGNED NULL DEFAULT NULL,password VARCHAR(256) NULL DEFAULT…...

Go语言的100个错误使用场景(55-60)|并发基础

前言 大家好&#xff0c;这里是白泽。**《Go语言的100个错误以及如何避免》**是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析1…...

钉钉机器人发送折线图卡片 工具类代码

钉钉机器人 “创建并投放卡片 接口 ” 可以 发送折线图、柱状图 官方文档&#xff1a;创建并投放卡片 - 钉钉开放平台 0依赖、1模板、2机器人放到内部应用、3放开这个权限 、4工具类、5调用工具类 拼接入参 卡片模板 自己看文档创建&#xff0c;卡片模板的id 有用 0、依赖…...

基于springboot的大型商场应急预案管理系统论文

大型商场应急预案管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了大型商场应急预案管理系统的开发全过程。通过分析大型商场应急预案管理系统管理的不足&#xff0c;创建了一个计算机管理大型商场应急…...

强化学习嵌入Transformer(代码实践)

这里写目录标题 ChatGPT的答案GPT4.0 ChatGPT的答案 # 定义Transformer模块 class Transformer(nn.Module):def __init__(self, input_dim, hidden_dim, num_heads, num_layers):super(Transformer, self).__init__()self.encoder_layer nn.TransformerEncoderLayer(d_modeli…...

决定西弗吉尼亚州地区版图的关键历史事件

决定西弗吉尼亚州地区版图的关键历史事件&#xff1a; 1. 内部分裂与美国内战&#xff1a; - 在1861年美国内战爆发时&#xff0c;弗吉尼亚州作为南方邦联的一员宣布退出美利坚合众国。然而&#xff0c;弗吉尼亚州西部的一些县由于经济结构&#xff08;主要是农业非依赖奴隶制…...

LeetCode_22_中等_括号生成

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 暴力法2.2 回溯法 1. 题目 数字 n n n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a; n 3 n 3 …...

Verilog(未完待续)

Verilog教程 这个教程写的很好&#xff0c;可以多看看。本篇还没整理完。 一、Verilog简介 什么是FPGA&#xff1f;一种可通过编程来修改其逻辑功能的数字集成电路&#xff08;芯片&#xff09; 与单片机的区别&#xff1f;对单片机编程并不改变其地电路的内部结构&#xff0…...

【Linux实践室】Linux初体验

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux 目录结构介绍2.2 &#x1f514;Linux …...

Flutter中高级JSON处理:使用json_serializable进行深入定制

Flutter中高级JSON处理 使用json_serializable库进行深入定制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/1363…...

华为OD技术面试案例4-2024年

个人情况&#xff1a;985本&#xff0c;目标院校非计算机专业&#xff0c;情况比较特殊&#xff0c;23年11月研究生退学&#xff0c;电子信息类专业。 初识od&#xff1a;10月底打算退学的时候在智联、BOSS上疯狂投硬件方面的岗位。投了大概一两天后有德科和HW的HR打电话给我介…...

【TestNG】(4) 重试机制与监听器的使用

在UI自动化测试用例执行过程中&#xff0c;经常会有很多不确定的因素导致用例执行失败&#xff0c;比如网络原因、环境问题等&#xff0c;所以我们有必要引入重试机制&#xff08;失败重跑&#xff09;&#xff0c;来提高测试用例成功率。 在不写代码的情况没有提供可配置方式…...

“智农”-高标准农田

高标准农田是指通过土地整治、土壤改良、水利设施、农电配套、机械化作业等措施&#xff0c;提升农田质量和生产能力&#xff0c;达到田块平整、集中连片、设施完善、节水高效、宜机作业、土壤肥沃、生态友好、抗灾能力强、与现代农业生产和经营方式相适应的旱涝保收、稳产高产…...

利用 lxml 库的XPath()方法在网页中快速查找元素

XPath() 函数是 lxml 库中 Element 对象的方法。在使用 lxml 库解析 HTML 或 XML 文档时&#xff0c;您可以通过创建 Element 对象来表示文档的元素&#xff0c;然后使用 Element 对象的 XPath() 方法来执行 XPath 表达式并选择相应的元素。 具体而言&#xff0c;XPath() 方法是…...

nginx---------------重写功能 防盗链 反向代理 (五)

一、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之一&#xff0c;重写功能(…...

unity shaderGraph实例-物体线框显示

文章目录 本项目基于URP实现一&#xff0c;读取UV网格&#xff0c;由自定义shader实现效果优缺点效果展示模型准备整体结构各区域内容区域1区域2区域3区域4shader属性颜色属性材质属性后处理 实现二&#xff0c;直接使用纹理&#xff0c;使用默认shader实现优缺点贴图准备材质准…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...