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

51单片机——串行口通信

目录

1、51单片机串口通信介绍

2、串行口相关寄存器 

2.1 、串行口控制寄存器SCON和PCON

2.1.1 SCON:串行控制寄存器 (可位寻址)

2.1.2 PCON:电源控制寄存器(不可位寻址)

2.2、串行口数据缓冲寄存器SBUF

2.3、从机地址控制寄存器SADEN和SADDR

2.4、与串行口中断相关的寄存器IE和IPH、IP

2.4.1 IE:中断允许寄存器(可位寻址) 

2.4.2  中断优先级控制寄存器IPH、IP

3、串行口通信实战篇


1、51单片机串口通信介绍

        STC89C52系列单片机内部集成有一个功能很强的全双工串行通信口,与传统8051单片机的串口完全兼容。设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF。
        串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。波特率由内部定时器/计数器产生,用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。
        STC89C52系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。
        STC89C52系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多个并行I/O口,或作串一并转换,或用于扩展串行外设等。

        了解了51单片机串行通信的大概要点,接下来我们就要进入正题,如何使单片机进行主从机通信呢?当然也是要写驱动程序的,但是该如何写呢?肯定是要对单片机的串行口相关寄存器进行学习的。

2、串行口相关寄存器 

串行口相关寄存器如下表: 

表中其他相关的相信大家都能看得懂,但是这里还是要提一点的是MSB、LSB。

在串行口中,MSB和LSB分别是最高有效位(Most Significant Bit)和最低有效位(Least Significant Bit),它们是对于数据位的描述。
MSB:最高有效位,也被称为高位。在一个多位数据中,MSB是位值最高的一位,其权值最大。
LSB:最低有效位,也被称为低位。在一个多位数据中,LSB是位值最低的一位,其权值最小。
MSB和LSB是用于描述数据位的相对位置的术语。它们在串行通信中往往用于指示数据位从哪一端开始传输。
全称方面,MSB和LSB的全称并没有具体的术语,它们只是描述位的相对位置的标识符。它们的含义在不同的上下文中会有所变化,但通常是通用的、广泛接受的术语。所以这里大家对它有一个概念就行。那么接下来我们就对相关的寄存器进行学习。 

2.1 、串行口控制寄存器SCON和PCON

 STC89C52系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。

2.1.1 SCON:串行控制寄存器 (可位寻址)

首先,先来学习SCON串行控制寄存器,SCON是指串行控制寄存器(Serial Control Register)。SCON用于控制和配置串行通信接口的工作模式和参数。具体来说,SCON寄存器通常包含了一些位字段(bits)用于配置串行通信的相关设置,用于选择串行通信的工作方式和某些控制功能。其格式如下:

SM0、SM1——串行口工作模式选择位。

串行口工作模式的作用是定义和控制串行通信的方式和行为,通过选择不同的工作模式,可以适配不同的应用场景和需求,实现灵活的数据传输。通过选择合适的串行口工作模式,可以根据应用需求配置和控制串行通信的参数,实现可靠、高效的数据传输。

SM0和SM1串行口工作模式选择位的使用是需要条件的:

1、当PCON寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。当检测到一个无效停止位时,通过UART接收器设置该位。FE必须由软件清零。

2、当PCON寄存器中的SMOD0/PCON.6位为0时,SM0和SM1一起指定串行通信的工作模式,如下表所示。

其中SM0、SM1按下列组合确定串行口的工作模式: 

简化如下: 

SM0、SM1=00——>方式0——>同步移位寄存器。
SM0、SM1=01——>方式1——>10位异步收发 (8位数据) 波特率可变 (定时器1溢出率控制)。
SM0、SM1=10——>方式2——>11位异步收发 (9位数据) 波特率固定。
SM0、SM1=11——>方式3——>11位异步收发 (9位数据) 波特率可变 (定时器1溢出率控制)。

解读51单片机串行通信4种工作方式:

(1)方式0:同步移位寄存器输入/输出方式,常用于扩展I/O口。波特率固定为振荡频率的1/12,并不受PCON寄存器中SMOD位的影响。

(2)方式1:用于串行发送或接收,为10位通用异步接口。TXD与RXD分别用于发送与接收数据。收发一帧数据的格式为1位起始位、8位数据位(低位在前)、1位停止位,共10位。波特率由定时器T1的溢出率与SMOD值同时决定,即SMOD=1,则波特率加倍;SMOD=0,则波特率不加倍。

