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

单片机学习笔记---串口通信(2)

目录

串口内部结构

串口相关寄存器

串口控制寄存器SCON

SM0和SM1

SM2

REN

TB8和RB8

TI和RI

电源控制寄存器PCON

SMOD

串口工作方式

方式0

方式0输出:

方式0输入

方式1

方式1输出。

方式1输入

方式2和方式3

方式2和方式3输出:

方式2和方式3输入:

波特率的计算

串口配置步骤

1.确定T1的工作方式

2.确定串口的工作方式

3.计算我们T1的初值(设定波特率)

4.启动T1(TCON中的TR1位)

5.如果使用中断,需要开启串口中断控制位


续上一篇:

单片机学习笔记---串口通信(1)-CSDN博客

串口内部结构

这张图是我们51单片机的串口内部的结构图。 右边的两个脚,TXD对应到单片机的P3.1的附加功能,然后RXD对应到单片机的P3.0引脚的附加功能。

同样,对这个P3.1和P3.0相应的寄存器配置就可以使用串口的功能了。

左边这一块全是单片机内部的结构。

最重要的一块是在SBUF数据缓存期,也就是特殊功能均器的数据缓存期

SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器

我们要进行发送数据和接收数据的话,它的数据是存放在SBUF这个缓存区当中的

如果我们要读取串口的接收数据的话,我们是读取这个SBUF

然后要发送的话也是先把数据存到SBUF这个寄存器当中,然后由我们对应的寄存器控制它发送出去。

串口通信是异步的串行通信,它有波特率,那这个波特率是如何产生的?

波特率依靠的就是TH1和TL1的计算,波特率计算后续我们还会介绍到。(TH1和TL1是定时器1的功能,在使用串口通信的时候,也必须要配置TH1和TL1的工作方式,通常在这里,TH1和TL1是工作在方式2自动重载的模式 )。

这里有一个SMOD,这是通过对应的寄存器来控制倍频。

如果不倍频的话,那就是相当于这个开关打到上面这一块:

如果是倍频的话,就要将对应的值除以2,再传输到我们对应的接收和发送控制器。

接收和发送控制器根据对应的SBUF里面的传输数据控制这个控制门和移位寄存器。

如果是接收的话,把对应的RXD的数据接收到SBUF里面,然后,SBUF接收完成之后,控制寄存器会将对应的RI置1,也就是接收中断。之后就会发送串口中断的请求,向CPU发送中断请求执行中断。

也就是说当RI或者TI哪一个为1的话,它就会发送串口中断的请求。

如果是发送,我们会通过SBUF把这个数据传输到控制门,由发送控制器控制它(发送控制器也会控制中断),然后通过TXD引脚发送出去。要准备发送时会通过TI控制置1,然后发送中断请求,将我们的SBUF数据发送出去。

串口相关寄存器

我们的芯片手册上有一张比较全的串行口相关寄存器,但是我们主要介绍其中几种重要的寄存器。

串口控制寄存器SCON

PS:控制寄存器在工作流程图中的这一个位置:

SM0和SM1

SCON也有8位SM0和SM1是用来确定串口通信的工作方式,同样它也有四种方式。方式0,方式1,方式2和方式3,通过SM0和SM1的不同四种组合。

我们常用的通信使用的工作方式是方式1,10位异步收发器,8位数据,波特率是可变的,其中两位是指起始位和停止位。

SM2

SM2 是用来多机通信的控制位。

 使用串口通信时,它可以支持多机通信,什么意思?

比如,主设备的串行口TXD和RXD可以连接多个串口设备。比如说设备1设备2,这是主设备,它可以通过SM2这个位来进行控制。

使用了多机通信的话,这个SM2工作方式主要处于方式2和方式3这两种方式。 当SM2=1的时候,可以利用收到的RB8这个位来控制是否激活RI,RI就是接收中断。

如果RB8=0的时候,表示不激活RI,收到信息就丢弃。 如果当RB8=1的时候,收到的信息就会进入到SBUF缓存器当中来,并激活RI,从而接收数据。 比如,如果使用了两个设备通信的话,设备1配置的 RB8是为1的,设备2接收到RB8是0。等于1的话就可以,读取SBUF里面的数据;等于0的话就不读取。那就代表主机发送的数据是在设备1,而不是在设备2。如果设备2配置的是RB8=1,那它的数据同样也会到达设备2上面来。要忽略它的数据就使RB8接收的数据为0。

