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

03-51单片机定时器和串口通信

一、51单片机定时器

1.定时器介绍

1.1为什么要使用定时器

在前面的学习中,用到了 Delay 函数延时,这里学习定时器以后,就可以通过定时器来完成,当然定时器的功能远不止这些:

  1. 51 单片机的定时器既可以定时,又可以计数,故称之为定时器/计数器;
  2. 定时器/计数器和单片机的 CPU 是相互独立的,定时器/计数器工作的过程是自动完成的,不需要 CPU 的参与,相比于 Delay 函数需要 CPU 才能运行,节约了 CPU 资源;
  3. 51 单片机中的定时器/计数器有两种计时/计数方式:一是机器内部的时钟,二是外部的脉冲信号对寄存器中的数据加 1;
  4. 通过定时器/计数器,可以增加单片机的效率,一些简单的重复加 1 的工作可以交给定时器/计数器处理,CPU 转而处理一些复杂的事情,同时可以实现精确定时作用。

1.2定时器的结构

  • 定时器/计数器的结构示意图如下:

在这里插入图片描述

  1. T0 和 T1 引脚对应单片机的 P34 和 P35 管脚,定时器由两个特殊功能的寄存器控制:工作方式寄存器(TMOD)用于确定工作方式和功能、控制寄存器(TCON)用于控制 T0、T1 的启动和停止及设置溢出标志;

  2. 工作方式寄存器(TMOD):其低四位用于 T0,高四位用于 T1,不可位寻址:

    在这里插入图片描述

    GATE 是门控位;

    C/T :定时/计数模式选择位,C/T =0 为定时模式,C/T =1 为计数模式;

    M1和 M0:工作方式设置位,00 01 10 11 分别代表 方式0 方式1 方式2 方式3。

  3. 控制寄存器(TCON):低 4 位用于控制外部中断,高 4 位用于控制定时/计数器的启动和中断申请,可位寻址:

    在这里插入图片描述

    TF1:T1 溢出中断请求标志位,T1 计数溢出时由硬件自动置 TF1为 1,CPU 响应中断后 TF1 由硬件自动清 0;

    TR1:T1 运行控制位,TR1 置 1 时,T1 开始工作,TR1 置 0 时,T1 停止工作;

    TF0 和 TR0 同上,只不过是针对 T0 号引脚;

    IE1:外部中断 1 中断请求标志位;

    IT1:外部中断 1 中断请求标志位;

    IT0 和 IE0 同理;

    TL0和TH0:机器周期脉冲,它们每个占4字节,两个组成了8字节,TL0是低4位,TH0高4位。每发出一次脉冲,计数器 + 1,最大值为65535,超过最大值就会导致中断位置1。可以为其设置初始值,计算每一次脉冲需要多少时间,然后得到固定时间如 1ms 会发生多少次脉冲,这样就能达到计时效果。

1.3定时器工作原理

上面介绍定时器的工作方式有四种,我们主要使用方式1, 16位定时计数器,其工作模式结构体如下:

在这里插入图片描述

在这里插入图片描述

  1. STC89C52RC 单片机内有两个可编程的定时/计数器 T0、T1 和一个特殊功能定时器 T2,定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两个寄存器 TH0 和 TL0 组成,最大值为 65535;
  2. 如图时钟系统每来一个脉冲,计数系统就自动加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数器溢出回零,同时使相应的中断标志位 TF0 置 1,向 CPU 发出中断请求。如果是在计数模式,表明计数已满,类似于我们 while 循环时回写一个计数器,每运行一次+1、定时模式,表示定时时间已满,类似于之前用的delay函数,延时已到;
  3. SYSclk:系统时钟,即晶振周期,晶振是一个能发生固定频率振动的器件,本开发板上的晶振为11.0592MHz(前面说错了,但不影响代码逻辑),C/T 为0时使用系统时钟,功能相当于定时器;
  4. T0 Pin:单片机外部引脚,C/T 为 1 时使用 T0 引脚,功能相当于计数器;
  5. GATE:上面介绍它是门控位,它能决定是否能够由 TR0 或 TR1 单独控制启动定时器。如果 GATE 为 0 ,经过非门为 1 ,经过或门,不管外部中断 INTO 是什么,结果还是 1 ,然后与上 TR0 或 TR1,TR0 或 TR1 为 1 代表打开计数器,为 0 关闭,可以单独控制计数器开关状态,不受外部中断 INTO 的影响;
  6. 计数器初值与计数个数的关系为:X=2^16 - N,X 为初值,N 为个数。