(3)方式2:用于串行发送或接收,为11位通用异步接口。TXD与RXD分别用于发送与接收数据。收发一帧数据的格式为1位起始位、8位数据位(低位在前)、1位可编程的第9数据位(也就是1位奇偶校验位)和1位停止位,共11位。波特率取决于PCON中SMOD位的值;即SMOD=1,则波特率加倍;SMOD=0,则波特率不加倍。

(4)方式3:用于串行发送或接收,为11位通用异步接口。TXD与RXD分别用于发送与接收数据。帧格式与方式2相同,波特率与方式1相同。

SM2——多机通信控制位。

SM2:允许方式2或方式3多机通信控制位。在方式2或方式3时,如SM2位为1,REN位为1,则从机处于只有接收到RB8位为1(地址帧) 时才激活中断请求标志位RI为1,并向主机请求中断处理。被确认为寻址的从机则复位SM2位为0,从而才接收RB8为0的数据帧。在方式1时,如果SM2位为1,则只有在接收到有效的停止位时才置位中断请求标志位RI为1;在方式0时,SM2 应为0。

REN——允许串行接收位,由软件置1或者清0。

REN: 允许/禁止串行接收控制位。由软件置位REN,即REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。

 TB8、RB8——控制和指示串行数据传输。

TB8:TB8(Transmit Bit 8),发送的第9位数据。

在方式2和方式3时,TB8 是要发送的第 9 位数据其值由软件置1或清 0。在双机串行通信时,一般作为奇偶校验位使用;在多机串行通信中用来表示主机发送的是地址顿还是数据,TB8=1为地址,TB8=0为数据。在方式0和方式1中,不使用TB8。

RB8:RB8(Receive Bit 8),接收的第9位数据。

在方式2和方式3时,RB8存放接收到的第9位数据。在方式1时,如SM2=0,RB8 是接收到的停止位。在方式0时,不使用 RB8。

TI ——发送中断标志位,需要在中断服务中软件清0。

TI:发送中断请求标志位。在方式0,当串行发送数据第8位结束时,由内部硬件自动置位,即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0。在其他方式中,则在停止位开始发送时由内部硬件置位,必须用软件复位。

RI——接收中断标志位,需要在中断服务中软件清0。 

RI:接收中断请求标志位。在方式0,当串行接收到第8位结束时由内部硬件自动置位RI=1,向主机请求中断,响应中断后必须用软件复位,即RI=0。在其他方式中,串行接收到停止位的中间时刻由内部硬件置位,即RI=1(例外情况见SM2说明),必须由软件复位,即RI=0。

SCON的所有位可通过整机复位信号复位为全“0”。SCON的字节地址尾98H,可位寻址,各位地址为98H~~9FH,可用软件实现位设置。当用指令改变SCON的有关内容时,其改变的状态将在下一条指令的第一个机器周期的S1P1状态发生作用。如果一次串行发送已经开始,则输出TB8将是原先的值,不是新改变的值。
串行通信的中断请求:当一帧发送完成,内部硬件自动置位TI,即TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以“或逻辑”关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询TI和RI进行判别,然后分别处理。因此,两人中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。 

2.1.2 PCON:电源控制寄存器(不可位寻址)

PCON通常指代特殊功能寄存器(Special Function Register)中的电源控制寄存器(Power Control Register)。电源控制寄存器PCON中的SMOD/PCON.7用于设置方式1、方式2、方式3的波特率是否加倍。

电源控制寄存器格式如下: 

电源控制寄存器与串行口通信相关的位就是B6、B7。

SMOD:波特率选择位。当用软件置位SMOD,即SMOD=1,则使串行通信方式1、2、3的波特率加倍;SMOD=0,则各工作方式的波特率不加倍。复位时SMOD=0。

SMOD0:帧错误检测有效控制位。当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能;当SMOD0=0,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式。复位时SMOD0=0。

2.2、串行口数据缓冲寄存器SBUF

对于串行口数据缓冲寄存器SBUF的理解如下:

STC89C52系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。
串行通道内设有数据寄存器。在所有的串行通信方式中,在写入SBUF信号的控制下,把数据装入相同的9位移位寄存器,前面8位为数据字节,其最低位为移位寄存器的输出位。根据不同的工作方式会自动将“1”或TB8的值装入移位寄存器的第9位,并进行发送。串行通道的接收寄存器是一个输入移位寄存器。在方式0时它的字长为8位,其他方式时为9位。当一帧接收完毕,移位寄存器中的数据字节装入串行数据缓冲器SBUF中,其第9位则装入SCON寄存器中的RB8位。如果由于SM2使得已接收到的数据无效时,RB8和SBUF中内容不变。
由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。

2.3、从机地址控制寄存器SADEN和SADDR

为了方便多机通信,STC89C52系列单片机设置了从机地址控制寄存器SADEN和SADDR。其中SADEN是从机地址掩码寄存器(地址为B9H,复位值为00H),SADDR是从机地址寄存器(地址为A9H,复位值为00H)。这里我们用不到,就不做理解,大概了解就ok了。

2.4、与串行口中断相关的寄存器IE和IPH、IP

2.4.1 IE:中断允许寄存器(可位寻址) 

串行口中断允许位ES位于中断允许寄存器IE中,中断允许寄存器的格式如下:

EA:CPU的总中断允许控制位,EA=1,CPU开放中断,EA=0,CPU屏蔽所有的中断申请。EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。

ES:串行口中断允许位,ES=1,允许串行口中断,ES=0,禁止串行口中断。

2.4.2  中断优先级控制寄存器IPH、IP

IPH代表的是"Interrupt Priority High",IP代表的是"Interrupt Priority"。它们分别对应中断优先级高位寄存器和中断优先级低位寄存器。这两个寄存器用于控制中断的优先级。通过设置IP和IPH寄存器的位,可以确定中断的相对优先级,从而决定中断的触发顺序。注意,当多个中断同时发生时,具有较高优先级的中断将先被处理。 

串行口中断优先级控制位PS/PSH位于中断优先级控制寄存器IP/IPH中,中断优先级控制寄存器的格式如下:

IPH:中断优先级控制寄存器高(不可寻址) 

IP:中断优先级控制寄存器低(可寻址) 

PSH,PS:串口1中断优先级控制位。
当PSH=0且PS=0时,串口1中断为最低优先级中断(优先级0)

当PSH=0且PS=1时,串口1中断为较低优先级中断(优先级1)

当PSH=1且PS=0时,串口1中断为较高优先级中断(优先级2)

当PSH=1且PS=1时,串口1中断为最高优先级中断(优先级3)

3、串行口通信实战篇

我们已经学习了51单片机串行口通信的相关寄存器,接下来,就要把所学知识运用和实战——那就是编写串行口通信的驱动程序,这是最最重要的一步,很多人学会了理论,但是实践一窍不通,要坚决避免要这种情况。首先,我们肯定是要书写串行口的初始化的,但是要从哪一步开始呢?步骤如下:

 第一步:设置串行口控制寄存器SCON:①这里选择串行口工作方式1——>SM0/SCON.7=0,SM1/SCON.6=1;②多机通信控制位不需要——>SM2/SCON.5=0;③允许串行接收位需要(肯定是需要允许串行口处于接收状态的)——>REN/SCON.4=1;④控制和指示串行数据传输不需要——>TB8/SCON.3=0、RB8/SCON.2=0;⑤发送、接收中断标志位初始化需置零——>TI/SCON.1=0,RI/SCON.0=0;综合得:SCON=0x50;如下图:

第二步:设置电源控制寄存器PCON:这里我们需要注意的一点就是串行口与该寄存器有关的就是SMOD/PCON.7、SMOD0/PCON.6;①波特率选择位,选择波特率不加倍——>SMOD/PCON.7=0;②帧错误检测有效控制位,选择SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式——>SMOD0/PCON.6=0;综合得:PCON&=0x7F(这里使用了位与的表示方法,等同于PCON=0x00);如下图:

第三步:因为串行口通信属于异步通信,通信双方各自约定通信速率,所以需要使用到定时器1溢出率,所以这里我们需要配置定时器1,那就是操作与定时器/计数器有关的两个寄存器——>定时器/计数器控制寄存器TCON、定时器/计数器工作模式寄存器TMOD(这两个寄存器上面没有讲,可以自己查询一下,因为是属于定时器/计数器的内容的)①先配置定时器/计数器控制寄存器TCON;既然用到定时器1,那么肯定是要开启定时器1的——TR

