九:串口通信

通信:无线和有线

​ 单工 半双工 全双工

并行:多个数据线 串行:一根数据线

同步:通信双方使用同一个时钟,SPI信息帧,有CLK引脚

异步:通信双方使用不同时钟,双方要固定的数据帧(0起始,1停止)和传输速度(波特率,一般都是9600bps = 1s:单位时间传输了多少个码元,这里用二进制码元),无CLK引脚

空闲时总线保持高电平。起始信号:由高到低 起始信号:由低到高

数据位:5,6,7,8位 需要起始位:1~2位

校验位:奇,偶,无 //一般自定义校验规则

停止信号:由低到高 停止位:1~2位

eg:11001100 实际数据:0x33,数据头是低位

一:测试发送和接受

//定时器0
#include <reg51.h>unsigned char recv = 0;
// 硬件接口定义
sbit RCLK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;// 延时函数(简易版)
void delayn(unsigned char n) {while(n--);
}unsigned char code digit_table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};// 74HC595 写入一个字节
void write_74hc595(unsigned char dat) {unsigned char i;for(i = 0; i < 8; i++) {SER = (dat & (1 << (7 - i))) ? 1 : 0;SRCLK = 0;delayn(1);SRCLK = 1;delayn(1);}RCLK = 0;delayn(1);RCLK = 1;
}// 数码管图案数据(0~9)
unsigned char code h_data[10 * 8] = {0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x01, 0x7f, 0x21, 0x00, 0x00, 0x00, 0x00,	0x00, 0x39, 0x45, 0x45, 0x45, 0x27, 0x00, 0x00,	0x00, 0x36, 0x49, 0x49, 0x49, 0x22, 0x00, 0x00,0x00, 0x04, 0x7f, 0x24, 0x14, 0x0c, 0x00, 0x00,0x00, 0x4e, 0x51, 0x51, 0x51, 0x72, 0x00, 0x00,	0x00, 0x26, 0x49, 0x49, 0x49, 0x3e, 0x00, 0x00,0x00, 0x70, 0x4f, 0x40, 0x40, 0x40, 0x00, 0x00,	0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00,0x00, 0x3e, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00
};unsigned char num = 0; void dispaly_num(unsigned char num)
{unsigned char i = 0;	for(i = 0; i < 8; i++){write_74hc595(1 << (7 - i));P0 = ~h_data[i + num * 8];delayn(100);P0 = 0xff;}	
}#if 0
void serial_server() interrupt 4 
{if(TI)TI = 0;//清 发送中断标志if(RI)RI = 0;//清 发送中断标志recv = SBUF;//接受串口数据switch(recv){case 0:num = 0; P0 = digit_table[0];break;case 1:num = 1; P0 = digit_table[1];break;case 2:num = 2; P0 = digit_table[2];break;case 3:num = 3; P0 = digit_table[3];break;case 4:num = 4; P0 = digit_table[4];break;case 5:num = 5; P0 = digit_table[5];break;case 6:num = 6; P0 = digit_table[6];break;case 7:num = 7; P0 = digit_table[7];break;case 8:num = 8; P0 = digit_table[8];break;case 9:num = 9; P0 = digit_table[9];break;default: SBUF = 0X0E;P0 = digit_table[10];break;}}
#endifvoid uart_init(void)
{SCON = 0x50;			TMOD &= 0x0F;		TMOD |= 0x20;		TL1 = 0xFD;	TH1 = 0xFD;		ES = 1;EA = 1;ET1 = 0;		TR1 = 1;}void uart_send(unsigned char ch)
{TI = 0;SBUF = ch;while(!TI);
}unsigned char uart_recv(void)
{unsigned char ch = 0;while(!RI);ch = SBUF;RI = 0;return ch;
}// 主函数
void main(void)
{unsigned char ch = 0;uart_init();while(1){ch = uart_recv();ch += 1;uart_send(ch);}	
#if 0uart_init();while(1){dispaly_num(num);}
#endif
}
//如果不用中断的话,只有端口一直发,数码管才能呢个显示,但是是频闪状态,和中断相比,缺点很大
#include <reg51.h>unsigned char recv = 0;
// 硬件接口定义
sbit RCLK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;// 延时函数(简易版)
void delayn(unsigned char n) {while(n--);
}unsigned char code digit_table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};// 74HC595 写入一个字节
void write_74hc595(unsigned char dat) {unsigned char i;for(i = 0; i < 8; i++) {SER = (dat & (1 << (7 - i))) ? 1 : 0;SRCLK = 0;delayn(1);SRCLK = 1;delayn(1);}RCLK = 0;delayn(1);RCLK = 1;
}// 数码管图案数据(0~9)
unsigned char code h_data[10 * 8] = {0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x01, 0x7f, 0x21, 0x00, 0x00, 0x00, 0x00,	0x00, 0x39, 0x45, 0x45, 0x45, 0x27, 0x00, 0x00,	0x00, 0x36, 0x49, 0x49, 0x49, 0x22, 0x00, 0x00,0x00, 0x04, 0x7f, 0x24, 0x14, 0x0c, 0x00, 0x00,0x00, 0x4e, 0x51, 0x51, 0x51, 0x72, 0x00, 0x00,	0x00, 0x26, 0x49, 0x49, 0x49, 0x3e, 0x00, 0x00,0x00, 0x70, 0x4f, 0x40, 0x40, 0x40, 0x00, 0x00,	0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00,0x00, 0x3e, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00
};unsigned char num = 0; void dispaly_num(unsigned char num)
{unsigned char i = 0;	for(i = 0; i < 8; i++){write_74hc595(1 << (7 - i));P0 = ~h_data[i + num * 8];delayn(100);P0 = 0xff;}	
}#if 0
void serial_server() interrupt 4 
{if(TI)TI = 0;//清 发送中断标志if(RI)RI = 0;//清 发送中断标志recv = SBUF;//接受串口数据switch(recv){case 0:num = 0; P0 = digit_table[0];break;case 1:num = 1; P0 = digit_table[1];break;case 2:num = 2; P0 = digit_table[2];break;case 3:num = 3; P0 = digit_table[3];break;case 4:num = 4; P0 = digit_table[4];break;case 5:num = 5; P0 = digit_table[5];break;case 6:num = 6; P0 = digit_table[6];break;case 7:num = 7; P0 = digit_table[7];break;case 8:num = 8; P0 = digit_table[8];break;case 9:num = 9; P0 = digit_table[9];break;default: SBUF = 0X0E;P0 = digit_table[10];break;}}
#endifvoid uart_init(void)
{SCON = 0x50;			TMOD &= 0x0F;		TMOD |= 0x20;		TL1 = 0xFD;	TH1 = 0xFD;		ES = 1;EA = 1;ET1 = 0;		TR1 = 1;}void uart_send(unsigned char ch)
{TI = 0;SBUF = ch;while(!TI);
}unsigned char uart_recv(void)
{unsigned char ch = 0;while(!RI);ch = SBUF;RI = 0;return ch;
}// 主函数
void main(void)
{unsigned char ch = 0;uart_init();while(1){ch = uart_recv();ch += 1;uart_send(ch);if(ch < 10){dispaly_num(ch);}}	
#if 0uart_init();while(1){dispaly_num(num);}
#endif
}

二:UART串口

STC89C51RC/RD+系列单片机内部集成有一个功能很强的全双工串行通信口,与传统8051单片机的串口完全兼容。设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF

STC89C51RC/RD+系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。

#include <reg51.h>unsigned char recv = 0;unsigned char code digit_table[] = {0x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 8
};void digit_select(unsigned char digit)
{unsigned char num = P2;num &= ~(0x7 << 2);  num |= (digit << 2);P2 = num;
}void serial_server() interrupt 4 
{if(TI)TI = 0;if(RI)RI = 0;recv = SBUF;switch(recv){case '1':digit_select(0); P0 = digit_table[0];break;case '2':digit_select(1); P0 = digit_table[1];break;case '3':digit_select(2); P0 = digit_table[2];break;case '4':digit_select(3); P0 = digit_table[3];break;case '5':digit_select(4); P0 = digit_table[4];break;case '6':digit_select(5); P0 = digit_table[5];break;case '7':digit_select(6); P0 = digit_table[6];break;case '8':digit_select(7); P0 = digit_table[7];break;default:P0 = 0xff;break;}}void main(void)
{
#if 1		SCON = 0x50;//设置串口工作方式,8位数据,可变波特率	TMOD &= 0x0F;		TMOD |= 0x20;//设置T1工作方式		TL1 = 0xFD;	TH1 = 0xFD;//设置9600波特率		ES = 1;//开 串口中断  //使能端EA = 1;//开 总中断	TR1 = 1;//启动定时器1
#endif//P0 = 0xEF;	while(1);}

三:通过串口通信修改led点阵数字

//定时器0
#include <reg51.h>unsigned char recv = 0;
// 硬件接口定义
sbit RCLK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;// 延时函数(简易版)
void delayn(unsigned char n) {while(n--);
}unsigned char code digit_table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};// 74HC595 写入一个字节
void write_74hc595(unsigned char dat) {unsigned char i;for(i = 0; i < 8; i++) {SER = (dat & (1 << (7 - i))) ? 1 : 0;SRCLK = 0;delayn(1);SRCLK = 1;delayn(1);}RCLK = 0;delayn(1);RCLK = 1;
}// 数码管图案数据(0~9)
unsigned char code h_data[10 * 8] = {0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x01, 0x7f, 0x21, 0x00, 0x00, 0x00, 0x00,	0x00, 0x39, 0x45, 0x45, 0x45, 0x27, 0x00, 0x00,	0x00, 0x36, 0x49, 0x49, 0x49, 0x22, 0x00, 0x00,0x00, 0x04, 0x7f, 0x24, 0x14, 0x0c, 0x00, 0x00,0x00, 0x4e, 0x51, 0x51, 0x51, 0x72, 0x00, 0x00,	0x00, 0x26, 0x49, 0x49, 0x49, 0x3e, 0x00, 0x00,0x00, 0x70, 0x4f, 0x40, 0x40, 0x40, 0x00, 0x00,	0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00,0x00, 0x3e, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00
};unsigned char num = 0; void dispaly_num(unsigned char num)
{unsigned char i = 0;	for(i = 0; i < 8; i++){write_74hc595(1 << (7 - i));P0 = ~h_data[i + num * 8];delayn(100);P0 = 0xff;}	
}void serial_server() interrupt 4 
{if(TI)TI = 0;if(RI)RI = 0;recv = SBUF;switch(recv){case '0':num = 0; P0 = digit_table[0];break;case '1':num = 1; P0 = digit_table[1];break;case '2':num = 2; P0 = digit_table[2];break;case '3':num = 3; P0 = digit_table[3];break;case '4':num = 4; P0 = digit_table[4];break;case '5':num = 5; P0 = digit_table[5];break;case '6':num = 6; P0 = digit_table[6];break;case '7':num = 7; P0 = digit_table[7];break;case '8':num = 8; P0 = digit_table[8];break;case '9':num = 9; P0 = digit_table[9];break;}}// 主函数
void main(void)
{SCON = 0x50;			TMOD &= 0x0F;		TMOD |= 0x20;		TL1 = 0xFD;	TH1 = 0xFD;		ES = 1;EA = 1;		TR1 = 1;while(1){dispaly_num(num);}
}