1.5定时器与中断

中断系统是为了使 CPU 具有对外界紧急事件的实时处理能力而设置的。

  • 原理图:

在这里插入图片描述

如图所示,当我们正在运行某个程序的时候,发出了某些特定的 “信号” ,如:计时器结束,或计数器达到预定值的时候,就会发出中断请求,CPU 收到中断请求,暂停主程序,转而去执行中断程序,等中断程序执行完成,再返回继续执行主程序。

STC89C52RC 单片机提供了 8 个中断请求源:外部中断0(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0中断、定时器 1 中断、定时器 2 中断、串口(UART)中断。当多个中断发生的时候,具体先执行哪个中断程序,要看中断的优先级,优先级高的先执行,低的后执行。如果一个中断程序正在执行,但是有一个中断优先级更高的中断请求,这暂停当前中断程序,去执行优先级更高的中断程序,这个叫中断嵌套。

  • 中断内部结构图:

在这里插入图片描述

  • 说明:目前不使用外部中断,因此外部中断暂时不讲:
    1. T0 对应的是 P3.4 口的附加功能,TF0(TCON.5),片内定时/计数器 T0 溢出中断请求标志,当定时/计数器 T0 溢出时,TF0位置 1 ,并向 CPU 申请中断。
    2. T1 对应的是 P3.5 口的附加功能,TF1(TCON.7),片内定时/计数器 T1溢出中断请求标志,当定时/计数器 T1 溢出时,TF1位置1,并向 CPU 申请中断。
    3. EA=1 时打开总中断开关;ET0=1,开时钟中断 0;PT0=0/1,选择中断触发方式。

2.定时器案例

2.1按键控制流水灯左右移动

  • 代码演示
  • Timer0.c:
#include <REGX52.H>// 手动写的
void Timer0_Init()
{// 配置 TMOD// TMOD=0x01;TMOD=TMOD&0xF0;TMOD=TMOD|0x01;// 配置 TCONTF0=0; // 默认中断是关闭的TR0=1; // 开启0号定时器// 赋初值TH0=0xFC; // 1111 1100TL0=0x18; // 0001 1000// 配置中断ET0=1;EA=1;PT0=0;
}// 软件生成的
void Timer0Init(void)		//1毫秒@12.000MHz
{TMOD &= 0xF0;		//设置定时器模式TMOD |= 0x01;		//设置定时器模式TL0 = 0x18;		//设置定时初值TH0 = 0xFC;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时// 软件生成的不包括中断配置,要手动添加ET0=1;EA=1;PT0=0;
}// 定时器中断函数模板,因为定时器会用到主函数的一些东西
// 不太方便模块化
/*// 发生中断请求时执行的中断函数
void Timer0_Routine() interrupt 1
{	// 定义变量用于计算中断函数执行次数,应设置静态,否则函数每次调用结束就释放了,永远无法加到1000static unsigned int Count=0;// 赋初值TH0=0xFC;TL0=0x18;Count++;if(Count >= 1000) // 设置1000即执行中断函数1000次,1000ms=1s{Count=0;}
}*/
  1. 配置 TMOD 的时候,可以直接给它赋值,如TMOD=0x01,但这样有个坏处就是只能给 Timer0 设置,如果本来 Timer1 就有设置,那么这种写法会将高四位置0,将 Timer1 的设置清空。因此,可以先将原本的 TMOD 按位与清空低四位:TMOD=TMOD&0xF0,按位与,遇 1 不变,遇 0 置 0 ;再将 TMOD 按位与上对应的断码,只设置低四位:TMOD |= 0x01。这样就完成了只针对 Timer0 的设置,同时不影响 Timer1 ;

  2. 这里的 TMOD 配置,使用方式1,定时模式,Timer1 时钟,TR0 单独控制,参照表格,将对应位赋值就行;

  3. 配置 TCON 的时候,TF0=0将中断默认设置为关闭,如果设置 1 的话,那么一运行就会发生中断;

  4. 计数器赋初值的时候,因为其由两个四位组成,因此分别对高 4 位和低 4 位赋值。单片机内部时钟频率是外部时钟的 12 分频,12MHZ 晶振,单片机内部的时钟频率就是 12/12MHZ,机器周期=1/1M=1us,即每 1 纳秒发送一个脉冲,计数器加一,那么要想定时 1ms 就需要 1000 次脉冲,但计数器最大值为 65535 ,65536时溢出中断,因此,只需要将初始值赋为 64535 即可;

    64535 == 1111 1100 0001 1000;将其分为高低4位就是:
    TH0=0xFC; // 1111 1100
    TL0=0x18; // 0001 1000不过还另外一种写法:
    TH0=65534/256;
    TL0=65534%256;
    
  5. 中断函数不需要放到主函数里去运行,当发出中断信号的时候,会触发其自动调用。每执行一次中断函数,都要为其赋初值,因为溢出后计数器会变 0,不赋初值,下一次会从 0 开始计数,而不是从我们指定值开始。

  • Timer0.h:
#ifndef __TIMER0_H__
#define __TIMER0_H__// 软件生成的
void Timer0Init(void);#endif
  • Key.c:
#include <REGX52.H>
#include "Delay.h"unsigned char Key()
{unsigned char Num=0;if(P3_1==0){Delayxms(20);while(P3_1==0);Delayxms(20);Num=1;}if(P3_0==0){Delayxms(20);while(P3_0==0);Delayxms(20);Num=2;}if(P3_2==0){Delayxms(20);while(P3_2==0);Delayxms(20);Num=3;}if(P3_3==0){Delayxms(20);while(P3_3==0);Delayxms(20);Num=4;}return Num;
}
  • Key.h:
#ifndef __KEY_H__
#define __KEY_H__unsigned char Key();#endif
  • main.c:
#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include <INTRINS.H>// KeyNum用于保存独立按键的键盘对应数值
// LEDMode用于保存流水灯方向的状态值,为1,流水灯从 D1 - D8 ,反之 D8 - D1
unsigned char KeyNum,LEDMode;void main()
{// 设置默认 D1 亮P2=0xFE;// 初始化定时器Timer0Init();while(1){KeyNum=Key();if(KeyNum){if(KeyNum==1){// 按键控制 LEDMode 在 0 和 1 之间切换LEDMode++;if(LEDMode>=2)LEDMode=0;}}}
}void Timer0_Routine() interrupt 1
{static unsigned int Count;// 赋初值TL0 = 0x18;		TH0 = 0xFC;		Count++;		if(Count>=500) // 每 0.5 s执行一次中断函数{Count=0;if(LEDMode==0)P2=_crol_(P2,1); // 左移函数if(LEDMode==1)P2=_cror_(P2,1); // 右移函数}
}
  • 说明:
    1. 上面代码执行的效果,默认执行流水灯 D1 - D8 每 0.5 秒移动一个,按一次 K1 就变成 D8 - D1 移动,再按一次又恢复 D1 - D8 移动,如此循环;
    2. _crol__cror_是官方只带的库函数,使用时需要包含头文件#include <INTRINS.H>,分别代表左移和右移,第一个参数是要操作的8位寄存器,第二个参数是每次移动的步数;
    3. 要清除这里的左移右移并不是对于我们单片机上的 LED 的左移右移,因为有的 LED 是左到右由低到高排列的,有点是由高到低。其实际是相对一个一字节寄存器的8位就行左右移动的,一般左为低位,右为高位,左移就是低位到高位,右移就是高位到低位。因此,_crol_函数可以理解为是低位到高位移动,_cror_函数是高位到低位移动。

2.2 LCD1602 显示时钟

  • 代码演示
#include <REGX52.H>
#include "LCD1602.h"
#include "Timer0.h"unsigned char Hour, Min, Sec, flag;void main()
{// 初始化 LCD1602LCD_Init();// 初始化 Timer0Timer0Init();LCD_ShowChar(2, 3, ':');LCD_ShowChar(2, 6, ':');while(1){// 显示时间LCD_ShowNum(2, 1, Hour, 2);LCD_ShowNum(2, 4, Min, 2);LCD_ShowNum(2, 7, Sec, 2);}
}void Timer0_Routine() interrupt 1
{	static unsigned int Count;// 赋初值TH0=0xFC;TL0=0x18;Count++;if(Count >= 1000){flag++;if(flag>=2)flag=0;if(flag==0)LCD_ShowString(1, 1, "MyClock ^_^     ");else if(flag==1)LCD_ShowString(1, 1, "MyClock ^.^     ");Count=0;Sec++;if(Sec>=60){Sec=0;Min++;if(Min>=60){Min=0;Hour++;if(Hour>=24){Hour=0;}}}}
}
  • 说明:代码运行效果,就是一个普通的时钟显示,以24小时格式显示,上面的小表情每秒变换一次,这个代码的逻辑很简单,就不详细解释了。

二、串口通信

1.串口通信介绍

1.1串口通信方式分类

51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。

  • 按数据传输方式分为:

    1. 串行通信:指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。只需要少数几条线就可以在系统间交换信息,适用于计算机与计算机、计算机与外设之间的远距离通信。可以理解为只有一条通道传输,同一时间只能过一位数据;
    2. 并行通信:通常是将数据字节的各位用多条数据线同时进行传送,通常是 8位、16 位、32 位等数据一起传输。可以理解为,一条通道同一时间只能传输一位数据,但它是多条通道,因此同一时间可以传输多位数字。
  • 按数据同步方式分为:

    1. 异步通信:指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致;
    2. 同步通信:要建立发送方时钟对接收方时钟的直接控制,通信双方靠一根时钟线来约定通信速率,使双方达到完全同步。
  • 按数据传输方向分为:

    1. 单工:通信只能由一方发送到另一方,不能反向传输;
    2. 半双工:通信双方可以互相传输数据,但必须分时复用一根数据线,即同一时刻只能一方给另外一方发,不能同时给对方发;
    3. 全双工:通信双方可以在同一时刻互相传输数据。

1.2硬件电路

在这里插入图片描述

  1. 简单双向串口通信有两根通信线(发送端TXD和接收端RXD);
  2. TXD与RXD要交叉连接,即一台计算机的TXD要与另外一台电脑的RXD连接;
  3. 当只需单向的数据传输时,可以直接一根通信线,发送的计算机接TXD,接收的计算机接RXD;
  4. 当电平标准不一致时,需要加电平转换芯片。

1.3电平标准

串口常用的电平标准有如下三种:

  1. TTL电平:5V 表示 1,0V 表示 0,电平值是相对于 GND 而言的;
  2. RS232电平:-3~-15V 表示1,3~15V 表示 0,电平值是相对于 GND 而言的;
  3. RS485电平:两线压差 2~6V 表示1,-2~-6V 表示 0(差分信号),电平值是两根导线的压差。

1.4UART的工作模式

STC89C52的UART有四种工作模式:

  1. 模式0:同步移位寄存器(00);
  2. 模式1:8位UART,波特率可变,常用(01);
  3. 模式2:9位UART,波特率固定(10);
  4. 模式3:9位UART,波特率可变(11)。

1.5串口参数和时序图

串口参数:

  1. 波特率:串口通信的速率,发送和接收各数据位的间隔时间,因为这里的串口通信是异步通信,没有时钟线,因此为保证收发数据的准确性,需要保证两个设备的波特率一致;
  2. 比特率:每秒钟传输二进制代码的位数,单位是:位/秒( bps);
  3. 检验位:用于数据验证,校验方法有奇校验(odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity);
  4. 停止位:用于数据帧间隔。

在这里插入图片描述

9位数据格式比8位数据格式多了1位数据,是检验位,主要用于检验数据是否有误。

因为数据是一位一位的发,每发一字节8位数据就会在接收端重组这八位数据得到一字节数据,每字节前后会有起始位和停止位,就是为了标记什么时候开始的一字节数据传输,什么时候一字节传输完成,接收方可以重组数据了。

1.6串口模式图

在这里插入图片描述

  1. SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,将数据写入发送寄存器来发送,读操作时,将接收到的数据读到接收寄存器;
  2. 通过时钟 Timer1 的溢出率控制波特率,经过 2 分频或 16 分频来控制收发控制器的采样时间;
  3. 当有数据发送或者有数据接收完成的时候,都会产生中断申请,执行中断函数。

1.7串口相关寄存器

在这里插入图片描述

  • 串口控制寄存器 SCON
  1. FE用来检测帧错误,这里我们用不到;
  2. SM0 和 SM1 为工作方式选择位:有四种模式,1.4节有介绍,这里我们使用模式1,赋值 01;
  3. SM2 是模式2和模式3使用的,这里不介绍,可以去看单片机手册;
  4. REN 允许/禁止串口接收数据,为 1 允许,为 0 禁止;
  5. TI 发送中断标志位;
  6. RI 接收中断标志位。
  • 电源控制寄存器 PCON:SMOD 波特率倍增位。在串口方式 1、方式 2、方式 3 时,波特率与 SMOD 有关,当 SMOD=1 时,波特率提高一倍。复位时,SMOD=0。

2.串口通信案例

2.1通过串口发送数据到电脑

  • 代码演示
  • Uart.c:
#include <REGX52.H>void Uart_Init()
{// 串口配置PCON &= 0x7F; // 将第八位置0,其他位不变SCON=0x40; // 0100 0000// 定时器配置TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x20;		//设置定时器模式TL1 = 0xFA;		//设定定时初值TH1 = 0xFA;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1
}void Uart_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);TI=0;
}
  • 说明:

    1. 该案例只接收数据,不发送数据,什么模式一通信,因此SCON=0x40
    2. TI:发送中断标志位,在中断服务程序中,必须用软件将其清 0,取消此中断申请,因此这里的函数中加上了TI=0
    3. 这里配置时钟是配置的 Timer1 ,初始化函数可以通过软件生成,但是要设置好对应参数,如图:

    在这里插入图片描述

  • Uart.h:

#ifndef __UART_H__
#define __UART_H__void Uart_Init();
void Uart_SendByte(unsigned char Byte);#endif
  • main.c:
#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"unsigned char sec;void main()
{// 初始化串口Uart_Init();while(1){// 通过串口发送数据Uart_SendByte(sec);Delayxms(1000);sec++;}
}
  • 说明:其运行的结果是单片机通过串口每秒给电脑发送一个字节的数据,从0开始递增,显示格式位十六进制。

2.2电脑通过串口控制 LED

  • 代码演示
  • Uart.c:
#include <REGX52.H>void Uart_Init()
{// 串口配置PCON &= 0x7F; // 将第八位置0,其他位不变SCON=0x50; // 0101 0000 允许接收// 定时器配置TMOD &= 0x0F;		//设置定时器模式TMOD |= 0x20;		//设置定时器模式TL1 = 0xFA;		//设定定时初值TH1 = 0xFA;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1// 使能中断EA=1;ES=1;
}void Uart_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);TI=0;
}// 中断函数,用于电脑给单片机发送数据(模板)
/*
void Uart_Routine() interrupt 4
{if(RI==1){P2=~SBUF;Uart_SendByte(SBUF);RI=0;}
}
*/
  • Uart.h:
#ifndef __UART_H__
#define __UART_H__void Uart_Init();
void Uart_SendByte(unsigned char Byte);#endif
  • main:
#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"unsigned char sec;void main()
{// 初始化串口Uart_Init();while(1){}
}void Uart_Routine() interrupt 4
{if(RI==1){P2=~SBUF;Uart_SendByte(SBUF);RI=0;}
}
  1. 代码演示效果,通过电脑给单片机发送一字节数据,如发送 ff ,单片机 LED 灯全亮,同时单片机会回给电脑相同的数据;
  2. 这里将SCON=0x50设置为允许接收数据,同时相比上一个案例添加了中断使能;
  3. RI:接收中断标志位,在中断服务程序中,必须用软件将其清 0,取消此中断申请,因此这里的中断函数中加上了RI=0
  4. 因为这里的RI 和 TI是或门,不管谁中断标志位置1了都会发送中断请求,因此需要在这里判断到底是谁发出来中断请求;
  5. 中断序号查询下表:

在这里插入图片描述

相关文章:

03-51单片机定时器和串口通信

一、51单片机定时器 1.定时器介绍 1.1为什么要使用定时器 在前面的学习中&#xff0c;用到了 Delay 函数延时&#xff0c;这里学习定时器以后&#xff0c;就可以通过定时器来完成&#xff0c;当然定时器的功能远不止这些&#xff1a; 51 单片机的定时器既可以定时&#xff…...