1/TCON.6=1,单纯的用到该位,其他位没有用到,就不需要动了;综合得:TR1=1;如下图:

 ②接下来配置定时器/计数器工作模式寄存器TMOD:GATE/TMOD.7控制定时器1,置1时只有在INT1脚为高及TR1控制位置1时才可打开定时器/计数器1,这里不需要——>GATE/TMOD.7=0;C/T/TMOD.6控制定时器1用作定时器或计数器,清零则用作定时器(从内部系统时钟输入),置1用作计数器(从T1/P3.5脚输入),这里也不需要——>C/T/TMOD.6=0;使用定时器1,并且设定定时器1位8位自动重装方式——>M1/TMOD.5=1,M0/TMOD.4=0;综合得:TMOD=0x20;如下图:

第四步:设定计数寄存器的初值:因为使用的是定时器1,需设定计数寄存器:TL1、TH1的初始值;这里我以单片机晶振为11.0592、波特率为9600bps为例(注意:不同晶振的初始值设定的会有不一样)——>TL1=0xFD、TH1=0xFD;定时器1计数寄存器的初值为:TL1=0xFD;TH1=0xFD;这里无图;

第五步:配置中断允许寄存器IE:①开启CPU的总中断允许控制位——>EA/IE.7=1;②开启串行口中断允许位——>ES/IE.4=1;③禁止定时器1中断——>ET1/IE.3=0;其他位都不需要,全部置零;综合得:IE=0x90(等同于:ET1=0;ES=1;EA=1);如下图:

 综合上述所有步骤,串口初始化,我们将它封装成一个函数,如下:

/*** @brief  串口初始化,9600bps@11.0592MHz* @param  无* @retval 无*/
void Uart_Init(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位数据,可变波特率TMOD &= 0x0F;		//清除定时器1模式位(可有可无)TMOD |= 0x20;		//设定定时器1为8位自动重装方式(位或也是一样的)TL1 = 0xFD;		    //设定定时初值TH1 = 0xFD;		    //设定定时器重装值TR1 = 1;		    //启动定时器1ET1 = 0;		    //禁止定时器1中断ES=1;		        //串口中断允许控制位EA=1;		        //中断允许总控制位//IE=0x90;          //也可这样代替倒数的三个,分别是ET1=0;ES=1;EA=1;
}

串行口数据缓冲寄存器SBUF、从机地址控制寄存器SADEN和SADDR、中断优先级控制寄存器IPH、IP初始化用不到,我们这里不需要配置。

 下面我们开始用我们写好的串行口初始化驱动程序进行实操了,实操内容为:电脑通过串口控制LED;程序如下:

#include <REGX52.H>/*** @brief  串口初始化,9600bps@11.0592MHz* @param  无* @retval 无*/
void Uart_Init(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		//波特率不倍速SCON = 0x50;		//8位数据,可变波特率TMOD &= 0x0F;		//清除定时器1模式位(可有可无)TMOD |= 0x20;		//设定定时器1为8位自动重装方式(位或也是一样的)TL1 = 0xFD;		    //设定定时初值TH1 = 0xFD;		    //设定定时器重装值TR1 = 1;		    //启动定时器1ET1 = 0;		    //禁止定时器1中断ES=1;		        //串口中断允许控制位EA=1;		        //中断允许总控制位//IE=0x90;          //也可这样代替倒数的三个,分别是ET1=0;ES=1;EA=1;
}
/*** @brief  串口发送一个字节数据* @param  Byte 要发送的一个字节数据* @retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);TI=0;
}
void main()
{Uart_Init();		//串口初始化while(1);
}void UART_Routine() interrupt 4
{if(RI==1)					//如果接收标志位为1,接收到了数据{P2=~SBUF;				//读取数据,取反后输出到LEDUART_SendByte(SBUF);	//将受到的数据发回串口RI=0;					//接收标志位清0}
}

 将上面的代码例程的hex文件下载到我们单片机开发板中,就可以通过串口助手发送数据控制单片机的LED的亮灭了,前提是开发板和电脑已经建立起连接了,如下图:

 现象图如下:

通过上例:就发现了串行口数据缓冲寄存器SBUF是如此用的,写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器;意思就是,单片机要接收外部设备发送过来的数据时,就将SBUF赋值给一个变量,就如本例子的:P2=~SBUF; 读取数据,取反后输出到P2口;反之也是,单片机要将数据发送给外部设备,那么就将需要发送的数据赋值给SBUF就可以了,如本例子的:SBUF=Byte;将Byte的值赋值给SBUF就可以了;这个串口数据缓存寄存器就是这么用来着,很简单,相信看了就都懂的,串口通信能做很多有趣的事情,比如我们可以在单片机上装一个蓝牙,然后拿手机来远程控制单片机,这个时候我们就可以拿来做一个遥控小车,手机控制小车等等,具体的拓展看个人;

为了更加方便大家的理解,可以结合下图进行对51单片机串行口的理解:

51单片机串行口发送接收数据数字、字符、符号等等各个进制之间的关系如下图:

突然想到一个问题,最后提醒一下大家,定时器/计数器的工作模式和串行口的工作模式不是同一个概念的,大家不要混淆了,有的人就很容易弄乱的。51单片机串行口就是这么简单,只要把几个相关寄存器的功能作用弄明白了,就按自己需求配置寄存器初始化就可以了。

相关文章:

51单片机——串行口通信

目录 1、51单片机串口通信介绍 2、串行口相关寄存器 2.1 、串行口控制寄存器SCON和PCON 2.1.1 SCON&#xff1a;串行控制寄存器 (可位寻址) 2.1.2 PCON&#xff1a;电源控制寄存器&#xff08;不可位寻址&#xff09; 2.2、串行口数据缓冲寄存器SBUF 2.3、从机地址控制…...

洛谷题单 Part 6.7.1 矩阵

应队友要求&#xff0c;开始学线性代数&#xff0c;具体路线是矩阵 → \rightarrow →高斯消元 → \rightarrow →线性基。为多项式做个准备 P3390 【模板】矩阵快速幂 题面 板子&#xff0c;用结构体写的&#xff0c;感觉有点丑&#xff0c;一会儿看看题解有没有写得好看的 …...

Spring中c3p0与dbcp配置

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schem…...

Flutter 添加 example流程

一、已有Flutter工程&#xff08;命令&#xff09;添加 example 1、cd 工程(flutter_plugin ,是自己创建的)根目录 例: flutter create example 执行命令创建example PS&#xff1a;cd example 后执行flutter doctor 后就可以看到效果 2、如果需要指定iOS/Android 语言,请添加…...

数据治理8种方法

数据治理8种方法 8种方法&#xff0c;分别是&#xff1a;顶层设计法、技术推动法、应用牵引法、标准先行法、监管驱动法、质量管控法、利益驱动法、项目建设法。 事先声明&#xff0c;这些方法论都是向各位大佬学习来的&#xff0c;也有部分是项目中实操得来的&#xff0c;并非…...

大模型成互联网真正蜕变的标志,亦是各种新技术开始衍生的标志

以往&#xff0c;我们看到了以区块链、元宇宙为代表的诸多新物种的出现&#xff0c;但是&#xff0c;它们始终都没有逃脱仅仅只是一个概念和噱头的宿命&#xff0c;它们始终都没有走出一条可持续的发展道路。说到底&#xff0c;它们仅仅只是一个没有实现商业闭环的概念而已&…...

指针进阶详解---C语言

❤博主CSDN:啊苏要学习 ▶专栏分类&#xff1a;C语言◀ C语言的学习&#xff0c;是为我们今后学习其它语言打好基础&#xff0c;C生万物&#xff01; 开始我们的C语言之旅吧&#xff01;✈ 目录 前言&#xff1a; 一.字符指针 二.指针数组 三.数组指针 四.数组、指针参数 …...

设计模式思考,简单工厂模式和策略模式的区别?

最近学习了设计模式&#xff0c;学到简单工厂模式和策略模式的时候想&#xff0c;这两个模式不是一样嘛&#xff0c;仔细思考之后发现大体设计思路是一样的&#xff0c;但是细节却有所不一样。 简单工厂模式 简单工厂模式是一种创建型设计模式&#xff0c;它主要涉及对象的创建…...

Java - sh 脚本启动 jar 包等服务 - sh 脚本模板 - 适用于任何类似的服务启动

sh 脚本模板 该模板&#xff0c;每次运行一次都会 kill 掉原来的服务&#xff0c;然后重新启动 jar 包服务 #!/bin/bash# 定义Java进程的名称 APP_NAMEyour-app-name.jar# 定义Java进程的日志文件路径 LOG_PATH/var/log/your-app-name.log# 定义备份日志文件的目录 BACKUP_DI…...

MySQL高级篇第5章(存储引擎)

文章目录 1、查看存储引擎2、设置系统默认的存储引擎3、设置表的存储引擎3.1 创建表时指定存储引擎3.2 修改表的存储引擎 4、引擎介绍4.1 InnoDB 引擎&#xff1a;具备外键支持功能的事务存储引擎4.2 MyISAM 引擎&#xff1a;主要的非事务处理存储引擎4.3 Archive 引擎&#xf…...

openssl 命令行国密sm2的签名验签操作

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 密码学实践强化训练–【目录】 &#x1f448;&#x1f448;&#x1f448; 生成EC私钥&#xff1a; openssl ecp…...

开源代码分享(9)—面向100%清洁能源的发输电系统扩展规划(附matlab代码)

1.背景介绍 1.1摘要 本文提出了一种新颖的建模框架和基于分解的解决策略&#xff0c;将随机规划&#xff08;SP&#xff09;和鲁棒优化&#xff08;RO&#xff09;相结合&#xff0c;以应对协调中长期电力系统规划中的多重不确定性。从独立系统运营商&#xff08;ISO&#xff…...

为 Google Play 即将推出基于区块链的内容政策做好准备

作者 / Joseph Mills, Group Product Manager, Google Play 作为一个平台&#xff0c;Google Play 一直致力于帮助开发者将创新理念变为现实。Google Play 上托管了许多和区块链相关的应用&#xff0c;我们深知合作伙伴们希望扩展这些应用&#xff0c;并利用 NFT 等代币化数字资…...

查找-多路查找详解篇

多路查找树 多路查找树&#xff08;Multway Search Tree&#xff09;是一种高级的树形数据结构&#xff0c;它 允许每个节点有多个子节点&#xff08;通常大于等于2&#xff09;。多路查找树的每个节点 可以存储多个关键字和对应的值。分类 2-3树&#xff08;2-3 Tree&#x…...

css设置八等分圆

现需要上图样式的布局&#xff0c;我通过两张向右方的图片&#xff0c;通过定位和旋转完成了布局。 问题&#xff1a; 由于是通过旋转获取到的样式&#xff0c;实际的盒子是一个长方形&#xff0c;当鼠标移入对应的箭头时选中的可能是其他盒子&#xff0c;如第一张设计稿可以看…...

「教程」如何使用一套代码在多种程序中接入天气预警API

引言 天气预警的重要性不言而喻&#xff0c;在遭受自然灾害和极端天气时&#xff0c;及时获得预警信息可以拯救生命和减少财产损失。如今&#xff0c;随着科技的进步&#xff0c;开发者和企业可以借助天气预警 API 这款强大的服务&#xff0c;将实时预警信息集成到自己的应用中…...

(MYSQL)数据库服务端的启动与停止,登录与退出

MYSQL服务的启动与停止 方式一&#xff1a;右击左下角win图标——选择计算机管理——选择计算机管理&#xff08;本地&#xff09;——选择服务和应用程序——找到mysql&#xff08;此方法不好用&#xff09; 方式二&#xff1a;通过管理员身份运行&#xff08;必须是管理员身…...

数学建模学习(8):单目标和多目标规划

优化问题描述 优化 优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 线性规划 线性规划是指目标函数和约束都是线性的情况 [x,fval]linprog(f,A,b,Aeq,Beq,LB,U…...

【Vscode | R | Win】R Markdown转html记录-Win

Rmd文件转html R语言环境Vscode扩展安装及配置配置radian R依赖包pandoc安装配置pandoc环境变量验证是否有效转rmd为html 注意本文代码块均为R语言代码&#xff0c;在R语言环境下执行即可 R语言环境 官网中去下载R语言安装包以及R-tool 可自行搜寻教程 无需下载Rstudio Vscod…...

【Lua语法】字符串操作、字符串中的方法

1.对字符串的操作 --声明一个字符串 str "我是一个字符串"--1.获取字符串的长度 -- 前面加个#即可(注意&#xff1a;Lua中字母占1个长度&#xff0c;汉字占3个长度) print(#str)--2.字符串多行打印 -- 方法1.Lua中是支持转义字符的 print("哈哈\n嘻嘻&q…...

Linux 终端生成二维码

1、安装qrencode [rootnode1 script]# yum -y install qrencode2、输出正常的 [rootnode1 ~]# echo https://www.github.com|qrencode -o - -t utf83、输出彩色的 [rootnode1 ~]# qrencode -t utf8 -s 1 https://www.github.com|lolcatPS&#xff1a;没有lolcat命令 #由于…...

子组件未抛出事件 父组件如何通过$refs监听子组件中数据的变化

我们平时开发项目会使用一些比较成熟的组件库, 但是在极小的情况下,可能会出现我们需要监听某个属性的变化,使我们的页面根据这个属性发生一些改变,但是偏偏组件库没有把这个属性抛出来,当我们使用watch通过refs监听时,由于生命周期的原因还不能拿到,这时候我们可以这样做,以下…...

【C++】STL——stack的介绍和使用、stack的push和pop函数介绍和使用、stack的其他成员函数

文章目录 1.stack的介绍2.stack的使用2.1stack构造函数2.1stack成员函数&#xff08;1&#xff09;empty() 检测stack是否为空&#xff08;2&#xff09;size() 返回stack中元素的个数&#xff08;3&#xff09;top() 返回栈顶元素的引用&#xff08;4&#xff09;push() 将元素…...

基于BIM+AI的建筑能源优化模型【神经网络】

推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 AEC&#xff08;建筑、工程、施工&#xff09;行业的BIM 技术&#xff0c;允许在实际施工开始之前虚拟地建造建筑物&#xff1b; 这带来了许多有形和无形的好处&#xff1a;减少成本超支、更有效的协调、增强决策权等等。…...

#P0998. [NOIP2007普及组] 守望者的逃离

题目背景 恶魔猎手尤迪安野心勃勃&#xff0c;他背叛了暗夜精灵&#xff0c;率领深藏在海底的娜迦族企图叛变。 题目描述 守望者在与尤迪安的交锋中遭遇了围杀&#xff0c;被困在一个荒芜的大岛上。 为了杀死守望者&#xff0c;尤迪安开始对这个荒岛施咒&#xff0c;这座岛…...

vue3+ts+elementui-plus二次封装弹框

一、弹框组件BaseDialog <template><div classmain><el-dialog v-model"visible" :title"title" :width"dialogWidth" :before-close"handleClose"><!-- 内容插槽 --><slot></slot><template…...

ffmpeg批量分割视频解决视频前几秒黑屏的问题解决

echo 请输入视频地址&#xff1a; set /p fp echo 请输入开始时间&#xff1a; set /p st echo 请输入结束时间&#xff1a; set /p et echo 请输入分片时间&#xff1a; set /p sgt echo 注意&#xff1a;循环范围参数要空格。 for /l %%i in (%st%, %sgt%, %et%) do call :aa…...

nodejs + express 调用本地 python程序

假设已经安装好 nodejs ; cd /js/node_js ; 安装在当前目录的 node_modules/ npm install express --save 或者 cnpm install express --save web 服务器程序 server.js const http require(http); const express require(express); const path require(path); const …...

微信小程序代码优化3个小技巧

抽取重复样式 样式复用 我们会发现很多时候在开发的过程中会存在多个页面中都用到了同样的样式&#xff0c;那么其实之前有提到过&#xff0c;公用样式可以放在app.wxss里面这样就可以直接复用。 如&#xff1a;flex布局的纵向排列&#xff0c;定义在app.wxss里面 .flex-co…...

某行动态cookie反爬虫分析

某行动态cookie反爬虫分析 1. 预览 反爬网址(base64): aHR0cDovL3d3dy5wYmMuZ292LmNu 反爬截图&#xff1a; 需要先加载运行js代码&#xff0c;可能是对环境进行检测&#xff0c;反调试之类的 无限debugger 处理办法 网上大部分人说的都是添加cookie来解决。 那个noscript…...