
最近在学STM32 刚买的DHT11准备找个例程试试但是网上很多都不够完善于是就有了这篇博客。上传有压缩包 直接解压烧录即可各个引脚位置如下模块引脚MCUSTM32F103C8T6DHT11 DATAPB12OLED SCLPB8OLED SDAPB9USART1PA9(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_PinDHT11_PIN; GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz; GPIO_Init(DHT11_PORT,GPIO_InitStructure); } void DHT11_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_PinDHT11_PIN; GPIO_InitStructure.GPIO_ModeGPIO_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(j0;j5;j) { buf[j]0; for(i0;i8;i) { buf[j]1; buf[j]|DHT11_ReadBit(); } } if(buf[4]buf[0]buf[1]buf[2]buf[3]) { *humibuf[0]; *tempbuf[2]; return 0; } return 1; }其它驱动均采用江协的写法看过江协应该都知道