系统架构设计师考点—项目管理

一、备考指南 项目管理主要考查的是进度管理、软件配置管理、质量管理、风险管理等相关知识&#xff0c;近几年都没有考查过&#xff0c;但是有可能在案例分析中考查关键路径的技术问题&#xff0c;考生了解为主。 二、重点考点 1、项目的十大管理&#xff08;速记&#xff1…...

代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

目录 509.斐波那契数 动态规划五部曲&#xff1a; 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 2.确定递推公式 3.dp数组如何初始化 4.确定遍历顺序 5.举例推导dp数组 70.爬楼梯 动态规划五部曲&#xff1a; 1.确定dp数组&#xff08;dp table&#xff09;…...

【2024年华为OD机试】 (A卷,100分)- 总最快检测效率(Java JS PythonC/C++)

一、问题描述 题目描述 在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。 每名采样员的效率不同&#xff0c;采样效率为 N 人/小时。由于外界变化&#xff0c;采样员的效率会以 M 人/小时为粒度发生变化&#xff0c;M 为采样效率浮动粒度&#xf…...

【大数据】Apache Superset:可视化开源架构

Apache Superset是什么 Apache Superset 是一个开源的现代化数据可视化和数据探索平台&#xff0c;主要用于帮助用户以交互式的方式分析和展示数据。有不少丰富的可视化组件&#xff0c;可以将数据从多种数据源&#xff08;如 SQL 数据库、数据仓库、NoSQL 数据库等&#xff0…...