当这个SM2=0的时候,不论RB8等于0还是等于1,均可以使用收到的数据进入到SBUF。这样的话,我们在使用串口方式1,也就是不进行多机通信的时候,我们可以将SM2等于设置为0。

刚刚说过,如果设置为1的话,我们就工作在多机通信的这种方式,那这样串口通信方式可以设置为方式2和方式3,因为我们这个时候要用到了RB8,所以,数据位是9位。根据我们发送过来的数据来判断这个RB8是1还是0,从而实现是否激活这个RI。 当然在串口通信过程当中实现多机通信也可以不使用这种方式,也可以使用软件层面来实现多机通信。

REN

REN是允许接收位

REN由软件置1,置1就是启动串行口接收数据,如果这个软件设置为0,也就是REN设置为0的时候就禁止接收。当然我们在串口通信的时候肯定是需要发送和接收的,所以这位是设置为1的,也就是允许接收。   

TB8和RB8

TB8和RB8是工作在方式2和方式3的时候,可以用软件来规定作用,用作数据的机校机偶校验位,或者是在多机通信过程当中用作地址帧和数据帧的标志位。 。

在方式0和方式1的时候,TB8和RB8是没有用到的,所以,我们在串口通信的时候,这两个基本上不用管。

TI和RI

TI是发送中断标志位

在方式0的时候,当串行发送第8位数据结束的时候,或者是在其它方式串行发送停止位的时候,开始的时候内部硬件就会使这个TI置1,它就会向CPU发送中断请求,在中断服务程序当中必须用软件来清零,来取消中断申请,等待下一次的中断。

RI是接收中断标志位

在方式0的时候,当串行接收到第8位数据结束的时候,或者在其它方式串行接收停止位的中间时,由内部的硬件置1,然后发送向CPU发送中断申请。也必须在中断服务程序当中用软件将清零,清零的话就取消中断申请,等待下一次的中断申请。

小总结所以,我们在使用这个计算器SCON的时候,主要是配置SM0和SM1来选择串口通信的工作方式,通常我们选择为方式1,所以将SM0配置为SM1配置为1

然后SM2通常设置为0,因为没有使用多机通信,或者是没有使用9位数据,所以设置为0

REN我们通常在串行通信的时候,我们也要接收数据,所以要允许设置为1

TB8和RB8,我们没用到,我们默认就为0。 TI和RI是硬件自动完成。当进入中断的时候,才需要我们软件手动清零。

电源控制寄存器PCON

电源控制寄存器同样也有8位,但是,它只使用到了最高位,也是第7位。

后面的7位都没有用到。

这个寄存器的功能主要是用来对这个波特率的倍频的选择。

也就是在工作流程图的这个位置:

SMOD

SMOD=0的时候,那它是不进行倍频的。

如果是等于1的时候,这个开关是打到上面进行倍频。 在串口方式1,方式2,方式3的时候,波特率与这个SMOD的倍频值有关。

当SMOD=1的时候,波特率提高了一倍。

复位的时候,SMOD是等于0,也就打到下面来。

所以,在串口通信当中,我们使用工作方式1的时候,可以对这个SMOD的值进行配置,如果要倍频,那就设置为1,如果不倍频,那就是设置为0。

串口工作方式

我们知道通过SCON可以控制串口通信的四种工作方式,方式0,方式1,方式2,方式3。要使用哪一种方式,就通过SM0和SM1这两个值来确定。

方式0

方式0,串行口是同步移位寄存器的输入输出方式。 主要用于扩展并行输出输入和输出口。数据是由RXD,也就是P3.0这个引脚进行输入和输出的。同步移位脉冲是由TXD也就是P3.1引脚进行输出。发送和接收,均为8位数据。低位在前,高位在后。波特率固定是fosc除以12。 Fosc就是外部的晶振的频率,比如我们使用12兆,那就除以12就是1兆,就是对应方式0。

我们来看一下方式0和输出和输入格式:

方式0输出:

写入数据到SBUF到里面,然后它的数据发送和接收都是依靠RXD引脚来进行传输的,所以按照先从低位再到高位的规则,按照这个脉冲进行传输,从D0到D7,8位数据传输完成。传输完成之后TI置1,也就是中断标志位置1。

如果我们开启了中断,它会进入到中断,中断进入之后,我们要清除这个中断TI。

方式0输入

方式0输入的话,输入数据也是依靠RXD引脚来进行接收的,所以当我们接收允许的时候(REN=1作为接收允许),并且在TXD一位脉冲的情况下,数据就会一位一位的进行接收。接收同样是从低到高进行接收,接收完成之后RI置1,然后发送中断请求,接收完成之后在中断服务函数里面,我们手动给它清零,等待下一次的接收。 这是方式0,它的输出和输入的情况。

