電子開發(fā)網(wǎng)

              電子開發(fā)網(wǎng)電子設(shè)計(jì) | 電子開發(fā)網(wǎng)Rss 2.0 會員中心 會員注冊
              搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 電子開發(fā) >> 單片機(jī) >> 正文

              STM32(三十一)DHT11溫濕度傳感器獲取溫濕度數(shù)據(jù)

              作者:佚名    文章來源:本站原創(chuàng)    點(diǎn)擊數(shù):    更新時(shí)間:2023/7/29
              一、傳感器實(shí)物圖

              DHT11溫濕度傳感器 

              二、DHT11傳感器應(yīng)用電路圖:

              DHT11傳感器應(yīng)用電路圖 

              DHT11傳感器應(yīng)用電路圖 

               

               通過原理圖可知dht11通過DQ腳和STM32F407ZE06的PG9連接。通過DQ進(jìn)行數(shù)據(jù)傳輸,串行接口 (單線雙向),半雙工的工作模式。

              串行接口 (單線雙向)

              DATA 用于微處理器與 DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時(shí)間4ms左右,數(shù)據(jù)分小數(shù)部分和整數(shù)部分,具體格式在下面說明,當(dāng)前小數(shù)部分用于以后擴(kuò)展,現(xiàn)讀出為零.操作流程如下:

              • 一次完整的數(shù)據(jù)傳輸為40bit,高位先出。
              • 數(shù)據(jù)格式:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)+8bit校驗(yàn)和
              • 數(shù)據(jù)傳送正確時(shí)校驗(yàn)和數(shù)據(jù)等于“ 8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bi溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù)” 所得結(jié)果的末8位。
              三、數(shù)據(jù)傳輸過程

                用戶MCU發(fā)送一次開始信號后,DHT11從低功耗模式轉(zhuǎn)換到高速模式,等待主機(jī)開始信號結(jié)束后,DHT11發(fā)送響應(yīng)信號,送出40bit的數(shù)據(jù),并觸發(fā)一次信號采集,用戶可選擇讀取部分?jǐn)?shù)據(jù).從模式下,DHT11接收到開始信號觸發(fā)一次溫濕度采集,如果沒有接收到主機(jī)發(fā)送開始信號,DHT11不會主動進(jìn)行溫濕度采集.采集數(shù)據(jù)后轉(zhuǎn)換到低速模式。

                 

              t1~t2 至少18ms
              t3~t4 20~40us
              t5~t6    80us
              t7~t8    80us
              t9~t10    50us
              t11~t12 26us~28us(表示數(shù)據(jù)0)
              t13~t14    50us
              t15~t16 70us(表示數(shù)據(jù)1)

              (1)起始階段:主機(jī)(DQ腳PG9)主動發(fā)送至少18ms(t1-t2)的低電平(開始信號)此時(shí)PG9是輸出模式(MCU給DHT11發(fā)),保證DHT11能檢測到起始信號,DHT11檢測到起始信號后,從低功耗模式轉(zhuǎn)換為高速模式,在拉高延時(shí)等待20~40us(t3-t4),此時(shí)開始信號結(jié)束。

              (2)響應(yīng)階段:DHT11檢測到起始信號后,發(fā)送80us(t5-t6)的低電平響應(yīng)(此時(shí)PG9是輸入模式,由DHT11向MCU發(fā)),在拉高延時(shí)80us(t7-t8)準(zhǔn)備輸出,此時(shí)響應(yīng)結(jié)束,準(zhǔn)備傳輸數(shù)據(jù)。

              (3)數(shù)據(jù)傳輸階段:數(shù)據(jù)傳輸階段,每一bit數(shù)據(jù)都以50us低電平(t9-t10)時(shí)隙開 ,數(shù)據(jù)0和數(shù)據(jù)1的區(qū)別在與高電平的時(shí)間長短。

                數(shù)據(jù)0:26us~28us的高電平。(即只要判斷高電平的時(shí)間超過30us就是傳輸數(shù)據(jù)1,否則就是0).

                數(shù)據(jù)1:70us的的高電平。

               

               四、實(shí)驗(yàn):通過串口打印出溫濕度數(shù)據(jù)。

               

                代碼分析:有兩種方式,一種是使用精準(zhǔn)延時(shí),還有一種就是while循環(huán)。

              //dht11.c文件
              #include "dht11.h" GPIO_InitTypeDef GPIO_InitStruct; u8 buff; void Dht11_Init(void) { //1.初始化時(shí)鐘 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE); //2.初始化硬件 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//PG9 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//輸出模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽輸出 GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度 快速 25MHz GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOG,&GPIO_InitStruct); } /***************傳入?yún)?shù)確定是輸出還是輸入**********************/ void pin_mode(GPIOMode_TypeDef mode) { GPIO_InitStruct.GPIO_Mode = mode;//模式切換 GPIO_Init(GPIOG,&GPIO_InitStruct);//加進(jìn)結(jié)構(gòu)體 } /******************初步配置(開始信號)**************************/ uint8_t start_dht11(void) { //1.設(shè)置為輸出模式,并且空閑狀態(tài)為高電平 pin_mode(GPIO_Mode_OUT); PGout(9)=1; delay_us(2); //2.主機(jī)拉低 至少18ms PGout(9)=0; delay_ms(20); //3.主機(jī)拉高 20-40us PGout(9)=1; delay_us(30); //4.設(shè)置為輸入模式,進(jìn)入兩個(gè)電平跳變 pin_mode(GPIO_Mode_IN); if(!PGin(9))//if(PGin(9)==0) { //檢測低到高跳變 while(!PGin(9)); //檢測高到底跳變 while(PGin(9)); return 1; } return 0; } /*********************獲取8bit數(shù)據(jù)*******************/ void get_8bit_data(void) { u8 i=0; for(i=0;i<8;i++) { buff = buff <<1; while(!PGin(9));//過濾低電平時(shí)間,確定高電平到來 delay_us(30); if(PGin(9))//如果還是高電平,數(shù)據(jù)就是1 { buff |= 0x01; } else//低電平的話,數(shù)據(jù)就是0 { buff &= 0xfe; } while(PGin(9));//過濾剩余的高電平時(shí)間 } } /****************獲取溫濕度數(shù)據(jù)*******************/ uint8_t get_dht11_data(char DataBuf[]) { if(start_dht11()) { get_8bit_data();//獲取的是濕度整數(shù) DataBuf[0] = buff; get_8bit_data();//獲取的是濕度小數(shù) DataBuf[1] = buff; get_8bit_data();//獲取的是溫度整數(shù) DataBuf[2] = buff; get_8bit_data();//獲取的是溫度小數(shù) DataBuf[3] = buff; get_8bit_data();//獲取的是校驗(yàn)和 DataBuf[4] = buff; } if(DataBuf[4] == DataBuf[0]+DataBuf[1]+DataBuf[2]+DataBuf[3]) { return 1; } else return -1; }

                

              //mian.c文件
              #include "stm32f4xx.h"
              #include "led.h"
              #include "key.h"
              #include "exti.h"
              #include "sys.h"
              #include "tim.h"
              #include "pwm.h"
              #include "uart.h"
              #include "stdio.h"
              #include "dht11.h"
              uint16_t uart1_recv_data;
              //重定向fputc 換個(gè)方向,此路不通,屏幕輸出不了就往串口發(fā)
              //fputc fputs / fgetc fgets
              int fputc(int ch,FILE *f)
              {
              USART_SendData(USART1,ch);
              while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
              return ch;
              }
              //串口接收中斷
              void USART1_IRQHandler(void)
              {
              //判斷確實(shí)進(jìn)中斷標(biāo)志
              //if(USART_GetITStatus(USART1, USART_IT_RXNE) !=RESET)//==SET
              if(((USART1->SR) & (0x1<<5)) !=0)//發(fā)生中斷 該為由硬件自定置1
              {
              //清楚中斷標(biāo)志位 往里面寫1 記住一定要清空
              //USART_ClearITPendingBit(USART1,USART_IT_RXNE);//用寄存器方式自己去改
              USART1->SR &= ~(0x1<<5);
              uart1_recv_data = USART_ReceiveData(USART1);
              } 
              }
              int main(void)
              {
              u8 ret;
              char DataBuf[5] = {0};
              NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC 分組
              SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//滴答定時(shí)器8分頻
              LED_Init();
              Key_Init();
              //Exti_Init();
              //Tim_Init();
              //Pwm_Tim14();
              Uart_Init(115200);
              Dht11_Init();
              printf("hello uart1\r\n");
              while(1)
              {
              ret = get_dht11_data(DataBuf);
              if(ret == 1)
              {
              printf("溫度:%d ℃ 濕度:%d\r\n",DataBuf[2],DataBuf[0]); 
              }
              else
              {
              printf("get dht11 failed!");
              }
              delay_s(2);
              }
              return 0;
              }
              
              Tags:STM32單片機(jī),STM32,DHT11,溫濕度傳感器  
              責(zé)任編輯:admin
              請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
              1分 2分 3分 4分 5分

              還可以輸入 200 個(gè)字
              [ 查看全部 ] 網(wǎng)友評論
              最新推薦
              關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
              返回頂部
              刷新頁面
              下到頁底
              晶體管查詢
              国产精品哟女在线观看| 无码国产精品一区二区免费式芒果| 久久精品国产亚洲av日韩| 国产一区二区三区精品视频| 动漫精品专区一区二区三区不卡 | 99久久成人国产精品免费| 日本精品久久久久中文字幕8| 精品国产精品国产偷麻豆| 中文国产成人精品久久不卡| 三级国产精品| 国产玖玖玖九九精品视频| 亚洲精品国产V片在线观看 | 亚洲精品456播放| 久久精品人人做人人妻人人玩| 亚洲国产成人精品不卡青青草原 | 高清日韩精品一区二区三区 | 欧美精品黑人粗大| 国产日韩高清三级精品人成 | 精品欧洲AV无码一区二区男男| 亚洲综合精品香蕉久久网97| 亚洲国产精品自产在线播放| 国产精品毛片无遮挡| 国产精品igao视频网| 国产精品99| 国产韩国精品一区二区三区| 在线精品动漫一区二区无广告| 亚洲国产人成精品| 国内精品久久久久影院优| 国产一区二区精品久久岳| 亚洲av成人无码久久精品| 91在线手机精品超级观看| 四虎国产精品免费观看| 四虎国产精品成人免费久久| 精品国产乱码久久久久久郑州公司| 国产午夜精品理论片久久| 无码国产精品一区二区免费16| AAA级久久久精品无码区| 真实国产乱子伦精品视频| 99久久国产主播综合精品| 美女露出尿口让人摸| 亚洲精品国产精品乱码不卡√|