STM32之DHT11溫濕度傳感器---附代碼

DHT11簡介

在這里插入圖片描述
DHT11的供電電壓為 3-5.5V。
傳感器上電后,要等待 1s 以越過不穩定狀態在此期間無需發送任何指令。
電源引腳(VDD,GND)之間可增加一個100nF 的電容,用以去耦濾波。
DATA 用于微處理器與DHT11之間的通訊和同步,采用單總線數據格式,一次通訊時間4ms左右,數據分小數部分和整數部分,當前小數部分用于以后擴展,現讀出為零。
操作流程如下:
一次完整的數據傳輸為40bit,高位先出。
數據格式:8bit濕度整數數據 + 8bit濕度小數數據
+8bi溫度整數數據 + 8bit溫度小數數據
+8bit校驗和
數據傳送正確時校驗和數據等于“8bit濕度整數數據+8bit濕度小數數據
+8bit溫度整數數據+8bit溫度小數數據”所得結果的末8位

在這里插入圖片描述

通訊過程(單線雙向)

在這里插入圖片描述
總線空閑狀態為高電平,主機把總線拉低等待DHT11響應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號。DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號。
主機發送開始信號結束后,延時等待20-40us后,讀取DHT11的響應信號,主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高。
在這里插入圖片描述
總線為低電平(80us低電平響應信號),說明DHT11發送響應信號,DHT11發送響應信號后,再把總線拉高80us,準備發送數據。
每1bit數據都以50us低電平時隙開始,高電平的長短定了數據位是0還是1。
格式見下面圖示:
數字0信號表示方法
在這里插入圖片描述
數字1信號表示方法
在這里插入圖片描述
如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常。當最后1bit數據傳送完畢后,DHT11拉低總線 50us,隨后總線由上拉電阻拉高進入空閑狀態。

