STM32CubeMX + HAL庫:基于DHT11溫濕度監測實現

1. 概述

1.1 實驗目的

????????本實驗旨在利用 DHT11 溫濕度傳感器,每隔 5 秒采集一次環境的溫度與濕度數據,并通過串口將數據循環打印輸出。所使用的 DHT11 模塊硬件結構簡單,包含三個接口引腳:電源正極(VCC)、電源負極(GND)以及一根用于數據通信的單總線信號線。

? ? ? ? DHT11 采用的是一種單總線雙向串行通信協議傳輸。這種通信方式僅僅需要一個I/O 口,就能同時完成數據的發送和接收,在短距離、低速率的數據采集應用中具有成本低、接線簡潔的優勢,非常適合初學者進行嵌入式系統開發和溫濕度監測實驗。

1.2 DHT11指標介紹

指標類別DHT11DHT22
溫度測量范圍0°C ~ 50°C-40°C ~ 80°C
溫度精度±2°C±0.5°C
濕度測量范圍20% ~ 90% RH0% ~ 100% RH
濕度精度±5% RH±2% RH
響應時間≈ 1 秒≈ 0.5 秒
采樣間隔≥ 1 秒(低頻)≥ 0.5 秒(更快)
工作電壓3V ~ 5V3.3V ~ 6V
適用場景常規室內監控,成本敏感應用精度要求高、適用于室內外及極端環境
價格(通常)較便宜相對較貴

1.3 硬件連接

?????????DATA接微控制器GPIO引腳,需通過4.7kΩ上拉電阻連接至VCC(確保總線空閑時為高電平),這種模塊已經做好了上拉電阻和工作指示燈的電路集成,只需把正負極通過杜邦線連接到單片機的正負極上,并把DATA 連接到單片機其中的一個GPIO引腳上即可,本文連接的引腳是PE0引腳。

? ? ? ? 如果買的不是模塊,僅僅是DHT11傳感器,是不帶上拉電阻的,而且一共有4個引腳,其中一個是NC(空腳),需要自己進行上拉電阻的焊接,方便在實際工程中使用,集成到已有的板子上。如果是學習或工程研發調試階段,建議買上面那種模塊化的。

1.4 DHT11數據結構?

原始數據 5字節(40bit)固定格式(高位優先輸出):
00101101 (Byte4) | 00000000 (Byte3) | 00011100 (Byte2) | 00000000 (Byte1) | 01001001 (Byte0)

字節序字段名稱數據類型說明
Byte4濕度整數部分8位無符號范圍:0~99%RH
Byte3濕度小數部分8位無符號固定補零(實際分辨率1%RH)
Byte2溫度整數部分8位有符號范圍:-40~+80℃
Byte1溫度小數部分8位無符號固定補零(實際分辨率1℃)
Byte0校驗和8位無符號Byte4+Byte3+Byte2+Byte1

1.5 DHT11時序圖

????????主機發送開始信號后,延時等待 20us-40us 后讀取 DH11T 的回應信號,讀取總線為低電平,說明DHT11 發送響應信號,DHT11 發送響應信號后,再把總線拉高,準備發送數據,每一 bit 數據都以低電平開始,格式見下面圖示。如果讀取響應信號為高電平,則 DHT11 沒有響應,請檢查線路是否連接正常。?

1.5.1 請求數據時序圖? ? ? ??

????????上圖是一個總圖,描述了數據請求階段和數據接收階段,當為數據請求階段時,與HDT11的DATA口連接的單片機I/O口需要設置為推挽輸出模式,因為要寫數據。下圖為數據請求階段時序圖。

1.5.2 接收數據時序圖

????????當單片機向DHT11請求數據后在數據接收階段,需要把單片機I/O設置為浮空輸入模式,讀取數據時序圖如下所示:

數據位為 0 的時序圖

數據位為 1 的時序圖?

2. STM32CubeMX配置

2.1 SYS配置

本文使用JLink下載代碼,如果讀者用STLink同理,都是如下圖選擇

2.2 GPIO配置

2.3 USART1配置

選擇異步通信,波特率115200常用波特率,其他配置默認即可,影響不大,主要是為了打印程序內部信息到控制臺查看。

2.4 RCC配置

選擇外部晶振作為時鐘源,然后如下圖配置時鐘樹,萬年不變,記住配置即可。

最終目的就是要求最后時鐘樹的末端,高速時鐘和低速時鐘分別是72MHz和36MHz?

2.5 PROJECT配置

?3. keil MDK配置

