分模块罗列程序:
DHT11.c
#include "stm32f10x.h"
#include "Delay.h"
#define DHT11_PIN GPIO_Pin_11
#define DHT11_PORT GPIOB
#define DHT11_RCC RCC_APB2Periph_GPIOB
#define u8 uint8_t
void DHT11_IO_IN_Config(void) {
RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿ÕÊäÈë
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
void DHT11_IO_OUT_Config(void) {
//RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
}
void DHT11_StartSignal(void)
{
DHT11_IO_OUT_Config();
GPIO_ResetBits(DHT11_PORT,DHT11_PIN);
Delay_ms(20);
GPIO_SetBits(DHT11_PORT,DHT11_PIN);
Delay_us(30);
}
u8 DHT11_StartResbond(void)
{
u8 retry = 0;
DHT11_IO_IN_Config();
while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN) == 1) && retry < 100)
{
retry++;
Delay_us(1);
};
if(retry >= 100)return 1;
else retry = 0;
while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)== 0) && retry < 100)
{
retry++;
Delay_us(1);
};
if(retry >= 100)return 1;
return 0;
}
void DHT11_Init(void)
{
DHT11_StartSignal();
DHT11_StartResbond();
}
u8 DHT11_ReadBit(void)
{
u8 retry = 0;
while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN) == 1) && retry < 100)
{
retry++;
Delay_us(1);
}
retry = 0;
while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN) == 0) && retry < 100)
{
retry++;
Delay_us(1);
}
Delay_us(40);
if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)== 1)
return 1;
else
return 0;
}
u8 DHT11_ReadByte(void)
{
u8 i=0, data=0;
for (i = 0; i < 8; i++)
{
data <<= 1;
data |= DHT11_ReadBit();
}
return data;
}
void DHT11_ReadData(u8 *temp, u8 *humi)
{
u8 buf[5];
u8 i;
DHT11_StartSignal();
if (DHT11_StartResbond() == 0) {
for (i = 0; i < 5; i++) {
buf[i] = DHT11_ReadByte();
}
if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) {
*humi = buf[0];
*temp = buf[2];
}
}
}
DHT11.h
#ifndef __DHT11_H
#define __DHT11_H
void DHT11_IO_IN_Config(void);
void DHT11_IO_OUT_Config(void) ;
void DHT11_StartSignal(void);
u8 DHT11_StartResbond(void);
void DHT11_Init(void);
u8 DHT11_ReadBit(void);
u8 DHT11_ReadByte(void);
void DHT11_ReadData(uint8_t *temp, uint8_t *humi);
#endif
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "DHT11.h"
#define u8 uint8_t
int main(void)
{
/*模块初始化*/
OLED_Init(); //OLED初始化
DHT11_Init();
/*OLED显示*/
/*OLED_ShowChar(1, 1, 'A'); //1行1列显示字符A
OLED_ShowString(1, 3, "HelloWorld!"); //1行3列显示字符串HelloWorld!
OLED_ShowNum(2, 1, 12345, 5); //2行1列显示十进制数字12345,长度为5
OLED_ShowSignedNum(2, 7, -66, 2); //2行7列显示有符号十进制数字-66,长度为2
OLED_ShowHexNum(3, 1, 0xAA55, 4); //3行1列显示十六进制数字0xA5A5,长度为4
OLED_ShowBinNum(4, 1, 0xAA55, 16);*/ //4行1列显示二进制数字0xA5A5,长度为16
//C语言无法直接写出二进制数字,故需要用十六进制表示
u8 wendu=0,shidu=0;
while (1)
{
Delay_s(1);
DHT11_ReadData(&wendu, &shidu);
OLED_ShowString(1, 1, "Temp:");
OLED_ShowSignedNum(1, 6, wendu, 2);
OLED_ShowString(1, 9, "C");
OLED_ShowString(2, 1, "Humi:");
OLED_ShowSignedNum(2, 6, shidu, 2);
OLED_ShowString(2, 9, "%");
Delay_ms(2000); // 每2秒读取一次
}
}
延时模块Delay.c和OLED.c 用江协科技的即可。