STM32 入門教程(江科大教材)#筆記2

3-4按鍵控制LED

/** LED.c**/
#include "stm32f10x.h"                  // Device headervoid LED_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		//開啟GPIOA的時鐘/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);						//將PA1和PA2引腳初始化為推挽輸出/*設置GPIO初始化后的默認電平*/GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);				//設置PA1和PA2引腳為高電平
}/*** 函    數:LED1開啟* 參    數:無* 返 回 值:無*/
void LED1_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_1);		//設置PA1引腳為低電平
}/*** 函    數:LED1關閉* 參    數:無* 返 回 值:無*/
void LED1_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_1);		//設置PA1引腳為高電平
}void LED1_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)		//獲取輸出寄存器的狀態,如果當前引腳輸出低電平{GPIO_SetBits(GPIOA, GPIO_Pin_1);					//則設置PA1引腳為高電平}else													//否則,即當前引腳輸出高電平{GPIO_ResetBits(GPIOA, GPIO_Pin_1);					//則設置PA1引腳為低電平}
}/*** 函    數:LED2開啟* 參    數:無* 返 回 值:無*/
void LED2_ON(void)
{GPIO_ResetBits(GPIOA, GPIO_Pin_2);		//設置PA2引腳為低電平
}/*** 函    數:LED2關閉* 參    數:無* 返 回 值:無*/
void LED2_OFF(void)
{GPIO_SetBits(GPIOA, GPIO_Pin_2);		//設置PA2引腳為高電平
}/*** 函    數:LED2狀態翻轉* 參    數:無* 返 回 值:無*/
void LED2_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)		//獲取輸出寄存器的狀態,如果當前引腳輸出低電平{                                                  GPIO_SetBits(GPIOA, GPIO_Pin_2);               		//則設置PA2引腳為高電平}                                                  else                                               		//否則,即當前引腳輸出高電平{                                                  GPIO_ResetBits(GPIOA, GPIO_Pin_2);             		//則設置PA2引腳為低電平}
}
/**Key.c**/
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"void Key_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//開啟GPIOB的時鐘/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						//將PB1和PB11引腳初始化為上拉輸入
}/*** 函    數:按鍵獲取鍵碼* 參    數:無* 返 回 值:按下按鍵的鍵碼值,范圍:0~2,返回0代表沒有按鍵按下* 注意事項:此函數是阻塞式操作,當按鍵按住不放時,函數會卡住,直到按鍵松手*/
uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;		//定義變量,默認鍵碼值為0if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)			//讀PB1輸入寄存器的狀態,如果為0,則代表按鍵1按下{Delay_ms(20);											//延時消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);	//等待按鍵松手Delay_ms(20);											//延時消抖KeyNum = 1;												//置鍵碼為1}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)			//讀PB11輸入寄存器的狀態,如果為0,則代表按鍵2按下{Delay_ms(20);											//延時消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);	//等待按鍵松手Delay_ms(20);											//延時消抖KeyNum = 2;												//置鍵碼為2}return KeyNum;			//返回鍵碼值,如果沒有按鍵按下,所有if都不成立,則鍵碼為默認值0
}
/**main.c**/
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
uint8_t KeyNum;		//定義用于接收按鍵鍵碼的變量int main(void)
{/*模塊初始化*/LED_Init();		//LED初始化Key_Init();		//按鍵初始化while (1){KeyNum = Key_GetNum();		//獲取按鍵鍵碼if (KeyNum == 1)			//按鍵1按下{LED1_Turn();			//LED1翻轉}if (KeyNum == 2)			//按鍵2按下{LED2_Turn();			//LED2翻轉}}
}

3-5光敏傳感器控制蜂鳴器