完成上述配置后,點擊右上角的GENERATE CODE生成代碼,并打開工程,便進入到keil MDK界面。

3.1 創建驅動文件

3.1.1 創建目錄和文件

首先在工程目錄core下新建hardware文件夾,方便我們存放一些外部模塊的驅動代碼文件,并新建兩個文件在此文件夾下,分別是dht11.h 和 dht11.c,注意這兩個文件的后綴,不要隱藏文件后綴名,防止后綴錯誤。一般會在這個文件中寫一些模塊的驅動或者封裝功能函數,在主函數中只需調用這些驅動文件的函數即可使用模塊功能為我們的業務服務了。

3.1.2 配置路徑

3.1.3 配置文件

3.2 引入包配置

為了讓串口能夠重定向更方便的打印輸出內容,需要引入這個包

3.3 調試配置

根據自己的調試下載工具選擇,作者使用的JLink V8 所以選擇下圖所示選項,如果是STLink 則選擇對應選項即可。

防止每次下載按重啟按鍵,可選擇燒錄后自動跑新程序這個選項?

配置完后一定要記得關閉keil MDK軟件,再打開VSCode進行編碼工作,否則剛剛設置的內容并沒有生成配置文件,以上配置工作白搞了。

4. VSCode編碼

?打開對應工程后,一定要先編譯下,這樣才能在對應.c文件下找到對應.h文件

4.1 USART1編寫

重定向代碼編寫,這是固定的代碼,找到usart.h / usart.c文件放到對應的位置上即可

