串口通信02 溫度傳感DS18B20 01 day49

九:串口通信

通信:無線和有線

? 單工 半雙工 全雙工

并行:多個數據線 串行:一根數據線

同步:通信雙方使用同一個時鐘,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;一…