標籤:src 設定 遠端控制 連接埠 oid 讀取 class 介面 temp
採集DHT11溫濕度資料, 使用stm32f103zet6 的GPIOG11引腳讀取SHT11資料,通過串口列印採集的溫濕度
dht11.c檔案:
#include "dht11.h"#include "delay.h"//複位DHT11void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(30); //主機拉高20~40us}//等待DHT11的回應//返回1:未檢測到DHT11的存在//返回0:存在u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT 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/0u8 DHT11_Read_Bit(void) { u8 retry=0; 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 if(DHT11_DQ_IN)return 1; else return 0; }//從DHT11讀取一個位元組//傳回值:讀到的資料u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat;}//從DHT11讀取一次資料//temp:溫度值(範圍:0~50°)//humi:濕度值(範圍:20%~90%)//傳回值:0,正常;1,讀取失敗u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 buf[5]; u8 i; DHT11_Rst(); if(DHT11_Check()==0) { for(i=0;i<5;i++)//讀取40位元據 { buf[i]=DHT11_Read_Byte(); } if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) { *humi=buf[0]; *temp=buf[2]; } }else return 1; return 0; }//初始化DHT11的IO口 DQ 同時檢測DHT11的存在//返回1:不存在//返回0:存在 u8 DHT11_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PG連接埠時鐘 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //PG11連接埠配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化IO口 GPIO_SetBits(GPIOG,GPIO_Pin_11); //PG11 輸出高 DHT11_Rst(); //複位DHT11 return DHT11_Check();//等待DHT11的回應}
dht11.h檔案
#ifndef __DHT11_H#define __DHT11_H #include "sys.h" //IO方向設定#define DHT11_IO_IN() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}#define DHT11_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}////IO操作函數 #define DHT11_DQ_OUT PGout(11) //資料連接埠 #define DHT11_DQ_IN PGin(11) //資料連接埠 u8 DHT11_Init(void);//初始化DHT11u8 DHT11_Read_Data(u8 *temp,u8 *humi);//讀取溫濕度u8 DHT11_Read_Byte(void);//讀出一個位元組u8 DHT11_Read_Bit(void);//讀出一個位u8 DHT11_Check(void);//檢測是否存在DHT11void DHT11_Rst(void);//複位DHT11 #endif
main.c檔案:
#include "led.h"#include "delay.h"#include "sys.h"#include "usart.h" #include "dht11.h" int main(void) { u8 t=0; u8 temperature; u8 humidity; delay_init(); //延時函數初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定中斷優先順序分組為組2:2位搶佔優先順序,2位響應優先順序 uart_init(115200); //串口初始化為115200 LED_Init(); //初始化與LED串連的硬體介面 while(DHT11_Init()) //DHT11初始化 { printf("DHT11 Error\r\n"); delay_ms(3000); } while(1) { if(t%100==0) //每100ms讀取一次 { DHT11_Read_Data(&temperature,&humidity); //讀取溫濕度值 printf("\r\n溫度:%d\r\n",temperature); printf("濕度:%d\r\n",humidity); } delay_ms(10); t++; if(t==200) { t=0; LED0=!LED0; } }}
串口接收效果:
源碼連結:https://pan.baidu.com/s/1vyIc6Zu2OOWwDsgLQonKKw
提取碼:yolu
12-開發板接入小五物聯實現遠端控制(stm32採集溫濕度感應器DHT11)