LabVIEW调用不定长数组 DLL数组

在使用 LabVIEW 调用 DLL 库函数时&#xff0c;如果函数中的结构体包含不定长数组&#xff0c;直接通过 调用库函数节点&#xff08;Call Library Function Node&#xff09; 调用通常会遇到问题。这是因为 LabVIEW 需要与 DLL 中的数据结构完全匹配&#xff0c;而包含不定长数…...

MySQL 17 章——触发器

在实际开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;有2个或者多个相关联的表&#xff0c;比如商品信息表和库存信息表&#xff0c;分别存放在两个不同的数据表中&#xff0c;我们在添加一条新商品记录的时候&#xff0c;为了保证数据的完整性&#xff0c;必须同时在…...

面向对象分析与设计Python版 面向对象设计方法

文章目录 前言一、职责驱动设计二、职责驱动设计-案例 前言 面向对象设计目标&#xff1a;在面向对象分析建立的领域模型的基础上&#xff0c;定义对象操作&#xff08;职责&#xff09;。为对象分配职责的方法有&#xff1a; 职责驱动设计遵循GRASP设计原则&#xff08;Gene…...

GB/T 19582.1-2008主要内容

标准背景与概述 GB/T 19582.1-2008是由中国国家标准化管理委员会发布的国家标准&#xff0c;旨在指导和规范基于Modbus协议的工业自动化网络的设计和实施。该标准由全国工业过程测量控制和自动化标准化技术委员会&#xff08;TC124&#xff09;归口&#xff0c;并由中国机械工…...

[石榴翻译] 维吾尔语音识别 + TTS语音合成

API网址 丝路AI平台 获取 Access token 接口地址&#xff1a;https://open.xjguoyu.cn/api/auth/oauth/token&#xff0c;请求方式&#xff1a;GET&#xff0c;POST Access token是调用服务API的凭证&#xff0c;调用服务API之前需要获取 token。每次成功获取 token 以后只有…...

算法题(32):三数之和

审题&#xff1a; 需要我们找到满足以下三个条件的所有三元组&#xff0c;并存在二维数组中返回 1.三个元素相加为0 2.三个元素的下标不可相同 3.三元组的元素不可相同 思路&#xff1a; 混乱的数据不利于进行操作&#xff0c;所以我们先进行排序 我们可以采取枚举的方法进行解…...

webpack03