方式1

工作方式1是10位的异步通信口,TXD是发送引脚,RXD是接收引脚。 传送一帧数据的格式是这样格式:

检验位:用于数据验证(奇偶校验/无检验)

停止位:用于数据帧间隔

其中第一位是起始位,紧接着是8位的数据位,最后是停止位,一帧下来就是10位。

方式1输出。

把数据写入到SBUF这个缓存器里面后,由于方式1是异步的通信,由TH1产生波特率,在这个波特率的情况下,我们就来发送数据。然后,首先是发送低电平的起始位,然后紧接着发送8位的数据,按照从低位到高位的进行发送,发送完了之后还有高低平的停止位。同样发送完成之后,TI也会由硬件置1,代表中断。发送中断的完成,然后向CPU提出中断的请求。进入中断服务函数的时候,我们可以手动将TI清零,等待下一次的中断。

方式1输入

数据是通过RXD来进行接收的,同样它是在波段率的脉冲采样的时序上面进行接收,然后,首先它接收低电平的起始位,然后,以此类推,8位的数据位,从D0到D8,低位到高位,最后是高低平的停止位。然后接收完了之后,它会有高电平RI,表明接收完成中断,然后,开启的中断后它会进入中断服务程序,我们要手动对它进行清零。

这个位采样脉冲就是波特率,波特率的值是通过TH1和TL1的值来进行设置的,后续我们会介绍波特率的计算工具学习如何来计算它的波特率。

对于方式1,我们要对数据进行接收的话,我们还要注意要将这个REN这个中断接收使能位设置为1,接收器就会选择波特率的16倍的采样

16倍的采样是怎么来的?根据我们前面的结构图可以看得到,

这是根据生成的波特率之后,这里是除以16,也就是16分频的采样,

那它就会根据这个采样时序在RXD引角检测电平,检测到了RXD引角输入电平发生负跳变的时候,就说明起始位是有效,也就是来了下降沿的时候就有接收的这个起始位是有效的,并将其移入到输入移位寄存器当中,开始接收一帧信息,一帧信息其他的位就是我们8位的数据:

检验位:用于数据验证(奇偶校验/无检验)

停止位:用于数据帧间隔

接收了这些数据之后,数据都是从这个输入移位寄存器右边进行输入的。 移位寄存器输入的话,起始位移到这个输入移位寄存器的最左边控制电路进行最后一次移位。当这个RI等于0的时候,并且SM2=0的时候,将接收到的9位数据的前8位(不要起始位)装入到SBUF当中,这个过程是单片机内部串口进行自动完成的,而不需要我们对这个接收的数据进行去掉最高位,去掉最低位这样子的操作,这个是由串口的内部结构自动去完成。然后我们只要读取SBUF里面的数据,就可以读取到实际发送的数据了。 当接收完这个8位数据之后,紧接着是停止位,停止位是进入到RB8,并由硬件自动完成设置RI为1,也就是向中断发出请求。

如果串口的工作使用的是9位的话,它第8位数据还会继续接收。方式1是8位数据的,所以后面我们再来介绍9位的数据的情况。

方式2和方式3

方式2和方式3工作的时候是处于11位数据的异步通信。  TXD是发送引脚,RXD是接收引脚,和方式1不同的是,它是11位的,也就是它有9位数据,那我们来看一下它一帧数据的格式,它一帧是11位:起始位、9位数据、停止位,总共加起来11位。

其中起始位和停止位和方式1是类似的,不同的区别就是数据位,它是9位,增加了一个位,即RB8或TB8。

方式2和方式3输出:

发送开始的时候,起始位为0,输出到这个TXD引脚,然后输出移位寄存器的输出位从D0到TXD引脚,然后每一个移位脉冲都使输出移位寄存器的各个位一位。并由TXD引脚输出,也就是说从低位开始移位,一直到高位。 第一次移位的时候,停止位移入到输出移位寄存器的第9位上。以后每移位一次,左边都移入0。当停止位移至输出位的时候,左边其余就全部为0。检测电路检测到这一条件的时候,它就会使控制电路进行最后一次移位,并将TI设置为1,向CPU发出中断请求,这个是由硬件自动完成的。   

方式2和方式3输入:

输入跟输出的过程是类似的。 它由RXD引脚来接收这个数据,同样它是根据位采样脉冲的情况来一位一位的接收。首先是接收下降沿,认为接收开始。然后,以此类推,接收对应的数据。因为方式2和方式3处于11位数据,如果将SM2设置为0,并且RI=0的时候,接收的数据会装入到接收缓存器SBUF当中,和RB8里面。SBUF接收8个位:D0到D7,RB8是保存最后第9位数据。 接收完成之后,RI会置1,向CPU发出中断请求。如果条件不满足则数据丢弃。

数据不满足是指我们前面配置SCON这个特殊寄存器的时候,如果使用了SM2等于0,并且RI等于1的时候,它是直接将数据接收到SBUF里面。如果RB8=0的时候,它是忽略这个数据的 并且不会置位RI=1,继续搜索RXD引脚的负跳变,也就是起始号重复执行。

在串口通信当中,我们使用的主要是方1,一帧数据是10位。对于方式0、方式2和方式3,我们很少使用。

波特率的计算

接下来我们来介绍非常重要的知识点,就是串口的波特率的计算。 下面我们给出了这四种工作方式的波特率的计算公式。

方式0,它的波特率是固定的;

方式2,它的波特率也是固定的;方式1和方式3的波特率是可以更改的。

注意:

SMOD是方

T1是定时器的8位重载的模式。 Fosc是外部晶振的时钟频率,机器周期等于12乘以频率的导数1/12(震荡周期),即是12倍的震荡周期,也就是1微秒。

T1溢出率:方式2是8位的重载模式,那最大值就是256,到达了256它就会溢出,所以用256减掉初值就是实际的计数值,然后再将其倒数乘以机器周期(1微秒)。 

我们也可以不用这么复杂的计算,我们可以使用小工具来完成这个波利的换算。

默认打开这个软件都会直接定位到这个方式2。这个方式2是指定时器的方式,不是串口通信的工作方式。

串口通信的工作方式,我们使用的是方式1,从这个小工具上面也可以看到方式1和方式3,它的波动率才能更改的。我们使用的是方式1。 我们开发板的晶振频率是12兆,在串口通信当中我们一般都要使用11.0592兆晶振

波特率一般使用9600就可以了,SMOD是用来倍频的,如果将这个SMOD设置为1的话。是不是就是9600*2?不是哈,波动率依然是9600,只不过使用了SMOD=1之后,等一下计算的TH1的初值会进行变化,就相当于加倍了。

假设一开始使用不倍频,

点确定是0%误差,比较精确。

然后使用倍频看一下,现在变成了FAH,初值改变了。

为什么要使用11.0592兆的晶振?因为它的误差是零的,假设现在改成12兆,点一下确定看到误差就有了6.98%的误差,这个误差是比较大的,在串口通信过程当中,有可能会出现数据的错误,或者是乱码之类的,这个乱码的产生就是因为通信它有误差。

所以我们在串口通信,我们强烈建议使用11.0592兆的晶振,误差是为零的。

串口配置步骤

下面我们来看继续看一下串口的初始化步骤。

如图中罗列的顺序:

这个顺序的话可以不用按照这个顺序严格一步一步的来,次序可以任意。

我们首先按照这个顺序来讲解。

1.确定T1的工作方式

这个工作方式的确定是通过TMOD这个寄存器来进行设置,这个在定时器的章节当中我们也给大家讲解了,如果你不了解的话,可以回过头看一下我们定时器那一节。我们在使用串口通信的时候,我们是要使用定时器1,并且工作方式是2,也就是8位的自动重装载的模式。

2.确定串口的工作方式

有很多初学者把定时器的工作方式和串口的工作方式很容易混淆,所以在这一块一定要理解好。

定时器的工作方式是用来确定波特率的产生,我们根据串口内部结构图可以知道它只能通过TH1或者TL1,也就是定时器1产生。所以TMOD肯定是要配置定时器1的。

串口的工作方式有四种,通过SM0和SM1这两位来设置,串口通讯方式通常是使用方式1。

确定了工作方式,并且通过SCON可以使能允许接收位SMOD,允许接收位通过这个REN来进行设置。

3.计算我们T1的初值(设定波特率)

通过TH1和TL1这两个8位的寄存器的TL1进行计数,计数溢出之后,由TH1自动装载到TL1当中。所以我们要将计算的初值传入到TH1和TL1当中。 比如我们刚才使用的波特利的计算工具,

就算出来的初值等于0XFA。

那这个初值如何放入TH1和TL1当中?直接就是TH1=0XFA,TL1=0XFA。因为它是8位自动重装载,通过TL1进行开始计数,然后是重装载这个值,它要溢出之后自动装到这里TL1中,所以我们TH1TL1都要装载这个值,这就是波特率的初值的设置。   