/* USER CODE BEGIN 1 */
int fputc(int ch, FILE * file){HAL_UART_Transmit(&huart1,(uint8_t *)&ch, 1, 1000);return ch;
}
/* USER CODE END 1 *//* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

?完成以上兩個地方的代碼編寫后,就可以在業務程序中使用printf(" your context"); 進行串口打印了。

4.2 驅動文件編寫

#ifndef __DHT11_H
#define __DHT11_H#include "stm32f1xx_hal.h"  // 根據實際MCU型號修改
#include <stdint.h>
#include <stdbool.h>// 錯誤碼定義
typedef enum {DHT11_OK = 0,DHT11_ERROR_TIMEOUT,DHT11_ERROR_CHECKSUM,DHT11_ERROR_NO_RESPONSE
} DHT11_Status;// 溫濕度數據結構體
typedef struct {float temperature;  // 溫度(℃)float humidity;     // 濕度(%RH)
} DHT11_Data;// 函數聲明
DHT11_Status DHT11_Write(void);
DHT11_Status DHT11_Read(DHT11_Data *data);
void DHT11_DelayUs(uint32_t us);
#endif
#include "dht11.h"
#include "gpio.h"
#include "usart.h"// 微秒級延時
void DHT11_DelayUs(uint32_t us)
{uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);while (delay--){;}
}// 初始化DHT11(配置GPIO為開漏輸出)
DHT11_Status DHT11_Write(void) {// 1. 配置引腳為推挽輸出(發送起始信號)GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(DHT11_GPIO_Port, &GPIO_InitStruct);// 1. 主機發送起始信號(拉低18ms)HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_RESET);HAL_Delay(18);  // 實際需精確到18ms// 2. 拉高20-40us,切換為輸入模式HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_SET);DHT11_DelayUs(30);return DHT11_OK;
}// 讀取DHT11數據
DHT11_Status DHT11_Read(DHT11_Data *data) {uint8_t buffer[5] = {0};  // 40位數據:濕度整數/小數,溫度整數/小數,校驗和uint8_t checksum = 0;uint16_t timeout = 100;  // 最多等待 100us// 1. 配置引腳為上拉輸入(等待DHT11響應)GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(DHT11_GPIO_Port, &GPIO_InitStruct);// 2. 檢測DHT11響應(40-50us低電平 + 40-50us高電平)timeout = 100;  // 超時時間約100uswhile(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) {DHT11_DelayUs(1);if (--timeout == 0) {return DHT11_ERROR_NO_RESPONSE;  // 等待低電平響應超時}}// 檢測DHT11的響應低電平結束(40-50us低電平)timeout = 60;// 適當增加超時容限while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET) {DHT11_DelayUs(1);if (--timeout == 0) {return DHT11_ERROR_TIMEOUT;  // 低電平持續時間過長}}// 檢測DHT11的響應高電平結束(40-50us高電平)timeout = 60;// 適當增加超時容限while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) {DHT11_DelayUs(1);if (--timeout == 0) {return DHT11_ERROR_TIMEOUT;  // 高電平持續時間過長}}// 3. 讀取40位數據(每位:12-14us低電平 + 高電平長度決定0/1: 26-28us / 116-118us)for (int i = 0; i < 40; i++) {// 等待每位開始的12-14us低電平timeout = 30;  // 適當增加超時容限while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET) {if (--timeout == 0) {return DHT11_ERROR_TIMEOUT;}DHT11_DelayUs(1);}// 測量高電平持續時間DHT11_DelayUs(30);  // 等待30us后采樣if (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) {buffer[i / 8] |= (1 << (7 - (i % 8)));  // 高電平持續時間長,表示1// 等待高電平結束timeout = 100;while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) {if (--timeout == 0) {return DHT11_ERROR_TIMEOUT;}DHT11_DelayUs(1);}}// 如果是0,高電平已經結束(26-28us),不需要額外等待}// 4. 校驗數據(前4字節之和 = 校驗和)checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];if (checksum != buffer[4]) {return DHT11_ERROR_CHECKSUM;}// 5. 填充結果(忽略小數部分)data->humidity = buffer[0];data->temperature = buffer[2];return DHT11_OK;
}

4.2.1 延時函數

因為HAL庫只提供毫秒級別的延時函數,而單總線雙向串行通訊協議的時序圖中有用到微妙級別的延時,所以需要自定義微妙延時函數。?

// 微秒級延時
void DHT11_DelayUs(uint32_t us)
{uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);while (delay--){;}
}

4.2.2 數據請求函數


// 初始化DHT11(配置GPIO為開漏輸出)
DHT11_Status DHT11_Write(void) {// 1. 配置引腳為推挽輸出(發送起始信號)GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(DHT11_GPIO_Port, &GPIO_InitStruct);// 1. 主機發送起始信號(拉低18ms)HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_RESET);HAL_Delay(18);  // 實際需精確到18ms// 2. 拉高20-40us,切換為輸入模式HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_SET);DHT11_DelayUs(30);return DHT11_OK;
}

4.2.3 數據接收函數?

// 讀取DHT11數據
DHT11_Status DHT11_Read(DHT11_Data *data) {uint8_t buffer[5] = {0};  // 40位數據:濕度整數/小數,溫度整數/小數,校驗和uint8_t checksum = 0;uint16_t timeout = 100;  // 最多等待 100us// 1. 配置引腳為上拉輸入(等待DHT11響應)GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = DHT11_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(DHT11_GPIO_Port, &GPIO_InitStruct);// 2. 檢測DHT11響應(40-50us低電平 + 40-50us高電平)timeout = 100;  // 超時時間約100uswhile(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) {DHT11_DelayUs(1);if (--timeout == 0) {return DHT11_ERROR_NO_RESPONSE;  // 等待低電平響應超時}}// 檢測DHT11的響應低電平結束(40-50us低電平)timeout = 60;// 適當增加超時容限while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET) {DHT11_DelayUs(1);if (--timeout == 0) {return DHT11_ERROR_TIMEOUT;  // 低電平持續時間過長}}// 檢測DHT11的響應高電平結束(40-50us高電平)timeout = 60;// 適當增加超時容限while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) {DHT11_DelayUs(1);if (--timeout == 0) {return DHT11_ERROR_TIMEOUT;  // 高電平持續時間過長}}// 3. 讀取40位數據(每位:12-14us低電平 + 高電平長度決定0/1: 26-28us / 116-118us)for (int i = 0; i < 40; i++) {// 等待每位開始的12-14us低電平timeout = 30;  // 適當增加超時容限while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_RESET) {if (--timeout == 0) {return DHT11_ERROR_TIMEOUT;}DHT11_DelayUs(1);}// 測量高電平持續時間DHT11_DelayUs(30);  // 等待30us后采樣if (HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) {buffer[i / 8] |= (1 << (7 - (i % 8)));  // 高電平持續時間長,表示1// 等待高電平結束timeout = 100;while(HAL_GPIO_ReadPin(DHT11_GPIO_Port, DHT11_Pin) == GPIO_PIN_SET) {if (--timeout == 0) {return DHT11_ERROR_TIMEOUT;}DHT11_DelayUs(1);}}// 如果是0,高電平已經結束(26-28us),不需要額外等待}// 4. 校驗數據(前4字節之和 = 校驗和)checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];if (checksum != buffer[4]) {return DHT11_ERROR_CHECKSUM;}// 5. 填充結果(忽略小數部分)data->humidity = buffer[0];data->temperature = buffer[2];return DHT11_OK;
}

4.3 主函數業務代碼

/* USER CODE BEGIN Includes */
#include "dht11.h"
/* USER CODE END Includes *//* USER CODE BEGIN 2 */DHT11_Data sensor_data;/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("hello world!!! \r\t\n");if(DHT11_Write() == DHT11_OK){if (DHT11_Read(&sensor_data) == DHT11_OK) {printf("Temperature: %.1f C, Humidity: %.1f%%RH\r\n", sensor_data.temperature, sensor_data.humidity);} else {printf("DHT11 Read Error! \r\n");}}else {printf("DHT11 Write Error!\r\n");}HAL_Delay(5000);}/* USER CODE END 3 */