什么是source-map 将代码编译压缩之后&#xff0c;&#xff0c;可以通过source-map映射会原来的代码&#xff0c;&#xff0c;&#xff0c;在调试的时候可以准确找到原代码报错位置&#xff0c;&#xff0c;&#xff0c;进行修改 source-map有很多值&#xff1a; eval &#…...

组会 | SNN 的 BPTT(backpropagation through time)

目录 1 神经学基础知识1.1 神经元1.2 神经元之间的连接1.3 膜电位1.4 去极化与超极化 2 SNN2.1 LIF 模型2.2 BPTT 中存在的问题2.3 梯度爆炸或消失问题 前言&#xff1a; 本博仅为组会总结&#xff0c;如有谬误&#xff0c;请不吝指正&#xff01;虽然标题为 BPTT&am…...

CDA数据分析师一级经典错题知识点总结(3)

1、SEMMA 的基本思想是从样本数据开始&#xff0c;通过统计分析与可视化技术&#xff0c;发现并转换最有价值的预测变量&#xff0c;根据变量进行构建模型&#xff0c;并检验模型的可用性和准确性。【强调探索性】 2、CRISP-DM模型Cross Industry Standard Process of Data Mi…...

django基于Python的电影推荐系统

Django 基于 Python 的电影推荐系统 一、系统概述 Django 基于 Python 的电影推荐系统是一款利用 Django 框架开发的智能化应用程序&#xff0c;旨在为电影爱好者提供个性化的电影推荐服务。该系统通过收集和分析用户的观影历史、评分数据、电影的属性信息&#xff08;如类型…...

JVM与Java体系结构

一、前言: Java语言和JVM简介: Java是目前最为广泛的软件开发平台之一。 JVM:跨语言的平台 随着Java7的正式发布&#xff0c;Java虚拟机的设计者们通过JSR-292规范基本实现在Java虚拟机平台上运行非Java语言编写的程序。 Java虚拟机根本不关心运行在其内部的程序到底是使用何…...

网络授时笔记

SNTP的全称是Simple Network Time Protocol&#xff0c;意思是简单网络时间协议&#xff0c;用来从网络中获取当前的时间&#xff0c;也可以称为网络授时。项目中会使用LwIP SNTP模块从服务器(pool.ntp.org)获取时间 我们使用sntp例程&#xff0c;sntp例程路径为D:\Espressif\…...

【CSS】HTML页面定位CSS - position 属性 relative 、absolute、fixed 、sticky

目录 relative 相对定位 absolute 绝对定位 fixed 固定定位 sticky 粘性定位 position&#xff1a;relative 、absolute、fixed 、sticky &#xff08;四选一&#xff09; top&#xff1a;距离上面的像素 bottom&#xff1a;距离底部的像素 left&#xff1a;距离左边的像素…...

spark汇总

目录 描述运行模式1. Windows模式代码示例 2. Local模式3. Standalone模式 RDD描述特性RDD创建代码示例&#xff08;并行化创建&#xff09;代码示例&#xff08;读取外部数据&#xff09;代码示例&#xff08;读取目录下的所有文件&#xff09; 算子DAGSparkSQLSparkStreaming…...

【Rust自学】11.5. 在测试中使用Result<T, E>

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.5.1. 测试函数返回值为Result枚举 到目前为止&#xff0c;测试运行失败的原因都是因为触发了panic&#xff0c;但可以导致测试失败的…...

Sping Boot教程之五十四:Spring Boot Kafka 生产者示例

Spring Boot Kafka 生产者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…...

设计模式-结构型-组合模式

1. 什么是组合模式&#xff1f; 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说&#xff0c;组合模式允…...

基于Java的推箱子游戏设计与实现

基于Java的推箱子游戏设计与实现 摘 要 社会在进步&#xff0c;人们生活质量也在日益提高。高强度的压力也接踵而来。社会中急需出现新的有效方式来缓解人们的压力。此次设计符合了社会需求&#xff0c;Java推箱子游戏可以让人们在闲暇之余&#xff0c;体验游戏的乐趣。具有…...

Spark vs Flink分布式数据处理框架的全面对比与应用场景解析