/*buzzer.c*/
#include "stm32f10x.h"                  // Device headervoid Buzzer_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//開啟GPIOB的時鐘/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						//將PB12引腳初始化為推挽輸出/*設置GPIO初始化后的默認電平*/GPIO_SetBits(GPIOB, GPIO_Pin_12);							//設置PB12引腳為高電平
}void Buzzer_ON(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//設置PB12引腳為低電平
}/*** 函    數:蜂鳴器關閉* 參    數:無* 返 回 值:無*/
void Buzzer_OFF(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_12);		//設置PB12引腳為高電平
}void Buzzer_Turn(void)
{if (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 0)		//獲取輸出寄存器的狀態,如果當前引腳輸出低電平{GPIO_SetBits(GPIOB, GPIO_Pin_12);						//則設置PB12引腳為高電平}else														//否則,即當前引腳輸出高電平{GPIO_ResetBits(GPIOB, GPIO_Pin_12);						//則設置PB12引腳為低電平}
}
/*lightsensor*/
#include "stm32f10x.h"                  // Device headervoid LightSensor_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//開啟GPIOB的時鐘/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						//將PB13引腳初始化為上拉輸入
}uint8_t LightSensor_Get(void)
{return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);			//返回PB13輸入寄存器的狀態
}
/*main.c*/
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"int main(void)
{/*模塊初始化*/Buzzer_Init();			//蜂鳴器初始化LightSensor_Init();		//光敏傳感器初始化while (1){if (LightSensor_Get() == 1)		//如果當前光敏輸出1{Buzzer_ON();				//蜂鳴器開啟}else							//否則{Buzzer_OFF();				//蜂鳴器關閉}}
}

4-1 OLED調試工具

OLED(Organic Light Emitting Diode):有機發光二極管

OLED顯示屏:性能優異的新型顯示屏,具有功耗低、相應速度快、寬視角、輕薄柔韌等特點

0.96寸OLED模塊:小巧玲瓏、占用接口少、簡單易用,是電子設計中非常常見的顯示屏模塊

供電:3~5.5V,通信協議:I2C/SPI,分辨率:128*64

三種調試方式

OLED的驅動函數

?