4.启动T1(TCON中的TR1位)

5.如果使用中断,需要开启串口中断控制位

IE寄存器中ES位设置为1开启,并且要开启总中断EA。

通过这么几步,那就可以使用串口中断了。

那我们来看一下串口初始化的配置的实际代码。

这是我们自己定义的函数,没有返回值,入口参数是u8类型。

这个入口参数是用来设置波特率,方便我们在调用这个函数的时候,可以传入对应的波特率的值,这个波特率的值自然就是传到TH1和TL1当中的。

TOMD是用来设置定时器1的工作方式。它要工作在方式2,所以通过或运算不干扰到其他的位。TOMD=0010 0000

  

SCON用来设置串口通信的工作方式,那要工作方式1,并且开启了接收,允许接收为REN,那就是0X50。 SCON=0101 0000

然后PCON是对波特率的加倍设置。因为SMOD是PCON的最高位,所以PCON=1000 0000,这个1就对应到了SOMD。

然后TH1和TL1是用来设置波特率的重装载值,通过函数的入口参数传递进来。

 然后ES是开启串口的中断。

EA是总中断。

定时器需要开启所以要打开TR1=1

以上就是串口的初始化。

如果你使用中断,要更改的就是TH1和TL1的初值波特率,这个值可以通过前面介绍的这个波动率的自动计算工具,更改这个值可以改变波动率。

波特率是不是可以说任意的大小?

我们来演示一下,假设波特率现在设置为15200,我们看一下能不能到达。

点击确定,您所输入的晶振频率不能使用这个波特率,所以说不是说你想使用多大的波特率都可以的。

我们设置的11.0592兆这个晶振,它所配置的波动率的大小应该最大就是38400,而且它的误差很大,基本上这个波特率不能用。19200还是可以用的。 所以,你要使用哪个波特率可以根据你的实际的要求来使用,我们使用的是9600就可以了。 以上就是串口初始化的步骤。

下一节开始代码演示。

相关文章:

单片机学习笔记---串口通信(2)

目录 串口内部结构 串口相关寄存器 串口控制寄存器SCON SM0和SM1 SM2 REN TB8和RB8 TI和RI 电源控制寄存器PCON SMOD 串口工作方式 方式0 方式0输出: 方式0输入 方式1 方式1输出。 方式1输入 方式2和方式3 方式2和方式3输出: 方式2和…...

【Java】乐观锁有哪些常见实现方式?

Java中的乐观锁主要有两种常见的实现方式: CAS(Compare and Swap):这是实现乐观锁的核心算法。CAS操作包含三个参数:内存地址V、旧的预期值A和要修改的新值B。执行CAS操作时,会先比较内存地址V中的值是否等…...

Javaweb之SpringBootWeb案例之登录校验功能的详细解析

2. 登录校验 2.1 问题分析 我们已经完成了基础登录功能的开发与测试,在我们登录成功后就可以进入到后台管理系统中进行数据的操作。 但是当我们在浏览器中新的页面上输入地址:http://localhost:9528/#/system/dept,发现没有登录仍然可以进…...

CSS之盒模型

盒模型概念 浏览器盒模型(Box Model)是CSS中的基本概念,它描述了元素在布局过程中如何占据空间。盒模型由内容(content)、内边距(padding)、边框(border)、和外边距&…...

博客系统-SpringBoot版本

相比于之前使用Servlet来完成的博客系统,SpringBoot版本的博客系统功能更完善,使用到的技术更接近企业级,快来看看吧~ 目录 1.项目介绍 2.数据库准备 3.实体化类 4.返回格式 5.登录和注册功能 6.登出(注销)功能…...

详细分析Redis中数值乱码的根本原因以及解决方式

目录 前言1. 问题所示2. 原理分析3. 拓展 前言 对于这方面的相关知识推荐阅读: Redis框架从入门到学精(全)Java关于RedisTemplate的使用分析 附代码java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全) …...

网络专栏目录

大家好我是苏麟 , 这是网络专栏目录 . 图解网络 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 图解网络目录 基础篇 基础篇 TCP/IP网络模型有几层? : TCP/IP网络模型 键入网址到页面显示,期间发生了什么? : 键入网址到页面显示,期间发生了什么 现阶…...

【Python网络编程之Ping命令的实现】

🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之Ping命令的实现 代码见资源,效果图如下一、实验要求二、协议原理2…...

OpenHarmony轻量级驱动开发

