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

51单片机嵌入式开发:13、STC89C52RC 之 RS232与电脑通讯

STC89C52RC 之 RS232与电脑通讯

  • 第十三节课,RS232与电脑通讯
  • 1 概述
  • 2 Uart介绍
    • 2.1 概述
    • 2.2 STC89C52UART介绍
    • 2.3 STC89C52 UART寄存器介绍
    • 2.4 STC89C52 UART操作
  • 3 C51 UART总结


在这里插入图片描述

第十三节课,RS232与电脑通讯

1 概述

RS232(Recommended Standard 232)是一种常用的串行通信接口标准,用于在计算机和外部设备之间传输数据。RS232是由电子工业协会(Electronic Industries Association)制定的,最初是为了连接计算机和调制解调器之间进行数据通信而设计的。以下是关于RS232的一些基本介绍:
(1) 物理接口:RS232使用传统的串行通信方式,使用一对差分信号线进行数据传输。常见的RS232物理接口是使用DB-9或DB-25连接器,其中DB-9连接器具有9个引脚,而DB-25连接器具有25个引脚。
(2) TTL信号:RS232使用两个信号线(通常称为TX和RX)来传输数据。这些信号线与地之间的电压差表示二进制数据的逻辑状态。通常,高电平表示逻辑1,低电平表示逻辑0。RS232底层一般是由UART电路转化而来,如图所示。
在这里插入图片描述

(3) 通信速率:RS232支持多种通信速率(波特率),典型的速率包括2400、4800、9600、19200、38400、57600和115200等。通信双方必须在相同的波特率下进行通信才能正常传输数据。
(4) 数据格式:RS232通信使用异步串行传输方式,其中数据被分为连续的字节进行传输。每个字节包含起始位、数据位、可选的奇偶校验位和停止位。数据位的常见大小为8位。
(5) 控制信号:除了数据传输信号外,RS232还定义了一些控制信号,用于控制通信过程。其中包括RTS(请求发送)、CTS(发送就绪)、DTR(数据终端就绪)和DSR(数据设备就绪)等信号。
(6) 通信距离和线缆:由于RS232信号受到信号损耗和干扰的影响,其通信距离较短,通常不超过50英尺(15米)。常见的RS232线缆是使用三线链接,其中包括发送线、接收线和地线。
(7) 应用领域:RS232广泛应用于计算机和外部设备之间的串行通信,例如连接调制解调器、打印机、终端、传感器、工业设备和其他串口设备等。
需要注意的是,随着技术的发展,RS232逐渐被更快速、更先进的通信接口(如USB、Ethernet等)所取代,但在某些特定的应用场景中仍然广泛使用。

2 Uart介绍

2.1 概述

UART(Universal Asynchronous Receiver-Transmitter)是一种常见的串行通信接口,用于在计算机系统或微控制器与外部设备之间进行数据传输。UART是一个硬件模块,用于将并行数据转换为串行数据以进行传输,并将接收到的串行数据转换为并行数据。
以下是关于UART的一些基本信息:
(1) 功能:UART负责将并行数据转换为串行数据并发送,同时接收串行数据并将其转换为并行数据。它提供了一种异步通信的方式,其中数据被分为连续的字节进行传输。
(2) 数据传输:UART使用两个信号线进行数据传输:一个用于发送数据(TX,传输线路),另一个用于接收数据(RX,接收线路)。发送方将并行数据转换为连续的位流,并通过发送线路将其发送给接收方。接收方通过接收线路接收位流,并将其重新转换为并行数据。
(3) 波特率:UART通信使用波特率来定义数据传输的速率。波特率是指每秒传输的位数。通信双方必须在相同的波特率下进行通信才能正确传输和接收数据。
(4) 数据格式:UART通信中的数据帧通常由起始位、数据位、可选的奇偶校验位和停止位组成。起始位用于指示数据传输的开始,停止位用于指示数据传输的结束。数据位的大小一般为5、6、7或8位。
(5) 逻辑电平:UART通信使用逻辑电平来表示数据的逻辑状态。通常,高电平表示逻辑1,低电平表示逻辑0。逻辑电平的具体电压取决于特定的电平标准,如TTL(Transistor-Transistor Logic)或CMOS(Complementary Metal-Oxide-Semiconductor)。
(6) 缓冲区:UART通信中,发送方和接收方通常都具有缓冲区用于临时存储数据。发送方将数据写入发送缓冲区,而接收方从接收缓冲区读取接收到的数据。
(7) 应用领域:UART广泛应用于各种设备和系统中,包括嵌入式系统、传感器、通信模块、无线模块、显示器、调制解调器、打印机和许多其他外部设备。
需要注意的是,UART是一种硬件接口,与特定的通信协议无关。在实际应用中,UART通常与其他协议(如RS232、RS485等)结合使用,以实现特定的数据传输要求。

