最近在学STM32 刚买的DHT11准备找个例程试试,但是网上很多都不够完善,于是就有了这篇博客。上传有压缩包 直接解压烧录即可
各个引脚位置如下
| 模块 | 引脚 |
|---|---|
| MCU | STM32F103C8T6 |
| DHT11 DATA | PB12 |
| OLED SCL | PB8 |
| OLED SDA | PB9 |
| USART1 | PA9(TX)、PA10(RX) |
main.c
#include "stm32f10x.h" #include "Delay.h" #include "OLED.h" #include "DHT11.h" #include "Serial.h" uint8_t Temp; uint8_t Humi; int main(void) { OLED_Init(); DHT11_Init(); Serial_Init(); OLED_ShowString(1,1,"Temperature:"); OLED_ShowString(3,1,"Humidity:"); while(1) { if(DHT11_Read_Data(&Temp,&Humi)==0) { OLED_ShowNum(1,13,Temp,2); OLED_ShowString(1,15,"C"); OLED_ShowNum(3,10,Humi,2); OLED_ShowString(3,12,"%"); printf("Temp:%d C Humi:%d %%\r\n",Temp,Humi); } else { OLED_ShowString(2,1,"Read Error"); } Delay_ms(1000); } }DHT11.h
#ifndef __DHT11_H #define __DHT11_H #include "stm32f10x.h" void DHT11_Init(void); uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi); #endifDHT11.c
#include "DHT11.h" #include "Delay.h" #define DHT11_PORT GPIOB #define DHT11_PIN GPIO_Pin_12 void DHT11_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=DHT11_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(DHT11_PORT,&GPIO_InitStructure); } void DHT11_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin=DHT11_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(DHT11_PORT,&GPIO_InitStructure); } void DHT11_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); DHT11_OUT(); GPIO_SetBits(DHT11_PORT,DHT11_PIN); } static uint8_t DHT11_ReadBit(void) { while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)==RESET); Delay_us(40); if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)) { while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)); return 1; } else { return 0; } } uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi) { uint8_t i,j; uint8_t buf[5]; DHT11_OUT(); GPIO_ResetBits(DHT11_PORT,DHT11_PIN); Delay_ms(20); GPIO_SetBits(DHT11_PORT,DHT11_PIN); Delay_us(30); DHT11_IN(); while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)); while(!GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)); while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)); for(j=0;j<5;j++) { buf[j]=0; for(i=0;i<8;i++) { buf[j]<<=1; buf[j]|=DHT11_ReadBit(); } } if(buf[4]==buf[0]+buf[1]+buf[2]+buf[3]) { *humi=buf[0]; *temp=buf[2]; return 0; } return 1; }其它驱动均采用江协的写法(看过江协应该都知道)