OpenHarmony轻量级驱动开发 思维导图: https://download.csdn.net/download/lanlingxueyu/88817155 GPlO(General-purpose input/output)即通用型输入输出 描述 GPlO(General-purpose input/output)即通用型输入输出。通俗地说,GPlO口就是一些引脚可以通过它们输出高低…...

C语言如何输⼊字符数组?

一、问题 在程序中,scanf()函数可以输⼊任意类型的数据,gets()函数只能输⼊字符串等,但是如何更好地输⼊字符数组呢? 二、解答 我们知道如何使⽤格式输⼊函数 scanf(),那么可以使⽤%c 格式符逐个输⼊字符。这样输⼊有…...

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装,我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在,只需要使用哈尔特征检测得到人脸在图像中的位置,再指示舵机运…...

鸿蒙开发理论之页面和自定义组件生命周期

1、自定义组件和页面的关系 页面:即应用的UI页面。可以由一个或者多个自定义组件组成,Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…...

docker-compose部署gitlab和jenkins

通过docker-compose部署gitlab和jenkins,方便后续工作 注意: gitlab占用资源较多,最好系统内存在8G以上,CPU4核心以上,否则gitlab有可能报错无法启动。docker版本用最新版本,低版本的docker可能会导致doc…...

Pytorch 复习总结 1

Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》 本文主要内容为:Pytorch 张量的常见运算、线性代数、高等数学、概率论。 Pytorch 张量的常见运算、线性代数、高等数学、概率论 部分 见 Pytorch 复习总结 1&…...

谷歌免费开放模糊测试框架OSS-Fuzz(物联网、车联网、供应链安全、C/C++)

目录 模糊测试的智能化和自动化 模糊测试不能代替安全设计原则 AI驱动的漏洞修补...

华为配置内部人员接入WLAN网络示例(802.1X认证)

配置内部人员接入WLAN网络示例(802.1X认证) 组网图形 图1 配置802.1X认证组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 用户接入WLAN网络,使用802.1X客户端进行认证,输入正确的用户名和密…...

EXCEL中如何调出“数据分析”的菜单

今天发现,原来WPS还是和EXCEL比,还是少了“数据分析”这个日常基本做统计的菜单,只好用EXCEL了,但奇怪发现我的EXCEL中没发现这个菜单,然后查了下,才发现,要用如下的方法打开: 1&…...

基于Qt的人脸识别项目(功能:颜值检测,口罩检测,表情检测,性别检测,年龄预测等)

完整代码链接在文章末尾 效果展示 代码讲解(待更新) qt图片文件上传 #include <QtWidgets> #include <QFileDialog>...

书生谱语-大语言模型测试demo

课程内容简介 通用环境配置 开发机 InterStudio 配置公钥 在本地机器上打开 Power Shell 终端。在终端中&#xff0c;运行以下命令来生成 SSH 密钥对&#xff1a; ssh-keygen -t rsa您将被提示选择密钥文件的保存位置&#xff0c;默认情况下是在 ~/.ssh/ 目录中。按 Enter …...

2024-02-12 Unity 编辑器开发之编辑器拓展3 —— EditorGUI

文章目录 1 GUILayout2 EditorGUI 介绍3 文本、层级、标签、颜色拾取3.1 LabelField3.2 LayerField3.3 TagField3.4 ColorField3.5 代码示例 4 枚举选择、整数选择、按下按钮4.1 EnumPopup / EnumFlagsField4.2 IntPopup4.3 DropdownButton4.4 代码示例 5 对象关联、各类型输入…...

shell脚本编译与解析

文章目录 shell变量全局变量&#xff08;环境变量&#xff09;局部变量设置PATH 环境变量修改变量属性 启动文件环境变量持久化 ./和. 的区别脚本编写判断 和循环命令行参数传入参数循环读取命令行参数获取用户输入 处理选项处理简单选项处理带值选项 重定向显示并且同时输出到…...

第64讲个人中心用户操作菜单实现

静态页面 <!-- 用户操作菜单开始 --><view class"user_menu"><!-- 订单管理开始 --><view class"order_wrap"><view class"order_title">我的订单</view><view class"order_content"><n…...

线性代数的本质——1 向量

向量是线性代数中最为基础的概念。 何为向量&#xff1f; 从物理上看&#xff0c; 向量就是既有大小又有方向的量&#xff0c;只要这两者一定&#xff0c;就可以在空间中随便移动。 从计算机应用的角度看&#xff0c;向量和列表很接近&#xff0c;可以用来描述某对象的几个不同…...

