历史上的今天
今天是:2024年09月10日(星期二)
2021年09月10日 | DHT11温湿度传感器stm32测试程序
2021-09-10 来源:eefocus
//dht11.h
#ifndef __DHT_H__
#define __DHT_H__
#include "stm32f10x.h"
#include "systick.h"
#include "led.h"
#include "stdio.h"
#include "Usart1.h"
#define DHT11_GPIO_TYPE GPIOA
#define DHT11_GPIO_PIN GPIO_Pin_8
#define DHT11_RCC RCC_APB2Periph_GPIOA
#define DHT11_OUT_H GPIO_SetBits(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)
#define DHT11_OUT_L GPIO_ResetBits(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)
#define DHT11_IN GPIO_ReadInputDataBit(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)
void dht11_gpio_input(void);
void dht11_gpio_output(void);
u16 dht11_scan(void);
u16 dht11_read_bit(void);
u16 dht11_read_byte(void);
u16 dht11_read_data(u8 buffer[4]);
#endif
//dht11.c
#include "dht.h"
void dht11_gpio_input(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);
GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(DHT11_GPIO_TYPE, &GPIO_InitStruct);
}
void dht11_gpio_output(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);
GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(DHT11_GPIO_TYPE, &GPIO_InitStruct);
}
void dht11_reset(void)
{
dht11_gpio_output();//配置IO口输出模式
DHT11_OUT_L;//拉低IO口
Delay_us(19000);//延时18ms-30ms之间
DHT11_OUT_H;//拉高IO口
Delay_us(30);//延时30us,等待接收
dht11_gpio_input();//配置为输入模式
}
u16 dht11_scan(void)
{
return DHT11_IN;
}
u16 dht11_read_bit(void)
{
while (DHT11_IN == RESET);//等待低电平结束
Delay_us(40);//延时40us,如果是信号0,高电平信号在26-28us之间,如果是信号1,高电平信号在70us
if (DHT11_IN == SET)//如果还是高电平就是信号1
{
while (DHT11_IN == SET);//等待此信号结束
return 1;
}
else
{
return 0;
}
}
u16 dht11_read_byte(void)
{
u16 i;
u16 data = 0;
for (i = 0; i < 8; i++)
{
data <<= 1;
data |= dht11_read_bit();
}
return data;
}
u16 dht11_read_data(u8 buffer[5])
{
u16 i = 0;
u8 checksum;
dht11_reset();//发送起始信号
if (dht11_scan() == RESET)
{
//等待响应信号结束
while (dht11_scan() == RESET);
while (dht11_scan() == SET);
for (i = 0; i < 5; i++)
{
buffer[i] = dht11_read_byte();
}
while (dht11_scan() == RESET);//接收结束,拉高片选
dht11_gpio_output();
DHT11_OUT_H;
checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];//校验数据
if (checksum != buffer[4])
{
// checksum error
return 1;
}
}
return 0;
}
//main.c测试
if(dht11_read_data(buf)==0){
hum = buf[0] + buf[1] / 10.0;
temp = buf[2] + buf[3] / 10.0;
}
printf("湿度 == %.2f%%RHrn",hum);
printf("温度 == %.2f℃rn",temp);
Delay_ms(2000);
史海拾趣
|
这是二种目前顶级的100M,1300V高压差分探头,如果你用这此类探头,从参数上来分析,你认为哪款要好点,探头分为标号1和标号2,点评时不要把标号搞错了,凡是参加的人员,我将把国内市埸上的同一等级(P5205为参照点)共六款在不同频率下所测出的波形与参数提 ...… 查看全部问答> |
|
本人有全套车载导航程序,有需要的请 联系我。VC开发,无需控件。QQ:626149468 本人有全套车载导航程序,有需要的请 联系我。底层开发,无需控件。QQ:626149468 能用于WINCE平台。… 查看全部问答> |
|
我用STM32f101c6t6和STM32f103vbt6各做20台仪表,复位电路10K电阻和1UF电容组成复位电路,发现103VBT6有时不能顺利 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:36 编辑 #ifndef _AD_func #define _AD_func void main(); void SystemInit(void); void AdInit(void); #endif 一个头文件 但是不知道什么意思 … 查看全部问答> |
|
多个pio的中断可以不可以写在一起,这样 IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_BRK_BASE | PIO_FR_BASE | PIO_QS_BASE | PIO_EN_BASE, 1); 一个pio写一句?这样是不是很麻烦… 查看全部问答> |