1. 引言 1.1 什么是分布式数据处理框架 随着数据量的快速增长&#xff0c;传统的单机处理方式已经无法满足现代数据处理需求。分布式数据处理框架应运而生&#xff0c;它通过将数据分片分布到多台服务器上并行处理&#xff0c;提高了任务的处理速度和效率。 分布式数据处理框…...

python_excel列表单元格字符合并、填充、复制操作

读取指定sheet页&#xff0c;根据规则合并指定列&#xff0c;填充特定字符&#xff0c;删除多余的列&#xff0c;每行复制四次&#xff0c;最后写入新的文件中。 import pandas as pd""" 读取指定sheet页&#xff0c;根据规则合并指定列&#xff0c;填充特定字…...

nums[:]数组切片

问题&#xff1a;给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 使用代码如下没有办法通过测试示例&#xff0c;必须将最后一行代码改成 nums[:]nums[-k:]nums[:-k]切片形式&#xff1a; 原因&#xff1a;列表的切片操作 …...

【Arthas 】Can not find Arthas under local: /root/.arthas/lib 解决办法

报错 [INFO] JAVA_HOME: /opt/java/openjdk [INFO] arthas-boot version: 4.0.4 [INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER. [1]: 12 org.springframework.boot.loader.JarLauncher 1 [ER…...

录用率23%!CCF推荐-B类,Early Access即可被SCI数据库收录,中美作者占比过半

International Journal of Human-Computer Interaction&#xff08;IJHCI&#xff09;创刊于1989年&#xff0c;由泰勒-弗朗西斯&#xff08;Taylor & Francis, Inc.&#xff09;出版&#xff0c;主要发表关于交互式计算&#xff08;认知和人体工程学&#xff09;、数字无障…...

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略&#xff0c;它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意&#xff0c;将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描&#xff0c;寻找可入侵的目标时&…...

Vue_API文档

Vue API风格 Vue 的组件可以按两种不同的风格书写&#xff1a;选项式 API&#xff08;Vue2&#xff09; 和组合式 API&#xff08;Vue3&#xff09; 大部分的核心概念在这两种风格之间都是通用的。熟悉了一种风格以后&#xff0c;你也能够很快地理解另一种风格 选项式API(Opt…...

网站消耗流量/产品线上营销推广方案

作为工程师&#xff0c;我们知道我们应该避免重新发明轮子。 如果可以的话&#xff0c;我们想使用其他人编写的库为我们做一些繁重的工作。 在本文中&#xff0c;我将与您分享一些有关如何利用DLL(或任何其他具有COM类型信息的文件&#xff0c;例如TLB或OCX文件)中的现有库的知…...

jira confluence做网站/自动收录网

导读&#xff1a;电脑是一种高科技产品&#xff0c;它能够给工作、生活带来极大的方便&#xff0c;同时还具有娱乐功能。它操作一点都不费力&#xff0c;特别适合中老年人的生理特点。经常使用电脑可以健脑增智。电脑的操作需要手眼的配合&#xff0c;人的手指内有丰富的神经&a…...

做市级网站需要什么/百度风云榜

学校将对“学伴”项目进行全面评估&#xff0c;认真总结反思&#xff0c;不断改进工作&#xff0c;不负社会各界对山东大学的期望。全文569字&#xff0c;阅读约需要1分钟据山东大学官方微博消息&#xff0c;近日&#xff0c;网络中关于我校举办中外学生“学伴”项目的评论&…...

淘宝联盟的网站管理怎么做/社交媒体营销三种方式

一、原理、标准相关 1、DCT变换公式 2、量化与反量化公式 3、量化参数QP与量化组QG 4、率失真量化RDOQ...

建设购物网站/百度一下百度搜索

1&#xff0c;Socket通信原理图解 2&#xff0c;Socket套接字概述&#xff1a; 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。 通信的两端都有Socket。 网络通信其实就是Socket间的通信。 数据在两个Socket间通过IO流传输。 Socket在应…...

不让网站在手机怎么做/进入百度app

IDC评述网&#xff08;idcps.com&#xff09;11月04日报道&#xff1a;根据百度统计的最新数据显示&#xff0c;10月国内浏览器市场份额情况整体呈现下降趋势&#xff0c;其中IE的份额为47.75%&#xff0c;环比上月&#xff0c;下降了0.70%&#xff0c;降幅最大。而Chrome则扭转…...