/**OLED.c**/
#include "stm32f10x.h"
#include "OLED_Font.h"/*引腳配置*/
#define OLED_W_SCL(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x))
#define OLED_W_SDA(x)		GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))/*引腳初始化*/
void OLED_I2C_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_Init(GPIOB, &GPIO_InitStructure);OLED_W_SCL(1);OLED_W_SDA(1);
}void OLED_I2C_Start(void)
{OLED_W_SDA(1);OLED_W_SCL(1);OLED_W_SDA(0);OLED_W_SCL(0);
}/*** @brief  I2C停止* @param  無* @retval 無*/
void OLED_I2C_Stop(void)
{OLED_W_SDA(0);OLED_W_SCL(1);OLED_W_SDA(1);
}void OLED_I2C_SendByte(uint8_t Byte)
{uint8_t i;for (i = 0; i < 8; i++){OLED_W_SDA(Byte & (0x80 >> i));OLED_W_SCL(1);OLED_W_SCL(0);}OLED_W_SCL(1);	//額外的一個時鐘,不處理應答信號OLED_W_SCL(0);
}/*** @brief  OLED寫命令* @param  Command 要寫入的命令* @retval 無*/
void OLED_WriteCommand(uint8_t Command)
{OLED_I2C_Start();OLED_I2C_SendByte(0x78);		//從機地址OLED_I2C_SendByte(0x00);		//寫命令OLED_I2C_SendByte(Command); OLED_I2C_Stop();
}void OLED_WriteData(uint8_t Data)
{OLED_I2C_Start();OLED_I2C_SendByte(0x78);		//從機地址OLED_I2C_SendByte(0x40);		//寫數據OLED_I2C_SendByte(Data);OLED_I2C_Stop();
}
void OLED_SetCursor(uint8_t Y, uint8_t X)
{OLED_WriteCommand(0xB0 | Y);					//設置Y位置OLED_WriteCommand(0x10 | ((X & 0xF0) >> 4));	//設置X位置高4位OLED_WriteCommand(0x00 | (X & 0x0F));			//設置X位置低4位
}
void OLED_Clear(void)
{  uint8_t i, j;for (j = 0; j < 8; j++){OLED_SetCursor(j, 0);for(i = 0; i < 128; i++){OLED_WriteData(0x00);}}
}void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char)
{      	uint8_t i;OLED_SetCursor((Line - 1) * 2, (Column - 1) * 8);		//設置光標位置在上半部分for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i]);			//顯示上半部分內容}OLED_SetCursor((Line - 1) * 2 + 1, (Column - 1) * 8);	//設置光標位置在下半部分for (i = 0; i < 8; i++){OLED_WriteData(OLED_F8x16[Char - ' '][i + 8]);		//顯示下半部分內容}
}void OLED_ShowString(uint8_t Line, uint8_t Column, char *String)
{uint8_t i;for (i = 0; String[i] != '\0'; i++){OLED_ShowChar(Line, Column + i, String[i]);}
}/*** @brief  OLED次方函數* @retval 返回值等于X的Y次方*/
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{uint32_t Result = 1;while (Y--){Result *= X;}return Result;
}void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{uint8_t i;uint32_t Number1;if (Number >= 0){OLED_ShowChar(Line, Column, '+');Number1 = Number;}else{OLED_ShowChar(Line, Column, '-');Number1 = -Number;}for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');}
}void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i, SingleNumber;for (i = 0; i < Length; i++)							{SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;if (SingleNumber < 10){OLED_ShowChar(Line, Column + i, SingleNumber + '0');}else{OLED_ShowChar(Line, Column + i, SingleNumber - 10 + 'A');}}
}void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{uint8_t i;for (i = 0; i < Length; i++)							{OLED_ShowChar(Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');}
}void OLED_Init(void)
{uint32_t i, j;for (i = 0; i < 1000; i++)			//上電延時{for (j = 0; j < 1000; j++);}OLED_I2C_Init();			//端口初始化OLED_WriteCommand(0xAE);	//關閉顯示OLED_WriteCommand(0xD5);	//設置顯示時鐘分頻比/振蕩器頻率OLED_WriteCommand(0x80);OLED_WriteCommand(0xA8);	//設置多路復用率OLED_WriteCommand(0x3F);OLED_WriteCommand(0xD3);	//設置顯示偏移OLED_WriteCommand(0x00);OLED_WriteCommand(0x40);	//設置顯示開始行OLED_WriteCommand(0xA1);	//設置左右方向,0xA1正常 0xA0左右反置OLED_WriteCommand(0xC8);	//設置上下方向,0xC8正常 0xC0上下反置OLED_WriteCommand(0xDA);	//設置COM引腳硬件配置OLED_WriteCommand(0x12);OLED_WriteCommand(0x81);	//設置對比度控制OLED_WriteCommand(0xCF);OLED_WriteCommand(0xD9);	//設置預充電周期OLED_WriteCommand(0xF1);OLED_WriteCommand(0xDB);	//設置VCOMH取消選擇級別OLED_WriteCommand(0x30);OLED_WriteCommand(0xA4);	//設置整個顯示打開/關閉OLED_WriteCommand(0xA6);	//設置正常/倒轉顯示OLED_WriteCommand(0x8D);	//設置充電泵OLED_WriteCommand(0x14);OLED_WriteCommand(0xAF);	//開啟顯示OLED_Clear();				//OLED清屏
}
/**main.c**/
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"int main(void)
{/*模塊初始化*/OLED_Init();		//OLED初始化/*OLED顯示*/OLED_ShowChar(1, 1, 'A');				//1行1列顯示字符AOLED_ShowString(1, 3, "HelloWorld!");	//1行3列顯示字符串HelloWorld!OLED_ShowNum(2, 1, 12345, 5);			//2行1列顯示十進制數字12345,長度為5OLED_ShowSignedNum(2, 7, -66, 2);		//2行7列顯示有符號十進制數字-66,長度為2OLED_ShowHexNum(3, 1, 0xAA55, 4);		//3行1列顯示十六進制數字0xA5A5,長度為4OLED_ShowBinNum(4, 1, 0xAA55, 16);		//4行1列顯示二進制數字0xA5A5,長度為16//C語言無法直接寫出二進制數字,故需要用十六進制表示while (1){}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20190.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20190.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20190.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關系數據庫:關系運算

文章目錄 關系運算并&#xff08;Union&#xff09;差&#xff08;Difference&#xff09;交&#xff08;Intersection&#xff09;笛卡爾積&#xff08;Extended Cartesian Product&#xff09;投影&#xff08;projection&#xff09;選擇&#xff08;Selection&#xff09;除…

微信小程序中應用van-calendar時加載時間過長,以及設置min-data無效的問題解決

一、我們微信小程序中應用van-calendar時&#xff0c;如果沒有設置min-data&#xff0c;那么頁面的加載時間會非常長&#xff0c;所以&#xff0c;一定一定要配置min-data&#xff1b; 二、vue中min-data的寫法是:min-data“new Date(2023, 0, 1)”&#xff0c;而在小程序中的寫…

docker使用docker logs命令查看容器日志的幾種方式

以下是如何使用docker logs命令的基本示例&#xff1a; docker logs [容器ID或名稱]如果想要實時查看日志&#xff0c;可以加上-f參數&#xff0c;這樣日志就會像使用tail -f命令一樣實時輸出。 docker logs -f [容器ID或名稱]如果只想查看最近幾行的日志&#xff0c;可以使用…

讓表單引擎插上AI的翅膀-記馳騁表單引擎加入AI升級

讓表單引擎插上AI的翅膀 隨著科技的飛速發展&#xff0c;人工智能&#xff08;AI&#xff09;已經逐漸滲透到我們工作和生活的每一個角落。在數字化辦公領域&#xff0c;表單引擎作為數據處理和流程自動化的重要工具&#xff0c;也迎來了與AI技術深度融合的新機遇。讓表單引擎…

Java對象的比較——equals方法,Comparable接口,Comparator接口

Java對象的比較——equals方法&#xff0c;Comparable接口&#xff0c;Comparator接口 1. equals方法2. Comparable接口3. Comparator接口 1. equals方法 在判斷兩個整數是否相同時&#xff0c;我們可以使用以下方式&#xff1a; System.out.println(1 2); System.out.printl…

安防綜合管理系統EasyCVR平臺GA/T1400視圖庫:基于XML的消息體格式

GA/T 1400標準的應用范圍廣泛&#xff0c;涵蓋了公安系統的視頻圖像信息應用系統&#xff0c;如警務綜合平臺、治安防控系統、交通管理系統等。在視頻監控系統中&#xff0c;GA/T 1400公安視圖庫的對接是實現視頻圖像信息傳輸、處理和管理的重要環節。 以視頻匯聚EasyCVR視頻監…

【SpringBoot】怎么在一個大的SpringBoot項目中創建多個小的SpringBoot項目,從而形成子父依賴

父子項目工程創建 步驟 先創建父項目 具體操作步驟請看本文章&#xff1a;使用maven工程創建spring boot項目 創建子項目 file- project structure module–new module 剩下步驟請看創建父工程時的操作使用maven工程創建spring boot項目 應用 確認即可 之后創建啟動類…

ARM32開發——LED驅動開發

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 需求介紹現實問題需求分析測試案例構建BSP驅動構建業務實現 需求介紹 開發版中有4個燈&#xff0c;現在需要用4個燈顯示充電情況&a…

618大促有哪些好物是最值得入手的的?請收下這份618必買好物清單!

最近聊的最多的話題就是618&#xff0c;年中購物大狂歡馬上來了&#xff01;&#xff01;今天整理了一下之前購買的好物&#xff0c;發現相比之前的價格真的是太劃算了&#xff0c;趕緊分享出來給大家&#xff0c;趁著這個大促趕緊多存入手~ 推薦1、南卡Neo 2——不傷耳黑科技…

SPHINX的輸出文檔格式

SPHINX的輸出文檔格式 SPHINX的輸出文檔格式更多信息 SPHINX的輸出文檔格式 用rst編寫&#xff0c;然后用sphinx-build進行編譯&#xff0c;還是效果相當不錯地&#xff0c;只要掌握了格式&#xff0c;可以一次編譯&#xff0c;多種格式輸出&#xff0c;主要是用的可能是html和…

記一次netty客戶端的開發

背景 近日要開發一個tcp客戶端程序去對接上游廠商的數據源&#xff0c;決定使用netty去處理&#xff0c;由于很久沒有開發過netty了&#xff0c;順便學習記錄下 netty搭建 考慮到我們需要多個client去對接server服務&#xff0c;所以我們定義一個公共的AbstractNettyClient父…

機器學習:人工智能中實現自動化決策與精細優化的核心驅動力

機器學習在人工智能中確實扮演著實現自動化決策與精細優化的核心驅動力角色。以下是關于這一點的詳細分析: 一、機器學習在自動化決策中的應用 數據驅動:機器學習依賴于大量的數據來進行模型訓練和評估,從而確保決策的準確性。通過自動化數據分析和處理,機器學習能夠從海量…

LabVIEW與Arm控制器之間的通訊

LabVIEW是一個強大的圖形化編程環境&#xff0c;廣泛應用于自動化控制、數據采集和測試測量等領域。而Arm控制器則是嵌入式系統中常用的處理器架構&#xff0c;廣泛用于各種控制和計算任務。將LabVIEW與Arm控制器進行通訊控制&#xff0c;可以結合二者的優勢&#xff0c;實現高…

vue3 中可緩存的方法

場景&#xff1a;在列表中&#xff0c;有這么一個屬性&#xff0c;需要通過同行的其他屬性&#xff0c;進行復雜的計算&#xff0c;才能得出&#xff0c;如果我們用方法&#xff0c;然后傳參&#xff0c;得到這個屬性&#xff0c;那么每次更改列表后&#xff0c;每行都會重新計…

WordPress plugin MStore API SQL注入漏洞復現(CVE-2023-3077)

0x01 產品簡介 WordPress和WordPress plugin都是WordPress基金會的產品。WordPress是一套使用PHP語言開發的博客平臺。該平臺支持在PHP和MySQL的服務器上架設個人博客網站。WordPress plugin是一個應用插件。 0x02 漏洞概述 WordPress plugin MStore API 3.9.8 版本之前存在S…

Linux 深入講解自動化構建工具

各位大佬好 &#xff0c;這里是阿川的博客 &#xff0c; 祝您變得更強 個人主頁&#xff1a;在線OJ的阿川 大佬的支持和鼓勵&#xff0c;將是我成長路上最大的動力 阿川水平有限&#xff0c;如有錯誤&#xff0c;歡迎大佬指正 Linux一系列的文章&#xff08;質量分均在93分…

配置arduino和ESP8266

首先準備好arduino 的IDE和ESP8266的驅動以及板子 1.安裝驅動&#xff0c;雙擊x64的版本驅動&#xff0c;安裝好以后&#xff0c;在資源管理器檢查端口&#xff0c;比如下下圖出現的COM4就是esp8266所使用的端口 2.安裝好arduino最好不要在路徑中存在中文符號&#xff0c;打開…

水滴式粉碎機:多功能飼料粉碎設備

飼料粉碎機是一種專門用于將各種飼料原料進行粉碎處理的機械設備。無論是玉米、小麥等谷物&#xff0c;還是豆粕、魚粉等動物性原料&#xff0c;甚至是一些粗纖維含量較高的秸稈、牧草等&#xff0c;都可以經過飼料粉碎機的處理&#xff0c;變成適合畜禽消化吸收的精細飼料。這…

521源碼-游戲源碼-2024卡牌回合自走棋手游《夢間集》推出全新Linux手工服務端

首款稀有卡牌回合自走棋手游《夢間集》推出全新Linux手工服務端整理 更多網站源碼&#xff0c;游戲源碼&#xff0c;學習教程&#xff0c;請點擊&#x1f449;-521源碼-&#x1f448;獲取最新資源 本游戲下載地址&#xff1a;2024卡牌回合自走棋手游《夢間集》推出全新Linux手…

【再探】設計模式—中介者模式、觀察者模式及模板方法模式

中介者模式讓多對多的復雜引用關系變成一對多&#xff0c;同時能通過中間類來封裝多個類中的行為&#xff0c;觀察者模式在目標狀態更新時能自動通知給訂閱者&#xff0c;模版方法模式則是控制方法的執行順序&#xff0c;子類在不改變算法的結構基礎上可以擴展功能實現。 1 中…