2.2 STC89C52UART介绍

STC89C52中的串行I/O端口与80C52中的串口兼容。它提供同步和异步通信模式。它作为通用异步收发器(UART)在三种全双工模式(模式1、2和3)下运行。异步传输和接收可以同时发生,并且具有不同的波特率串行I/O端口包括以下增强功能:
•帧错误检测
•自动地址识别
(1) UART模块:STC89C52芯片内部集成了一个UART模块,该模块提供了与外部设备进行串口通信的功能。
(2) 引脚:串口通信需要使用芯片上的特定引脚与外部设备连接。在STC89C52中,串口通信使用P3.0(RXD)和P3.1(TXD)引脚。其中,RXD引脚用于接收数据,TXD引脚用于发送数据。

在这里插入图片描述

(3) 波特率设置:UART通信的一个重要参数是波特率,它定义了数据传输的速率。在STC89C52中,可以通过设置相关的寄存器来配置波特率。常见的波特率设置可以是9600、19200、38400、57600等。
(4) 数据格式:UART通信涉及的数据格式包括数据位、奇偶校验和停止位等。在STC89C52中,可以通过设置寄存器来配置数据位数、奇偶校验和停止位数。常见的数据格式是8位数据位、无奇偶校验和1个停止位。
(5) 缓冲区:STC89C52的UART模块具有发送和接收缓冲区,用于临时存储数据。发送数据时,将数据写入发送缓冲区,然后UART模块将数据从缓冲区发送到TXD引脚。接收数据时,UART模块从RXD引脚接收数据,并将数据存储在接收缓冲区中,供单片机读取。
(6) 中断:STC89C52的UART模块支持中断机制,可以通过配置相关的中断寄存器来启用接收和发送中断。使用中断可以提高串口通信的效率和可靠性。
(7) 编程:使用STC89C52的串口通信功能,需要在单片机程序中配置相关的寄存器和处理接收和发送的数据。具体的编程方式和操作方法可以参考STC89C52的数据手册和开发工具的相关文档。

2.3 STC89C52 UART寄存器介绍

UART寄存器用于配置和控制UART通信的参数和操作。以下是STC89C52中与UART相关的一些常用寄存器:
(1) SCON(Synchronous Control Register):用于配置UART的工作模式和控制UART的操作。其中的位字段包括:
SM0和SM1:UART工作模式选择位,用于设置UART的工作模式(如波特率、数据位数、校验位等)。
REN:接收使能位,用于启用或禁用UART的接收功能。
TI:发送中断标志位,用于指示上一次发送是否完成。
RI:接收中断标志位,用于指示接收到数据。
(2) TMOD(Timer/Counter Mode Register):用于配置定时器/计数器的工作模式。其中的位字段包括:
T1M1和T1M0:定时器1工作模式选择位。
T0M1和T0M0:定时器0工作模式选择位。
TH1和TL1(Timer1 High Byte 和 Timer1 Low Byte):用于配置定时器1的初值,从而设置UART的波特率。
(3) PCON(Power Control Register):用于配置和控制电源管理功能。其中的位字段包括:
SMOD:串口模式选择位,用于控制UART的波特率加倍。
其他位字段用于配置和控制其他电源管理功能。
(4) SBUF(Serial Buffer Register):用于存储UART接收和发送的数据。
这些寄存器提供了对UART通信的配置和控制,您可以根据具体的需求和应用,对这些寄存器进行适当的设置和操作。

2.4 STC89C52 UART操作

(1)简单的接收发送程序

/******************************************************************/
void sys_uart_init(void)
{SCON  = 0x50;		        /* SCON: 模式 1, 8-bit UART, 使能接收         */TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */TH1   = 0xFD;               /* TH1:  reload value for 9600 baud @ 11.0592MHz   */TR1   = 1;                  /* TR1:  timer 1 run                          */EA    = 1;                  /*打开总中断*/ES    = 1;                  /*打开串口中断*/}/******************************************************************/
/*                  串口中断程序                                  */
/******************************************************************/static unsigned char Temp = 0;          //定义临时变量 void UART_isr(void) interrupt 4 //串行中断服务程序
{if(RI)                        //判断是接收中断产生{RI=0;                      //标志位清零Temp=SBUF;                 //读入缓冲区的值P1=Temp;                   //把值输出到P1口,用于观察SBUF=Temp;                 //把接收到的值再发回电脑端}if(TI)                        //如果是发送标志位,清零{TI=0;}
}