?

5. 結果驗證

????????對代碼進行編譯燒錄后,通過連接串口,能夠看到對應的數據,因為DHT11溫濕度傳感器精度不高,所以沒有小數點,盡管程序有讀取,均為0,如果想要更高精度的測量,建議使用DHT22

?

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

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

相關文章

常見排序的特性總結

目錄 1.排序的穩定性 2.直接插入排序的特性總結 3.希爾排序的特性總結 4.直接選擇排序的特性總結 5.堆排序的特性總結 6.冒泡排序的特性總結 7.快速排序的特性總結 8.歸并排序的特性總結 9.計數排序的特性總結 10.總結 1.排序的穩定性 排序的穩定性是說 相同大小的元…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-49,(知識點:OSI模型,物理層、數據鏈路層、網絡層)

目錄 1、題目 2、解答 OSI 七層模型的分層及功能&#xff08;從下到上&#xff09; 1. 物理層&#xff08;Physical Layer&#xff09; &#xff1a;網卡的物理接口、網線、光纖、集線器 2. 數據鏈路層&#xff08;Data Link Layer&#xff09;&#xff1a;交換機&#xf…

R 環境安裝指南

R 環境安裝指南 引言 R 是一種針對統計計算和圖形表示的編程語言和軟件環境。它廣泛應用于數據分析和統計建模領域。本指南旨在為用戶提供一個清晰、詳細的 R 環境安裝步驟,確保用戶能夠順利地開始使用 R 進行數據分析。 安裝前的準備 在開始安裝 R 之前,請確保您的計算機…

Cesium entity跟隨第一人稱視角