#ifndef __DHT11_H
#define __DHT11_H
#include "stm32f10x.h"// 位帶操作宏定義
#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x2000000 + ((addr & 0xFFFFF) << 5) + (bitnum << 2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))// GPIOA的ODR和IDR寄存器地址
#define GPIOA_ODR_ADDR    (GPIOA_BASE + 12) // GPIOA的輸出數據寄存器地址,0x4001080C 
#define GPIOA_IDR_ADDR    (GPIOA_BASE + 8)  // GPIOA的輸入數據寄存器地址,0x40010808// 定義PBout和PBin宏
#define PAout(n)   BIT_ADDR(GPIOA_ODR_ADDR, n)  //輸出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_ADDR, n)  //輸入 /************************************************************************/#define	DHT11_DQ_OUT PAout(15) //數據端口	PA15 
#define	DHT11_DQ_IN  PAin(15)  //數據端口	PA15#define DHT11_GPIO_PORT    	GPIOA			            //GPIO端口
#define DHT11_GPIO_CLK 	    RCC_APB2Periph_GPIOA		//GPIO端口時鐘
#define DHT11_GPIO_PIN		GPIO_Pin_15			        //連接到SCL時鐘線的GPIO/************************************************************************/void DHT11_Rst(void);
uint8_t DHT11_Check(void);
uint8_t DHT11_Read_Bit(void);
uint8_t DHT11_Read_Byte(void);
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi);	 
uint8_t DHT11_Init(void);#endif
#include "stm32f10x.h"                  // Device header
#include "DHT11.h"
#include "Delay.h"/*DHT11數據線為輸出模式*/
void DHT11_IO_OUT(void)
{RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO時鐘和AFIO時鐘GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁用JTAG,保留SWDGPIO_InitTypeDef  GPIO_InitStructure;	GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出模式	 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);				
}/*DHT11數據線為輸入模式*/
void DHT11_IO_IN(void)
{RCC_APB2PeriphClockCmd(DHT11_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO時鐘和AFIO時鐘GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁用JTAG,保留SWDGPIO_InitTypeDef  GPIO_InitStructure;	GPIO_InitStructure.GPIO_Pin = DHT11_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入模式GPIO_Init(DHT11_GPIO_PORT, &GPIO_InitStructure);
}/*復位DHT11傳感器*/
void DHT11_Rst(void)	   
{                 DHT11_IO_OUT(); 	//設置輸出模式DHT11_DQ_OUT = 0; 	//將數據線拉低,等待DHT11響應Delay_ms(20);    	//拉低至少18ms,保證DHT11能檢測到起始信號DHT11_DQ_OUT = 1; 	//將數據線拉高 Delay_us(30);     	//主機拉高20~40us,讀取DHT11的響應信號
}/*檢查DHT11是否存在*/
//返回1:未檢測到DHT11的存在
//返回0:檢測到DHT11的存在
uint8_t DHT11_Check(void) 	   
{   uint8_t retry = 0;DHT11_IO_IN(); //設置輸入模式 //DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us低電平響應信號//DHT11發送響應信號后,再把總線拉高80us,準備發送數據while (DHT11_DQ_IN && retry < 100)	//DHT11會拉低40~80us{retry++;Delay_us(1);};	 if(retry >= 100) return 1;else retry = 0;while (!DHT11_DQ_IN && retry < 100)	//DHT11拉低后會再次拉高40~80us{retry++;Delay_us(1);};if(retry >= 100) return 1;	    return 0;
}/*DHT11讀取一個位*/
//返回值:數據位1或0
uint8_t DHT11_Read_Bit(void)
{uint8_t retry = 0;//每1bit數據都以50us低電平時隙開始while(DHT11_DQ_IN && retry < 100)	//等待變為低電平{retry++;Delay_us(1);}retry = 0;while(!DHT11_DQ_IN && retry < 100)	//等待變高電平{retry++;Delay_us(1);}Delay_us(40);	//等待40us//高電平的長短定了數據位是0還是1//26us-28us表示0,70us表示1if(DHT11_DQ_IN) return 1;else return 0;
}/*DHT11讀取一個字節*/
//返回值:讀到的數據
uint8_t DHT11_Read_Byte(void)    
{        uint8_t i,data;data = 0;for (i = 0; i < 8; i++) {data<<=1; data |= DHT11_Read_Bit();}						    return data;
}/*DHT11讀取一次數據*/
//temp:溫度值(范圍:0~50°)
//humi:濕度值(范圍:20%~90%)
//返回值:0,正常;1,讀取失敗
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)    
{        uint8_t buf[5];uint8_t i;DHT11_Rst();if(DHT11_Check() == 0){for(i = 0; i < 5; i++)	//讀取40位數據{buf[i] = DHT11_Read_Byte();}//數據格式:8bit濕度整數數據 + 8bit濕度小數數據 + 8bi溫度整數數據 + 8bit溫度小數數據 + 8bit校驗和//8bit校驗和 = 8bit濕度整數數據 + 8bit濕度小數數據 + 8bit溫度整數數據 + 8bit溫度小數數據if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) //校驗數據{*humi = buf[0];*temp = buf[2];}}else return 1;return 0;
}//初始化DHT11的IO口同時檢測DHT11是否存在
//返回1:不存在
//返回0:存在    	 
uint8_t DHT11_Init(void)
{	    DHT11_Rst();  //復位DHT11return DHT11_Check();	//等待DHT11的回應
} 

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

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

相關文章

#define STEUER_A_H {PWM_A_ON}

目錄 一、括號的區別 二、實例講解 三、注意事項 四、總結 五、補充 一、括號的區別 大括號 {}: 在 C/C 中&#xff0c;大括號一般用于表示一個代碼塊或結構體、集合等。例如&#xff1a; 用于定義函數體、控制結構&#xff08;如 if、for&#xff09;的代碼塊。用于初始化…

Redis 緩存—處理高并發問題

Redis的布隆過濾器、單線程架構、雙寫一致性、比較穿透、擊穿及雪崩、緩存更新方案及分布式鎖。 1 布隆過濾器 是一種高效的概率型數據結構&#xff0c;用于判斷元素是否存在。主要用于防止緩存穿透&#xff0c;通過攔截不存在的數據查詢&#xff0c;避免擊穿數據庫。 原理&…

【玩轉全棧】—— 無敵前端究極動態組件庫--Inspira UI

目錄 Inspira UI 介紹 配置環境 使用示例 效果&#xff1a; Inspira UI 學習視頻&#xff1a; 華麗優雅 | Inspira UI快速上手_嗶哩嗶哩_bilibili 官網&#xff1a;https://inspira-ui.com/ Inspira UI 介紹 Inspira UI 是一個設計精美、功能豐富的用戶界面庫&#xff0c;專為…

【OpenCV圖像處理實戰】從基礎操作到工業級應用

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心代碼實現&#xff08;6個案例&#xff09;案例1&#xff1a;圖像基本操作案例2&#xff1a;邊緣檢測案例3&…

fastjson使用parseObject轉換成JSONObject出現將字符特殊字符解析解決

現象&#xff1a;將字符串的${TARGET_VALUE}轉換成NULL字符串了問題代碼&#xff1a; import com.alibaba.fastjson.JSON;JSONObject config JSON.parseObject(o.toString()); 解決方法&#xff1a; 1.更換fastjson版本 import com.alibaba.fastjson2.JSON;或者使用其他JS…

Docker Compose 和 Kubernetes(k8s)區別

前言&#xff1a;Docker Compose 和 Kubernetes&#xff08;k8s&#xff09;是容器化技術中兩個常用的工具&#xff0c;但它們的定位、功能和適用場景有顯著區別。以下是兩者的核心對比&#xff1a; ??1. 定位與目標?? ??特性?? ??Docker Compose?? ??Kubernet…

【21天學習打卡挑戰賽】如何學習WEB安全:逼自己在短時間掌握WEB安全核心內容

&#x1f36c; 博主介紹 &#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【數據通信】 【通訊安全】 【web安全】【面試分析】 &#x1f389;點贊?評論?收藏 養成習…

Oracle數據庫巡檢腳本

1.查詢實例信息 SELECT INST_ID, INSTANCE_NAME, TO_CHAR(STARTUP_TIME, YYYY-MM-DD HH24:MI:SS) AS STARTUP_TIME FROM GV$INSTANCE ORDER BY INST_ID; 2.查看是否歸檔 archive log list 3.查看數據庫參數 SELECT NAME , TYPE , VALUE FROM V$PARAMETER ORDER BY NAME; 4.…

Windows 安裝 JDK

下載 Java8 的下載直接訪問&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 接受協議后點擊下載&#xff0c;再輸入賬號信息就可以下載了。 如果…

強化學習核心原理及數學框架

1. 定義與核心思想 強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種通過智能體&#xff08;Agent&#xff09;與環境&#xff08;Environment&#xff09;的持續交互來學習最優決策策略的機器學習范式。其核心特征為&#xff1a; ??試錯學習??&#x…

Netty前置基礎知識之BIO、NIO以及AIO理論詳細解析和實戰案例

前言 Netty是什么&#xff1f; Netty 是一個基于 Java 的 ?高性能異步事件驅動網絡應用框架&#xff0c;主要用于快速開發可維護的協議服務器和客戶端。它簡化了網絡編程的復雜性&#xff0c;特別適合構建需要處理海量并發連接、低延遲和高吞吐量的分布式系統。 1)Netty 是…

TIM輸入捕獲知識部分

越往左&#xff0c;頻率越高&#xff1b;越往右&#xff0c;頻率越低。【越緊湊&#xff0c;相同時間&#xff0c;次數越多】 計算頻率的方法&#xff1a;測評法、測周法、中界頻率。 頻率的定義&#xff1a;1s內出現了多少個重復的周期 測評法就是從頻率的定義出發的&#…

4.4 記憶機制與上下文管理:短期與長期記憶的設計與應用

記憶機制與上下文管理已成為智能代理&#xff08;Agent&#xff09;系統實現高效、智能化行為的核心技術。記憶機制通過短期記憶&#xff08;Short-Term Memory, STM&#xff09;和長期記憶&#xff08;Long-Term Memory, LTM&#xff09;支持Agent存儲、檢索和利用信息&#x…

深入了解遞歸、堆與棧:C#中的內存管理與函數調用

在編程中&#xff0c;理解如何有效地管理內存以及如何控制程序的執行流程是每個開發者必須掌握的基本概念。C#作為一種高級編程語言&#xff0c;其內存管理和函數調用機制包括遞歸、堆與棧。本文將詳細講解這三者的工作原理、用途以及它們在C#中的實現和應用。 1. 遞歸 (Recur…

leetcode day 35 01背包問題 416+1049

0-1背包問題 &#xff08;1&#xff09;第一種情況&#xff1a;二維dp[i][j]數組 dp[i][j]表示[0,i]的物品放入容量為j背包的最大價值 不放物品i,dp[i][j]dp[i-1][j] 放物品i,dp[i][j]dp[i-1][j-w[i]]v[i] 遞推公式為&#xff1a; dp[i][j]dp[i-1][j];//不放 if(w[i]<j)dp…

算法時代的“摩西十誡”:AI治理平臺重構數字戒律

一、引言 數字時代的狂飆突進中&#xff0c;人工智能&#xff08;AI&#xff09;正以顛覆性的力量重塑人類社會。從醫療診斷到金融決策&#xff0c;從智能制造到輿論傳播&#xff0c;AI的觸角已延伸至每個角落。 然而&#xff0c;斯坦福大學《2024年人工智能指數報告》揭示的…

上岸率85%+,25西電先進材料與納米科技學院(考研錄取情況)

1、先進材料與納米科技學院各個方向 2、先進材料與納米科技學院近三年復試分數線對比 學長、學姐分析 由表可看出&#xff1a; 1、材料科學與工程25年相較于24年上升10分&#xff0c;為290分 2、材料與化工&#xff08;專碩&#xff09;25年相較于24年下降20分&#xff0c;為…

Tomcat Web應用(Ubuntu 18.04.6 LTS)部署筆記

一、前言 本文與【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】和【JDK&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】同批次&#xff1a;先搭建數據庫&#xff0c;再安裝JVM&#xff0c;后面就是部署Web應用&#xff1a;典型的單機部署。 ??本著善…

Datawhale AI春訓營——用AI幫助老人點餐

詳細內容見官網鏈接&#xff1a;用AI幫助老人點餐-活動詳情 | Datawhale

17.第二階段x64游戲實戰-人工遍歷二叉樹結構

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 本次游戲沒法給 內容參考于&#xff1a;微塵網絡安全 上一個內容&#xff1a;16.第二階段x64游戲實戰-分析二叉樹結構 上一個內容里把二叉樹的結構寫了寫&am…