(2)带有一定校验判断功能的用法

/******************************************************************/
/*                  串口中断程序                                  */
/******************************************************************/static unsigned char uart_temp = 0;          //定义临时变量 
static unsigned char uart_cnt = 0;          //定义临时变量 void UART_isr(void) interrupt 4 //串行中断服务程序
{if(RI)                        //判断是接收中断产生{RI=0;                      //标志位清零uart_temp=SBUF;                 //读入缓冲区的值if(uart_cnt==0){if(0x02 == uart_temp){uart_cnt = 1;}else{uart_cnt = 0;}}else if(uart_cnt==1){if(0x05 == uart_temp){uart_cnt = 2;}else{uart_cnt = 0;}}else if(uart_cnt==2){uart_cnt = 0;P1=uart_temp;                   //把值输出到P1口,用于观察SBUF=uart_temp;                 //把接收到的值再发回电脑端}else{uart_cnt = 0;}}if(TI)                        //如果是发送标志位,清零{TI=0;}
} 

(3)重定向使用printf
首先屏蔽uart中断,其次引用文件stdio.h文件,然后重定向putchar函数,至此,使用printf可以实现打印功能。

//c51_uart.c文件#include "includes.h"/*-----------------------------------------------名称:串口通信内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源打开串口调试程序,将波特率设置为9600,无奇偶校验晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,在发送框输入 hello,I Love MCU ,在接收框中同样可以看到相同字符,说明设置和通信正确
------------------------------------------------*//******************************************************************/
void sys_uart_init(void)
{SCON  = 0x50;		        /* SCON: 模式 1, 8-bit UART, 使能接收         */TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */TH1   = 0xFD;               /* TH1:  reload value for 9600 baud @ 11.0592MHz   */TR1   = 1;                  /* TR1:  timer 1 run                          */EA    = 1;                  /*打开总中断*///ES    = 1;                  /*打开串口中断*/}void Uart_SendChar(unsigned char  dat)
{SBUF = dat; while(!TI); TI = 0; 
}char putchar(char c)//重定向
{Uart_SendChar(c);return c;}/******************************************************************/
/*                  串口中断程序                                  */
/******************************************************************/static unsigned char uart_temp = 0;          //定义临时变量 
static unsigned char uart_cnt = 0;          //定义临时变量 void UART_isr(void) interrupt 4 //串行中断服务程序
{if(RI)                        //判断是接收中断产生{RI=0;                      //标志位清零uart_temp=SBUF;                 //读入缓冲区的值if(uart_cnt==0){if(0x02 == uart_temp){uart_cnt = 1;}else{uart_cnt = 0;}}else if(uart_cnt==1){if(0x05 == uart_temp){uart_cnt = 2;}else{uart_cnt = 0;}}else if(uart_cnt==2){uart_cnt = 0;P1=uart_temp;                   //把值输出到P1口,用于观察SBUF=uart_temp;                 //把接收到的值再发回电脑端}else{uart_cnt = 0;}}if(TI)                        //如果是发送标志位,清零{TI=0;}
} 

在这里插入图片描述
(5)整体工程代码如下

//main.c文件

#include "includes.h"/******************************************************************/
/*                    微秒延时函数  //10us                         */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{while(us--){}
}/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{while(Ms--){delay_us(100);}
}/*------------------------------------------------延时子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{while(--cnt);
}/*------------------------------------------------主函数
------------------------------------------------*/
void main (void)
{sys_timer_init();sys_uart_init();delay(10);delay_ms(10);sys_ledtube_on2();sys_ledtube_on1();//首先定义处于什么状态,tx1838_type = 1;printf("hello");while (1){
//		sys_keynum_ledon(9);sys_tx1838_test();}
}

//includes.h文件

#ifndef __INCLUDES_H__
#define __INCLUDES_H__//#include<reg52.h> #include<intrins.h> //汇编指令_nop_
#include<stdio.h> 	//标准输入输出//_nop_(); 产生一条NOP指令
//作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。
//NOP指令为单周期指令,可由晶振频率算出延时时间。//8051 为每个机器周期 12 时钟
//对于12M晶振,延时1uS。
//11.0592M晶振,延时1.0851uS。//对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "STC89C5xRC_RDP.h"//应用层头文件
//#include "c51_gpio.h"
#include "c51_ledtube.h"
//#include "c51_key.h"
#include "c51_timer.h"
//#include "c51_exit.h"
//#include "c51_lcd1602.h"
//#include "c51_iic.h"
#include "c51_tx1838.h"
#include "c51_uart.h"extern void delay(unsigned int cnt);
extern void delay_us(unsigned int us);//delay us;
extern void delay_ms(unsigned int Ms);//delay Ms;#endif

//c51_tx1838.h文件

#ifndef __C51_TX1838_H__
#define __C51_TX1838_H__#define  NEC 	P32 //红外线接收头  extern unsigned char tx1838_cnt;
extern unsigned char tx1838_type;
extern unsigned char tx1838_data[4];extern void sys_tx1838_test(void);#endif

//c51_timer.c文件

#include "includes.h"void sys_timer_init(void)
{sys_timer0_init();sys_timer1_init();sys_timer2_init();sys_wdog_init();clr_wdg();
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void sys_timer0_init(void)
{TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     TH0=0x00;	      //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;//EA=1;            //总中断打开 等最后一个中断打开//ET0=1;           //定时器中断打开TR0=1;           //定时器开关打开
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void sys_timer1_init(void)
{TMOD |= 0x20;	  //使用模式2,	     TH1=0x05;	      //给定初值,这里使用定时器最大值从5开始计数一直到255溢出TL1=0x00;//EA=1;            //总中断打开//ET1=1;           //定时器中断打开//TR1=1;           //定时器开关打开
}/*------------------------------------------------定时器初始化子程序
------------------------------------------------*/
void sys_timer2_init(void)
{RCAP2H = 0/256;//RCAP2L = 0/256;//ET2=1;                     //打开定时器中断//EA=1;                      //打开总中断//TR2=1;                     //打开定时器开关
}void sys_wdog_init(void)
{ //WDT_CONTR = 0x35;
}void clr_wdg(void)
{//WDT_CONTR = 0x35;
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{TH0=0x00;		  //重新赋值TL0=0x00;//sys_led_test1(); //流水灯操作
}/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{//sys_led_test1(); //流水灯操作}	/*------------------------------------------------定时器中断子程序
------------------------------------------------*/
void Timer2_isr(void) interrupt 5//定时器2中断
{TF2=0;//sys_led_test1(); //流水灯操作
}

//c51_timer.h文件

#ifndef __C51_TIMER_H__
#define __C51_TIMER_H__extern void sys_timer_init(void);
extern void sys_timer0_init(void);
extern void Timer0_isr(void);
extern void sys_timer1_init(void);
extern void Timer1_isr(void);
extern void sys_timer2_init(void);
extern void Timer2_isr(void);extern void sys_wdog_init(void);
extern void clr_wdg(void);#endif

//c51_ledtube.c文件

#include "includes.h"// 显示段码值01234567,可对应原理图查看显示不同图形对应的引脚高点电平配置状态
unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,\0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F/********************************************************
函数名称:sys_ledtube_on1
函数功能:点亮一个数码管全为亮起来
入口参数:
出口参数:
修    改:
内    容:
********************************************************/
void sys_ledtube_on1(void)
{//根据原理图,将P0口全部输出高电平,P2选择0号数码管P0=0xFF;//取显示数据,段码P2=0;  	//取位码
}/********************************************************
函数名称:sys_ledtube_on2
函数功能:显示一组数据
入口参数:
出口参数:
修    改:
内    容:
********************************************************/
static unsigned char ledtube_cnt = 0;
void sys_ledtube_on2(void)
{ledtube_cnt++;if(ledtube_cnt>7){ledtube_cnt = 0;}P0 = 0x00;				//防止切换数码管瞬间有虚影出现P2 = 0x00;P0 = EL[ledtube_cnt];	//取显示数据,段码P2 = ledtube_cnt;  		//取位码//根据人眼适应虚影缓冲时间为50ms左右//我们调整delay在500以下可以看到明显的看起来是一串数据一起显示delay(100); 			
}/********************************************************
函数名称:sys_keynum_ledon
函数功能:显示按键数值
入口参数:按键数值
出口参数:
修    改:
内    容:
********************************************************/
void sys_keynum_ledon(unsigned char num)
{//根据原理图,将P0口全部输出高电平,P2选择0号数码管P0=EL[num];//取显示数据,段码P2=0;  	//取位码
}

//c51_ledtube.h文件

#ifndef __C51_LEDTUBE_H__
#define __C51_LEDTUBE_H__extern unsigned char const EL[];extern void sys_ledtube_on1(void);
extern void sys_ledtube_on2(void);extern void sys_keynum_ledon(unsigned char num);#endif

//c51_tx1838.c文件

#include "includes.h"unsigned char tx1838_cnt = 0;
unsigned char tx1838_type = 0;
unsigned char tx1838_data[4] = {0};void sys_tx1838_test(void)
{unsigned int time = 0;if(!NEC){while(!NEC);		//等待低电平结束TH0 = 0;TL0 = 0;delay_us(1);if(tx1838_type==4){tx1838_type =1;}else{while(NEC)			//等待数据位计时{if(TH0>30){tx1838_type =1;break;}}}time =(TH0<<8)+TL0; //取得脉冲宽度switch(tx1838_type){case 1:{if(time>3000 && time<7000) //接收到数据{tx1838_type = 2;tx1838_cnt = 0;		//接收位数量清0tx1838_data[0] = 0;tx1838_data[1] = 0;tx1838_data[2] = 0;tx1838_data[3] = 0;}else if(time>2000 && time<3000)//接收到重复码{tx1838_type = 3;}else{tx1838_type = 1;}break;}case 2:{tx1838_cnt ++ ;if(time>168 && time<800) //接收到数据位为0的时间长度{}else {if(time>1100 && time<1800) //接收到数据位为1的时间长度{if(tx1838_cnt<=8){tx1838_data[0] |= (1<<(tx1838_cnt-1));}else if(tx1838_cnt<=16){tx1838_data[1] |= (1<<(tx1838_cnt-9));}else if(tx1838_cnt<=24){tx1838_data[2] |= (1<<(tx1838_cnt-17));}else if(tx1838_cnt<=32){tx1838_data[3] |= (1<<(tx1838_cnt-25));}else{tx1838_type = 1;tx1838_cnt = 0;		//接收位数量清0tx1838_data[0] = 0;tx1838_data[1] = 0;tx1838_data[2] = 0;tx1838_data[3] = 0;}}else //重新解码 //接收到引导码或者结束码,或者接收到的是重复码,本章节不进行演示{tx1838_type = 1;tx1838_cnt = 0;		//接收位数量清0tx1838_data[0] = 0;tx1838_data[1] = 0;tx1838_data[2] = 0;tx1838_data[3] = 0;}}if(tx1838_cnt>=32){tx1838_type = 4;switch(tx1838_data[3])//判断数码值{case 255:sys_keynum_ledon(0);break;//0 显示相应的按键值case 254:sys_keynum_ledon(1);break;//1case 253:sys_keynum_ledon(2);break;//2case 252:sys_keynum_ledon(3);break;//3case 251:sys_keynum_ledon(4);break;//4case 250:sys_keynum_ledon(5);break;//5case 249:sys_keynum_ledon(6);break;//6case 248:sys_keynum_ledon(7);break;//7case 247:sys_keynum_ledon(8);break;//8case 246:sys_keynum_ledon(9);break;//9 显示相应的按键值}}break;}case 3: //重复码{tx1838_type = 1;sys_keynum_ledon(11);break;}case 4: //结束码{tx1838_type = 1;tx1838_cnt = 0;		//接收位数量清0break;}case 5:{break;}default:tx1838_type = 1;break;}}
}

//c51_uart.h文件

#ifndef __C51_UART_H__
#define __C51_UART_H__extern void Uart_SendChar(unsigned char  dat);
extern char putchar(char c);//重定向extern void sys_uart_init(void);
extern void UART_isr(void);#endif

3 C51 UART总结

这些总结要点提供了关于C51中UART功能的基本概述。请注意,具体的UART配置和操作方法可能因不同的C51系列和具体的芯片型号而有所差异。为了准确使用C51的UART功能,请参考相应的芯片手册、官方文档或相关资料,以获取详细的UART配置和操作说明。

相关文章:

51单片机嵌入式开发:13、STC89C52RC 之 RS232与电脑通讯

STC89C52RC 之 RS232与电脑通讯 第十三节课&#xff0c;RS232与电脑通讯1 概述2 Uart介绍2.1 概述2.2 STC89C52UART介绍2.3 STC89C52 UART寄存器介绍2.4 STC89C52 UART操作 3 C51 UART总结 第十三节课&#xff0c;RS232与电脑通讯 1 概述 RS232&#xff08;Recommended Stand…...

当代政治制度(练习题)

当代政治制度&#xff08;练习题&#xff09; Rz整理 仅供参考 干部鉴定必须坚持德才兼备原则&#xff0c;考核内容包括&#xff08;A.德 B.廉 C.能 D.勤 F.绩 &#xff09; A.德 B.廉 C.能 D.勤 E.信 F.绩我国干部任用的方式主要包括&#xff08;A.考任 C.委任 D.聘任 F.选任…...

前端pc和小程序接入快递100(跳转方式和api方式)====实时查询接口

文章目录 跳转方式微信小程序&#xff08;我以uniapp为例&#xff09;pc api接入说明关于签名计算成功示例 跳转方式 没有任何开发成本&#xff0c;直接一键接入 可以直接看官方文档 https://www.kuaidi100.com/openapi/api_wxmp.shtml 微信小程序&#xff08;我以uniapp为例…...

电脑永久性不小心删除了东西还可以恢复吗 电脑提示永久性删除文件怎么找回 怎么恢复电脑永久删除的数据

永久删除电脑数据的操作&#xff0c;对于很多常用电脑设备的用户来说&#xff0c;可以说时有发生&#xff01;但是&#xff0c;因为这些情况大都发生在不经意间&#xff0c;所以每每让广大用户感觉到十分苦恼。永久删除也有后悔药&#xff0c;轻松找回电脑中误删的文件。恢复文…...

LeetCode热题100刷题16:74. 搜索二维矩阵、33. 搜索旋转排序数组、153. 寻找旋转排序数组中的最小值、98. 验证二叉搜索树

74. 搜索二维矩阵 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int row matrix.size();int col matrix[0].size();for(int i0;i<row;i) {//先排除一下不存在的情况if(i>0&&matrix[i][0]>target…...

C++仿函数

在C中&#xff0c;我们经常需要对类中的元素进行比较&#xff0c;例如在排序、查找等操作中。为了使类更加灵活&#xff0c;我们可以通过自定义比较函数来实现不同的比较方式。在本文中&#xff0c;我们将探讨如何在类中使用仿函数和 Lambda 表达式来定义自定义比较函数。 1. …...

文献阅读:tidyomics 生态系统:增强组学数据分析

文献介绍 文献题目&#xff1a; The tidyomics ecosystem: enhancing omic data analyses 研究团队&#xff1a; Stefano Mangiola&#xff08;澳大利亚沃尔特和伊丽莎霍尔医学研究所&#xff09;、Michael I. Love&#xff08;美国北卡罗来纳大学教堂山分校&#xff09;、Ant…...

MySQL运维实战之Clone插件(10.1)使用Clone插件

作者&#xff1a;俊达 clone插件介绍 mysql 8.0.17版本引入了clone插件。使用clone插件可以对本地l或远程的mysql实例进行clone操作。clone插件会拷贝innodb存储引擎表&#xff0c;clone得到的是原数据库的一个一致性的快照&#xff0c;可以使用该快照数据来启动新的实例。cl…...

【系统架构设计】数据库系统(三)

数据库系统&#xff08;三&#xff09; 数据库模式与范式数据库设计备份与恢复分布式数据库系统分布式数据库的概念特点分类目标 分布式数据库的架构分布式数据库系统与并行数据库系统 数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库设计 备份与恢复 分布式数据库系统…...

免费视频批量横版转竖版

简介 视频处理器 v1.3 是一款由是貔貅呀开发的视频编辑和处理工具&#xff0c;提供高效便捷的视频批量横转竖&#xff0c;主要功能&#xff1a; 导入与删除文件&#xff1a;轻松导入多个视频文件&#xff0c;删除不必要的文件。暂停与继续处理&#xff1a;随时暂停和继续处理。…...

内存管理(知识点)

c语言与c对于内存管理的区别 c语言中动态内存管理方式 malloc\calloc\realloc\free c内存管理方式 c兼容c语言所以c语言中的方式也可以使用 但是用起来太麻烦 所以通过new和delete操作符竞选动态内存管理 单个对象 c语言: int* p2(int*)malloc(sizeof(int)) c : int*p3 new…...

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel 简介熔断降级什么是熔断什么是降级相同点不同点 整合Sentinel自定义sentinel流控返回数据使用Sentinel来保护feign远程调用自定义资源给网关整合Sentinel参考 简介 熔断降…...

防范UDP Flood攻击的策略与实践

UDP Flood攻击是一种常见的分布式拒绝服务&#xff08;DDoS&#xff09;攻击手段&#xff0c;通过向目标服务器发送大量无效的UDP数据包&#xff0c;消耗其网络带宽和处理资源&#xff0c;最终导致合法的网络服务无法正常运行。本文将深入探讨UDP Flood攻击的原理、常见的防御策…...

昇思25天学习打卡营第17天 | CycleGAN图像风格迁移互换

通过深入学习CycleGAN模型&#xff0c;我对无监督图像到图像的转换技术有了更深的理解。CycleGAN不仅能在没有成对训练样本的情况下实现域之间的转换&#xff0c;而且在保持内容结构的同时成功转换图像风格&#xff0c;这在许多应用中都非常有用&#xff0c;如艺术风格转换、季…...

Leetcode 2520. 统计能整除数字的位数

问题描述&#xff1a; 给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 示例 1&#xff1a; 输入&#xff1a;num 7 输出&#xff1a;1 解释&#xff1a;7 被自己整除&#xff0…...

WEB前端08-综合案例(动态表格)

使用 HTML、CSS 和 JavaScript 创建动态表格 在本教程中&#xff0c;我们将创建一个动态表格&#xff0c;允许用户添加行、选择项目&#xff0c;并执行批量操作&#xff0c;如全选或删除选中的行。我们将通过 HTML、CSS 和 JavaScript 来实现这一功能。让我们逐步了解每个部分…...

【面试题】Redo log和Undo log

Redo log 介绍Redo log之前我们需要了解一下&#xff0c;mysql数据操作的流程&#xff1a; 上述就是数据操作的流程图&#xff0c;可以发现sql语句并不是直接操作的磁盘而是通过操作内存&#xff0c;然后进行内存到磁盘的一个同步。这里我们必须要了解一些区域&#xff1a; 缓…...

开发实战经验分享:互联网医院系统源码与在线问诊APP搭建

作为一名软件开发者&#xff0c;笔者有幸参与了多个互联网医院系统的开发项目&#xff0c;并在此过程中积累了丰富的实战经验。本文将结合我的开发经验&#xff0c;分享互联网医院系统源码的设计与在线问诊APP的搭建过程。 一、需求分析 在开发任何系统之前&#xff0c;首先要…...

springboot系列教程(十六):配置Actuator组件,实现系统监控

一、Actuator简介 1、监控组件作用 在生产环境中&#xff0c;需要实时或定期监控服务的可用性。Spring Boot的actuator&#xff08;健康监控&#xff09;功能提供了很多监控所需的接口&#xff0c;可以对应用系统进行配置查看、相关功能统计等。 2、监控分类 Actuator 提供…...

单臂路由组网实验,单臂路由的定义、适用情况、作用

一、定义 单臂路由是指通过在路由器的一个接口上配置许多子接口,从而实现原来相互隔离的不同VLAN之间的互通。 子接口:把路由器上的实际的物理接口划分为多个逻辑上的接口,这些被划分的逻辑接口就是子接口。 二、适用情况 用在没有三层交换机,却要实现不同VLAN之间的互…...

【数据结构初阶】顺序表三道经典算法题(详解+图例)

Hello&#xff01;很高兴又见到你了~~~ 看看今天要学点什么来充实大脑吧—— 目录 1、移除元素 【思路图解】 【总结】 2、删除有序数组中的重复项 【思路图解】 【总结】 3、合并两个有序数组 【思路图解】 【总结】 至此结束&#xff0c;Show Time&#xff01; 1、…...

SpringBoot接入JPA连接数据库H2或MySQL例子

一&#xff0c;JPA相关的常用注解和对象 Entity&#xff0c;用于实体类声明语句之前&#xff0c;‌指出该Java类为实体类&#xff0c;‌将映射到指定的数据库表&#xff1b;Table&#xff0c;当实体类与其映射的数据库表名不同名时需要使用。‌该标注与Entity标注并列使用&…...

持续集成05--Gogs的安装与使用

前言 在持续集成/持续部署&#xff08;CI/CD&#xff09;的旅程中&#xff0c;版本控制系统是不可或缺的一环。当我们在使用jenkins&#xff0c;想要达到测试脚本有更新&#xff0c;就让项目自动去进行构建&#xff0c;或者当开发脚本有更新&#xff0c;也可以自动去构建的效果…...

C++--fill

把[first,last)之间的元素填充为val。 template<class ForwardIterator, class Type> void fill( ForwardIterator first, //起始迭代器 ForwardIterator last, //结束迭代器 const Type& val //设置的值 );源码剖析 template<class ForwardIterator, c…...

Java:对比一个对象更新前后具体被修改了哪些值

Java&#xff1a;对比一个对象更新前后具体被修改了哪些值 Zyyyyu 的个人博客 遇到一个需求就是要记录每行数据被修改更新后&#xff0c;要记录下当前值和修改前的值 那有人就会说写个if去判断值是否被修改了&#xff0c;然后记录下来不就行了&#xff0c;这是一个思路&#x…...

GO——GMP 好文整理

GMP相关好文推荐&#xff1a; Golang 调度器设计思想、GMP 协程调度模型详解 Golang的协程调度器原理及GMP设计思想 Golang调度器GMP原理与调度全分析...

园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现

随着现代园区规模的不断扩大与功能的日益复杂&#xff0c;传统的二维地图导航已难以满足访客高效、精准定位的需求。园区内部错综复杂的布局、频繁变更的商户位置常常让访客感到迷茫&#xff0c;造成寻路上的时间浪费。园区AR导航系统以创新的技术手段&#xff0c;破解了私域地…...

接口测试总结(非标准)

为什么要做接口测试&#xff1f; 答&#xff1a;接口测试是为了检测系统组件间接口的正确性和稳定性&#xff0c;以及检查数据的交换、传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。接口测试可以帮助我们发现系统中的潜在问题&#xff0c;确保系统的稳定性…...

在Ubuntu 18.04上安装和使用Composer的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 Composer 是一个流行的 PHP 依赖管理工具&#xff0c;主要用于简化项目依赖项的安装和更新。它会检查特定项目依赖的其他软件包&a…...

ssm 学习 ---(spring)

一、spring框架 1、基本框架 2、Beanfactory快速入门 配置清单&#xff1a;xml文件 (1) 导入jar包或者maven坐标 (2) 定义UserService接口以及UserService实现类 (3) 创建bean.xml配置文件&#xff0c;将UserService信息配置到该xml文件中; (4)编写测试代码&#xff0c;创…...

南通网站建设找哪家好/抖音优化公司

author &#xff1a;skatetime&#xff1a; 2009/02/21 最近在两台数据库的同步的时侯&#xff0c;经常遇到如下的错误&#xff0c;下面是对这个问题解决总结: ORA-02085 错误解决2008-12-04 13:30程序报错: ORA-02085: database link WD2YT_ERATING.LK connects to ESUITE.N…...

企业网站建设基本流程/培训方案模板

昨天&#xff1a;导出到excel代码的编写 今天:绘制折线图的代码的预编写 遇到的问题&#xff1a;不会绘制折线图代码的编 明天&#xff1a;绘制折线图的代码的编写和完善 转载于:https://www.cnblogs.com/4EY4EVER/p/9991632.html...

哪家公司提供专业的网站建设/广州最新发布最新

阿里云分布式关系型数据库&#xff08;DRDS&#xff09; Distribute Relational Database Service&#xff08;DRDS&#xff09;是分布式关系型数据库&#xff0c;它主要是一种水平拆分、可平滑扩容、读写分离的在线分布式数据库服务。 DRDS在使用的过程中存在于我们的应用和数…...

传奇广告网站怎么做/全网整合营销推广方案

翻译原文链接 转帖&#xff0f;转载请注明出处 原文链接medium.com 发表于2017/08/30 我在防垃圾邮件&#xff0c;防病毒和防恶意软件领域已经工作了15年&#xff0c;前后在好几个公司任职。我知道这些系统最后都会因为要处理海量的数据而变得非常复杂。 我现在是smsjunk.com的…...

青岛网站搭建公司/蔡甸seo排名公司

TSP旅行售货员问题-回溯法 最近比较颓废&#xff0c;考试实在是太多了&#xff0c;月考简直了。对转专业的学生太不友好了。一大堆公共课简直消磨了我对编程的热情。 今天刚好去听了节一直逃课的晚课&#xff0c;老师找我谈了谈&#xff0c;没有怪我。我也开始思考我目标是什么…...

时代网站管理系统怎么做网站/今天重大新闻头条新闻

var time1; var srcollOld 0,srcollNow 0,scrollFun false; $(window).scroll(function () {//$(window).scrollTop()这个方法是当前滚动条滚动的距离//$(window).height()获取当前窗体的高度//$(document).height()获取当前文档的高度var bot 50; //bot是底部距离的高度i…...