1.跟隨視角let firstView:any; const firstPerspective (entity: any) > {firstView () > {let curTime window.viewer.clock.currentTime;const pos entity.position.getValue(curTime);const orientation entity.orientation.getValue(curTime);if (pos &&…

傳輸層協議UDP與TCP

目錄 一. UDP 1.1 UDP協議段格式 1.2 UDP傳輸的特點 1.3 面向數據報 1.4 UDP緩沖區 1.5 報文的理解 二. TCP 2.1 TCP協議段格式 2.2 確認應答機制&#xff08;ACK&#xff09; 2.3 超時重傳機制 2.4 連接管理機制 為什么要三次握手&#xff1f; 三次&#xff1f;四…

SringBoot入門

文章目錄SpringBoot入門一、關于&#xff1a;約定大于配置二、創建SpringBoot項目---起步案例創建SpringBoot項目案例創建項目方式2&#xff1a;通過aliyun網站創建創建項目方式3---基于官方地址創建三、配置項目項目結構自定義配置四、SpringBoot原理&#xff08;重點&#xf…

ansible 版本升級

1. 服務器上查看對應ansible 可安裝的版本 yum info ansible 對比官網,服務器對應ansible 版本比較地址,不利于了解新版本的屬性。 2. 升級比較新的ansible 版本,安裝epel-release wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm rpm -iv…

企業微信API接口發消息實戰:從0到1的技術突破之旅

摘要&#xff1a;本文詳細介紹了通過企業微信官方API接口實現消息發送功能的完整實戰流程。首先闡述了企業微信API在數字化辦公中的重要性&#xff0c;重點講解了消息發送接口的應用場景。實戰部分分為前期準備、開發環境搭建和具體實現三個環節&#xff0c;包括創建企業微信應…

Linux的小程序——進度條

為了寫出這個小程序我們先來了解幾個知識點(一)回車和換行先以寫作文為例子了解一下&#xff0c;當在一行中寫了一半&#xff0c;由此處位置往下一行的操作叫做換行&#xff0c;回到該行的開頭位置為回車。而在c語言中\n幫我們完成了換行和回車兩個動作&#xff0c;那單純回車是…

在macOS上使用VS Code和Clang配置C++開發環境

本文基于VS Code官方文檔&#xff0c;詳細介紹如何在macOS系統下配置Clang/LLVM編譯器與VS Code的C開發環境。通過本文&#xff0c;你將學會如何搭建開發環境、創建并調試C程序&#xff0c;適合C初學者和需要在macOS上進行C開發的開發者。 前提條件 在開始配置前&#xff0c;…

Ganttable 基于工時的進度分析

時間進度分析是 Ganttable 提供的高級進度管理功能&#xff0c;它基于實際工作時長&#xff0c;結合計劃預估工時&#xff0c;可精準計算項目及任務的完成度。開啟進度分析開啟進度分析功能的操作如下&#xff1a;在時間管理頁面&#xff0c;點擊右上角的 “設置” 按鈕&#x…

duiLib 自定義資源目錄

前面的demo&#xff0c;把布局文件放在默認目錄了&#xff0c;想著應該也可以自定義資源路徑。先debug看下默認目錄是什么路徑。設置調試選項&#xff0c;調試信息格式改為程序數據庫&#xff08;/Zi&#xff09;再調試項目&#xff0c;選中監視1&#xff1a;在監護窗口中查看變…

YOLO-01目標檢測基礎

1、概念目標檢測&#xff08;Object Detection&#xff09;是計算機視覺中的一個重要領域&#xff0c;它涉及到識別圖片或視頻某一幀中的物體是什么類別&#xff0c;并確定它們的位置。通常用于多個物體的識別&#xff0c;可以同時處理圖像中的多個實例&#xff0c;并為每個實例…

Linux->動靜態庫

目錄 引入&#xff1a; 一&#xff1a;動靜態庫的介紹 1&#xff1a;庫的本質 2&#xff1a;庫的類別及優缺點 3&#xff1a;動態鏈接 4&#xff1a;靜態鏈接 二&#xff1a;頭文件和庫的查找 三&#xff1a;靜態庫的制作和使用 1&#xff1a;制作 2&#xff1a;指令打…

【LY88】雙系統指南及避坑

一. Windows重裝&#xff08;前提是Windows可正常使用&#xff0c;優點是無需U盤&#xff09; 1. PE工具和系統鏡像 機械師只只提供的資源鏈接 完成微PE工具的安裝并下載了系統鏡像之后&#xff0c;&#xff08;如果要裝ubuntu的話&#xff09;需確認磁盤分區格式和引導項。前…

Ubuntu22.04.1搭建php運行環境

步驟 1: 更新你的系統 首先&#xff0c;確保你的系統是最新的。打開終端并運行以下命令&#xff1a; sudo apt update sudo apt upgrade步驟 2: 安裝Apache Web服務器 使用Apache作為你的Web服務器。運行以下命令&#xff1a; sudo apt install apache2安裝完成后&#xff0c;你…

防止飛書重復回調通知分布式鎖

## 場景銷售訂單下&#xff0c;明細25明細款&#xff0c;發起飛書審批&#xff0c;飛書設置自動審核通過&#xff0c;導致會收到兩次審核通過通知加了分布式鎖 &#xff0c;仍導致執行業務執行兩遍了String lockKey "feihsu-approvalNotify:" instanceCode; RLock …

數據結構:下三角矩陣(Lower Triangular Matrix)

目錄 什么是下三角矩陣&#xff1f; 我們要存哪些元素&#xff1f;一共幾個&#xff1f; 推導索引映射公式 核心問題&#xff1a;給定 (i,j)&#xff0c;如何計算 k&#xff1f; 什么是下三角矩陣&#xff1f; 一個 n n 的矩陣&#xff0c;如果它在主對角線以上的所有元…

力扣209:長度最小的子數組

力扣209:長度最小的子數組題目思路代碼題目 給定一個含有 n 個正整數的數組和一個正整數 target 。 找出該數組中滿足其總和大于等于 target 的長度最小的 子數組 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其長度。如果不存在符合條件的子數組&#xff0c;返回…

采購管理系統哪家性價比高?

在企業數字化轉型進程中&#xff0c;采購管理系統已成為降本增效的核心工具。但面對市場上五花八門的產品&#xff0c;“性價比” 成為企業選型時的關鍵考量 —— 既要功能貼合業務需求&#xff0c;又要成本可控&#xff0c;還需兼顧實施效率與長期擴展性。以下從性價比維度解析…