四:总测试

//定时器0
#include <reg51.h>unsigned char recv = 0;
unsigned char recv_flag = 0;
// 硬件接口定义
sbit RCLK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;// 延时函数(简易版)
void delayn(unsigned char n) {while(n--);
}void delay_ms(unsigned int num)
{unsigned char i,j;while(num--){i = 2;//看具体晶振大小j = 199;}do{while(--j);}while(--i);
}unsigned char code digit_table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};// 74HC595 写入一个字节
void write_74hc595(unsigned char dat) {unsigned char i;for(i = 0; i < 8; i++) {SER = (dat & (1 << (7 - i))) ? 1 : 0;SRCLK = 0;delayn(1);SRCLK = 1;delayn(1);}RCLK = 0;delayn(1);RCLK = 1;
}// 数码管图案数据(0~9)
unsigned char code h_data[10 * 8] = {0x00, 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00, 0x00, 0x01, 0x7f, 0x21, 0x00, 0x00, 0x00, 0x00,	0x00, 0x39, 0x45, 0x45, 0x45, 0x27, 0x00, 0x00,	0x00, 0x36, 0x49, 0x49, 0x49, 0x22, 0x00, 0x00,0x00, 0x04, 0x7f, 0x24, 0x14, 0x0c, 0x00, 0x00,0x00, 0x4e, 0x51, 0x51, 0x51, 0x72, 0x00, 0x00,	0x00, 0x26, 0x49, 0x49, 0x49, 0x3e, 0x00, 0x00,0x00, 0x70, 0x4f, 0x40, 0x40, 0x40, 0x00, 0x00,	0x00, 0x36, 0x49, 0x49, 0x49, 0x36, 0x00, 0x00,0x00, 0x3e, 0x49, 0x49, 0x49, 0x32, 0x00, 0x00
};unsigned char num = 0; void dispaly_num(unsigned char num)
{unsigned char i = 0;	for(i = 0; i < 8; i++){write_74hc595(1 << (7 - i));P0 = ~h_data[i + num * 8];delayn(100);P0 = 0xff;}	
}#if 0
void serial_server() interrupt 4 
{if(TI)TI = 0;//清 发送中断标志if(RI)RI = 0;//清 发送中断标志recv = SBUF;//接受串口数据switch(recv){case 0:num = 0; P0 = digit_table[0];break;case 1:num = 1; P0 = digit_table[1];break;case 2:num = 2; P0 = digit_table[2];break;case 3:num = 3; P0 = digit_table[3];break;case 4:num = 4; P0 = digit_table[4];break;case 5:num = 5; P0 = digit_table[5];break;case 6:num = 6; P0 = digit_table[6];break;case 7:num = 7; P0 = digit_table[7];break;case 8:num = 8; P0 = digit_table[8];break;case 9:num = 9; P0 = digit_table[9];break;default: SBUF = 0X0E;P0 = digit_table[10];break;}}
#endifvoid uart_init(void)
{SCON = 0x50;			TMOD &= 0x0F;		TMOD |= 0x20;		TL1 = 0xFD;	TH1 = 0xFD;		ES = 1;	   EA = 1;ET1 = 0;		TR1 = 1;}#if 1
void uart_send(unsigned char ch)
{TI = 0;//上来就TI = 0 就是为了保险,防止第一次的值不是默认0; SBUF = ch;while(!TI);//TI = 0;//如果用flag的话,那就还需要清零,不然会一直闪 卡在while
}unsigned char uart_recv(void)
{unsigned char ch = 0;while(!RI);ch = SBUF;RI = 0;return ch;
}
#endif#if 1
void test() interrupt 4  //中断必须是空函数
{
#if 0unsigned char ch = 0;ch = uart_recv();  //函数放进中断-------阻塞//如果要自定义协议的话,可以把recv[i],当作数组还用,数据输入结束后,统一把数组纺发上去/收过来uart_send(ch);	   //uart_recv() 和 uart_send() 是阻塞函数://它们会 等待 RI/TI,但中断里 不应该阻塞if (ch >= '0' && ch <= '9')   num = ch - '0'; 
#endifunsigned char ch;  if (RI) {RI = 0;   //接收到,清零recv_flag = 1;     ch = SBUF;   SBUF = ch;    if (ch >= '0' && ch <= '9')  num = ch - '0';          }if (TI)         // 发送中断{TI = 0;     // 清除标志}#if 0switch(ch){case 0:num = 0; P0 = digit_table[0];break;case 1:num = 1; P0 = digit_table[1];break;case 2:num = 2; P0 = digit_table[2];break;case 3:num = 3; P0 = digit_table[3];break;case 4:num = 4; P0 = digit_table[4];break;case 5:num = 5; P0 = digit_table[5];break;case 6:num = 6; P0 = digit_table[6];break;case 7:num = 7; P0 = digit_table[7];break;case 8:num = 8; P0 = digit_table[8];break;case 9:num = 9; P0 = digit_table[9];break;default: SBUF = 0X0E;P0 = digit_table[10];}
#endif
}
#endif// 主函数
void main(void)
{
#if 0unsigned char ch = 0;uart_init();while(1){ch = uart_recv();//ch += 1;//delay_ms(65534);uart_send(ch);if(ch < 10){dispaly_num(ch);}}
#endif		
#if 1uart_init();while(1){if(recv_flag)  //会一直闪{recv_flag = 0;}dispaly_num(num);}
#endif
#if 0uart_init();while(1){dispaly_num(num);}
#endif
}

十:DS18B20

一:单总线时序结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

初始化:主机将总线拉低至少480us,然后释放总线,等待15~60us后,

存在的 从机 会拉低总线60-240us以响应 主机 ,之后 从机 将释放总线


下图为发送一位和接受一位的示意图:

前提:外接电源,且只有一个DS18B20

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发送一位

​ 主机将总线拉低60~120us,然后释放总线,表示发送0;

​ 主机将总线拉低1~15us,然后释放总线,表示发送1。

​ 从机将在总线拉低30us后(典型值)(30us相当于:主机发送数据后,缓一会,丛机再读取)读取电平,整个时间片应大于60us

接收一位

​ 主机将总线拉低1~15us,然后释放总线(如果还是低电平,就是丛机还在拉低,如果上升高电平,说明从机没有动作),并在拉低后15us内读取总线电平(尽量贴近15us的末尾),

读取为低电平则为接收0,读取为高电平则为接收1,整个时间片应大于60us

发送一个字节

​ 连续调用8次发送一位的时序,依次发送一个字节的8位 (低位在前) 0 1 2 3 4 5 6 7

接收一个字节

​ 连续调用8次接收一位的时序,依次接收一个字节的8位 (低位在前)

二:DS18B20操作流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

初始化:从机复位,庄机判断从机是否响应

ROM操作:ROM指令+本指令需要的读写操作

功能操作:功能指令+本指令需要的读写操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三:数据帧(前提:外部供电且只有一个)

跳过ROM:因为只有一个温度传感,不需要发特定的数字来识别对应的温度传感

温度变换:初始化一跳过ROM→开始温度变换

温度读取:初始化→跳过ROM→[读暂存器(连续的读操作)]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就为了读取温度数据,就读取前两位就行

四:温度存储格式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一共16位,前8位是符号,后8位是数值大小

​ 如果是负数,那就要用补码来导出实际数值

五:ROM操作流程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

十一:AD/DA

一:基础概念

AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号

DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号

AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理提供了可能


模拟量:0~5v 数字量:0~255

AD转换通常有多个输入通道,用多路选择开关连接至AD转换器以实现AD多路复用的目的,提高硬件利用率

AD/DA与单片机数据传送可使用并口(速度快、原理简单),也可使用串口 (接线少、使用方便)

可将AD/DA模块直接集成在单片机内,这样直接写入/读出寄存器就可进行AD/DA转换,单片机的IO口可直接复用为AD/DA的通道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92192.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92192.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92192.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FreeRTOS 】任务通知

FreeRTOS 任务通知任务通知简介一 、发送通知1.1 xTaskNotify()1.2 xTaskNotifyFromISR()1.3 xTaskNotifyGive()1.4 xTaskNotifyAndQuery()1.5 xTaskNotifyAndQueryFromISR()二、接收通知2.1 ulTaskNotifyTake()2.2 xTaskNotifyWait()三、清除通知状态和值3.1 xTaskNotifyState…

Android视图状态以及重绘

一、视图状态&#xff08;View States&#xff09;1. 五种核心状态状态作用修改方法特点enabled视图是否响应交互setEnabled(boolean)禁用状态下不响应onTouch事件focused视图是否获得焦点requestFocus()需同时满足focusable和focusableInTouchModewindow_focused视图所在窗口是…

vue3接收SSE流数据进行实时渲染日志

后端使用的是 Spring Boot WebFlux&#xff08;响应式编程框架&#xff09;&#xff0c;并且返回的是 Server-Sent Events (SSE) 流式数据&#xff0c;那么在 Vue3 中&#xff0c;需要使用 EventSource API 或 fetch 流式读取 来正确获取响应内容。方案 1&#xff1a;使用 Eve…

每日五个pyecharts可视化图表-bars(6)

探索pyecharts库中条形图的高级用法与定制技巧 在数据可视化中&#xff0c;条形图是最常用的图表类型之一&#xff0c;它能够清晰地展示不同类别之间的数量对比。今天&#xff0c;我们将继续学习如何使用pyecharts创建5种不同风格的条形图。pyecahts源码 图表1&#xff1a;带…

【C语言】文件操作全解析

文章目录一、为什么需要文件操作&#xff1f;二、认识文件&#xff1a;不止是磁盘上的存储2.1 程序文件2.2 数据文件2.3 文件名的构成三、文本文件与二进制文件&#xff1a;数据的两种形态3.1 存储方式差异3.2 实例对比&#xff1a;整数10000的存储3.3 二进制文件操作示例四、文…

C结构体的几种定义形式 + typedef结合使用的好处

struct 语句定义了一个包含多个成员的新的数据类型&#xff0c;struct 语句的格式如下&#xff1a; struct tag { member-list member-list member-list ... } variable-…

SPICE电容矩阵

SPICE电容矩阵: 如果有许多条传输线,就可以用下标来标记每一条线。例如,如果有5条线,就用1~5分别标记,依惯例把返回路径导体标记为导线0。图10.6给出了5条导线和一个公共返回平面的横截面图。首先研究电容器元件,下一节再讨论电感器元件。 在这个线的集合中,每对导线之间…

【Java】栈和队列

文章目录1.栈1.1 栈的定义1.2 栈的使用1.3 栈的模拟实现2.队列2.1 队列的定义2.2 队列的使用2.3 队列的模拟实现3.循环队列3.1 循环队列的概念3.2 循环队列判断空和满4.双端队列Deque1.栈 1.1 栈的定义 栈是一种特殊的线性表&#xff0c;其只允许在固定的一段进行数据的插入或…

【性能测试】---测试工具篇(jmeter)

目录 1、安装并启动jemeter 2、重点组件 2.1、线程组&#xff1a; 2.2、HTTP取样器​编辑 2.3、查看结果树 2.4、HTTP请求默认值 2.5、HTTP信息头管理器 2.6、JSON提取器 2.7、JSON断言 2.8、同步定时器 2.9、CSV数据文件设置 2.10、HTTP Cookie管理器 3、测试报告…

机器学习(12):拉索回归Lasso

- 拉索回归可以将一些权重压缩到零&#xff0c;从而实现特征选择。这意味着模型最终可能只包含一部分特征。 - 适用于特征数量远大于样本数量的情况&#xff0c;或者当特征间存在相关性时&#xff0c;可以从中选择最相关的特征。 - 拉索回归产生的模型可能更简单&#xff0c;因…

Redis持久化存储

Redis持久化存储详解 一、核心持久化机制 Redis提供两种主要持久化方式&#xff1a;RDB&#xff08;快照&#xff09; 和 AOF&#xff08;追加文件&#xff09;&#xff0c;以及两者的混合模式。 RDB&#xff08;Redis Database&#xff09;快照持久化 工作原理 RDB通过创建数据…

python学智能算法(三十四)|SVM-KKT条件回顾

【1】引言 前序学习进程中&#xff0c;对软边界拉格朗日方程进行了初步构建。 其中约定了两个拉格朗日乘子要非负&#xff0c;其本质是要满足KKT条件。 今天就乘此次机会&#xff0c;在回顾一下KKT条件。 【2】定义 当问题无约束的时候&#xff0c;只要让函数梯度为零&#…

【网络基础】计算机网络发展背景及传输数据过程介绍

本文旨在帮助初学者建立起计算机网络的基础认知&#xff0c;从网络的发展背景到网络协议的分层模型&#xff0c;再到IP与MAC地址的基本概念&#xff0c;全面覆盖第一阶段学习重点。 &#x1f4cc; 本节重点 了解计算机网络的发展背景&#xff0c;掌握局域网&#xff08;LAN&am…

阿里云-通义灵码:解锁云原生智能开发新能力,让云开发更“灵”~

免责声明&#xff1a;此篇文章所有内容皆是本人实验&#xff0c;并非广告推广&#xff0c;并非抄袭&#xff0c;如有侵权&#xff0c;请联系笔者。 每日一句 信念其实就是相信未来&#xff0c; 相信内在&#xff0c; 以及坦然美好的心境。 目录 每日一句 一. 引言 二.通义…

lesson33:Python协程详解:从原理到实战的异步编程指南

目录 一、协程核心概念&#xff1a;轻量级并发的本质 1.1 什么是协程&#xff1f; 1.2 协程与线程/进程的对比 二、协程工作原理&#xff1a;事件循环与协作式调度 2.1 事件循环&#xff08;Event Loop&#xff09;&#xff1a;协程的"调度中心" 2.2 协作式调度…

深入理解C++模板进阶:非类型参数、特化与分离编译

前言C模板是泛型编程的核心&#xff0c;它允许我们编写与类型无关的代码。在掌握了模板的基础知识后&#xff0c;我们需要进一步了解模板的高级特性&#xff0c;以便更灵活地使用它们。本文将深入探讨三个重要的模板进阶主题&#xff1a;非类型模板参数、模板特化以及模板的分离…

使用winsw把SpringBoot项目注册成window服务

目录 一、使用winsw注册 1.1、项目打jar包 1.2、下载winsw 1.3、把 WinSW.NET4.exe 重新命名 1.4、编写m配置文件用于配置注册信息 1.5、创建文件夹存放你的文件 1.6、安装服务 1.7、启动服务 1.8、卸载服务 1.8、停止服务 一、使用winsw注册 1.1、项目打jar包 例如项目jar包名…

进阶向:Python开发简易QQ聊天机器人

数字化时代的聊天机器人应用在当今数字化时代&#xff0c;聊天机器人已经成为日常生活和商业活动中不可或缺的一部分。根据市场研究数据显示&#xff0c;全球聊天机器人市场规模预计将在2026年达到102亿美元&#xff0c;年复合增长率达到34.75%。这些智能助手正广泛应用于以下场…

基于开源链动2+1模式AI智能名片S2B2C商城小程序的用户留存策略研究

摘要&#xff1a;在数字化商业竞争白热化的当下&#xff0c;用户留存成为企业可持续发展的核心命题。本文聚焦开源链动21模式AI智能名片S2B2C商城小程序这一创新技术组合&#xff0c;通过分析其技术架构、模式创新与生态闭环的协同效应&#xff0c;揭示其在降低用户决策成本、提…

单词的划分(动态规划)

题目描述有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析&#xff0c;需要将它划分成若干个部分&#xff0c;每个部分称为一个单词。出于减少分析量的目的&#xff0c;我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。输入第一行&#xff0c;一…