stm32+DHT11温湿度测量程序

分模块罗列程序:

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  用江协科技的即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值