工业以太网交换机引领现代工厂自动化新潮流

随着科技的飞速发展&#xff0c;现代工厂正迎来一场前所未有的自动化变革&#xff0c;而工业以太网交换机的崭新角色正是这场变革的关键组成部分。本文将深入探讨工业以太网交换机与现代工厂自动化的紧密集成&#xff0c;探讨这一集成如何推动工业生产的智能化、效率提升以及未…...

Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理

通过“添加自定义菜单”来学习menuconfig图形化配置原理&#xff0c;将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”&#xff0c;此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”&#xff0c;此配置项处于菜单“My test m…...

推荐高端资源素材图库下载平台整站源码

推荐高端图库素材下载站的响应式模板和完整的整站源码&#xff0c;适用于娱乐网资源网。该模板支持移动端&#xff0c;并集成了支付宝接口。 演示地 址 &#xff1a; runruncode.com/tupiao/19692.html 页面设计精美&#xff0c;不亚于大型网站的美工水准&#xff0c;并且用户…...

Redis实现:每个进程每30秒执行一次任务

前言 项目中要实现每一进程每30秒执行一次 代码实现: public class DistributedScheduler {private final RRedisClient redisson;private final String processKeyPrefix; // 例如 "process_"public DistributedScheduler(RRedisClient redisson) {this.redisson…...

【AI之路】使用RWKV-Runner启动大模型,彻底实现大模型自由

文章目录 前言一、RWKV-Runner是什么&#xff1f;RWKV-Runner是一个大语言模型的启动平台RWKV-Runner官方功能介绍 二、使用步骤1. 下载文件 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; ChatGPT的横空出世&#xff0c;打开了AI的大门&#xff…...

Dockerfile和.gitlab-ci.yml文件模板

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

Linux--基础开发工具篇(2)(vim)(配置白名单sudo)

目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum&#xff0c;也就是Linux系统的应用商店 Linux--基础开…...

Learn LaTeX 017 - LaTex Multicolumn 分栏

在科学排版中进行分栏操作&#xff0c;能够有效的利用页面中的空间&#xff0c;避免空白位置的浪费。 好的分栏设计能对你的排版增色不少&#xff01; https://www.ixigua.com/7298100920137548288?id7307237715659981346&logTag949adb699806392430bb...

Android 9.0 禁用adb install 安装app功能

1.前言 在9.0的系统产品定制化开发中,在进行一些定制开发中,对于一些app需要通过属性来控制禁止安装,比如adb install也不允许安装,所以就需要 熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程 2.禁用adb install 安装app功能的…...

华为第二批难题五:AI技术提升六面体网格生成自动化问题

有CAE开发商问及OCCT几何内核的网格方面的技术问题。其实&#xff0c;OCCT几何内核的现有网格生成能力比较弱。 HybridOctree_Hex的源代码&#xff0c;还没有仔细去学习。 “HybridOctree_Hex”的开发者说&#xff1a;六面体网格主要是用在数值模拟领域的&#xff0c;比如汽车…...

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…...

vscode开发FPGA(0)--windows平台搭建

一、从官网下载安装VScode Download Visual Studio Code - Mac, Linux, Windows 二、安装配置插件 1. 安装Chinese&#xff08;simplified&#xff09;中文汉化包 2.安装Verilog-HDL/systemVerilog插件(支持verilog语法) 3.配置CTags Support插件(支持代码跳转) 1)在github下…...

Java String源码剖析+面试题整理

由于字符串操作是计算机程序中最常见的操作之一&#xff0c;在面试中也是经常出现。本文从基本用法出发逐步深入剖析String的结构和性质&#xff0c;并结合面试题来帮助理解。 String基本用法 在Java中String的创建可以直接像基本类型一样定义&#xff0c;也可以new一个 Str…...

探索未来:集成存储器计算(IMC)与深度神经网络(DNN)的机遇与挑战

开篇部分&#xff1a;人工智能、深度神经网络与内存计算的交汇 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为科技领域的一股强大力量&#xff0c;而深度神经网络&#xff08;DNN&#xff09;则是AI的核心引擎之一。DNN是一种模仿人类神经系统运作…...

[C/C++] -- CMake使用

CMake&#xff08;Cross-platform Make&#xff09;是一个开源的跨平台构建工具&#xff0c;用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程&#xff0c;使得开发人员能够更方便地管理代码、依赖项和构建设置。 CMake 使用一个名为 CMakeLists.tx…...

笔记本选购配置参数详解

笔记本电脑的选购是一个技术活&#xff0c;涉及到众多的配置参数。本文将为您详细解析笔记本电脑的主要配置参数&#xff0c;帮助您在选购时做出明智的决策。 1. 处理器&#xff08;CPU&#xff09; 处理器是笔记本电脑的核心组件&#xff0c;负责执行计算任务…...

临睡之际的生死思索与生命哲学的启示

在人类生存体验中&#xff0c;有一种独特而深邃的感受——当人们准备进入梦乡时&#xff0c;会担忧第二天醒来是否还能感知到生命的律动。这种“入睡即未知”的心理状态&#xff0c;既是生命无常的深刻体现&#xff0c;也是对个体生命价值、生活态度及人生哲学的一种深度拷问。…...

QT学习(五)C++函数重载

一、 函数重载 在同一个作用域内&#xff0c;可以声明几个功能类似的同名函数&#xff0c; 这些同名函数的形式参数&#xff08;指参数的个数、类型或者顺序&#xff09;必须不同。您不能仅通过返回类型的不同来 重载函数。 下面的实例中&#xff0c;同名函数 print() 被用…...

微服务OAuth 2.1扩展额外信息到JWT并解析(Spring Security 6)

文章目录 一、简介二、重写UserDetailsService三、Controller解析JWT获取用户信息四、后记 一、简介 VersionJava17SpringCloud2023.0.0SpringBoot3.2.1Spring Authorization Server1.2.1Spring Security6.2.1mysql8.2.0 Spring Authorization Server 使用JWT时&#xff0c;前…...

Python@setter用法介绍

Pythonsetter是Python编程语言中的一个关键属性&#xff0c;它简化了Python开发者的编程过程&#xff0c;提高了编程效率。 一、Pythonsetter是什么 Pythonsetter是Python语言中的一个属性&#xff0c;它允许程序员设置Python中的类成员变量。在Python中&#xff0c;属性&…...

格子表单GRID-FORM | 文档网站搭建(VitePress)与部署(Github Pages)

格子表单/GRID-FORM已在Github 开源&#xff0c;如能帮到您麻烦给个星&#x1f91d; GRID-FORM 系列文章 基于 VUE3 可视化低代码表单设计器嵌套表单与自定义脚本交互文档网站搭建&#xff08;VitePress&#xff09;与部署&#xff08;Github Pages&#xff09; 效果预览 格…...

mac无法往硬盘里存东西 Mac硬盘读不出来怎么办 Mac硬盘格式 硬盘检测工具

mac有时候会出现一些问题&#xff0c;比如无法往硬盘里存东西&#xff0c;或者无法往硬盘上拷贝文件。这些问题会给用户带来很大的困扰&#xff0c;影响正常的工作和学习。那么&#xff0c;mac无法往硬盘里存东西&#xff0c;mac无法往硬盘上拷贝怎么办呢&#xff1f;软妹子将为…...

DataX源码分析 reader

系列文章目录 一、DataX详解和架构介绍 二、DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 文章目录 系列文章目录前言Reader组件如何处理…...

openssl3.2 - exp - RAND_bytes_ex

文章目录 openssl3.2 - exp - RAND_bytes_ex概述笔记END openssl3.2 - exp - RAND_bytes_ex 概述 生成随机数时, 要检查返回值是否成功, 不能认为一定是成功的(官方文档上有说明). 生成随机数的API, 和库上下文有关系, 使用RAND_bytes_ex()比RAND_bytes()好些. 笔记 /*! * …...

Oracle中怎么设置时区和系统时间

在Oracle数据库中&#xff0c;设置时区和系统时间可以通过多种方法实现。下面是一些常见的方法&#xff1a; 1. 设置数据库的时区 Oracle数据库允许你为每个会话或整个数据库设置时区。 a. 为整个数据库设置时区 你可以使用ALTER DATABASE语句为整个数据库设置时区。例如&a…...

常见的物联网操作系统介绍

物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;是指将各种物理设备、车辆、家用电器、工业设备等通过网络连接起来&#xff0c;实现数据交换和通信的技术。物联网操作系统是管理这些设备并使其能够相互通信的软件平台。以下是一些常见的物联网操作系统&…...

二级C语言笔试10

(总分101,考试时间90分钟) 一、选择题 1. 设有如下关系表&#xff1a; A) TR∩S B) TR∪S C) TRS D) TR/S 2. 在一棵二叉树中&#xff0c;叶子结点共有30个&#xff0c;度为1的结点共有40个&#xff0c;则该二叉树中的总结点数共有( )个。 A) 89 …...