简单的DHT11数据采集,只需简单替换延时函数、替换宏定义DATA单总线采用引脚,调用一个测试函数即可获得采集的数据,轻松方便.


<<<<<dht11.h>>>>>

#ifndef _DHT11_H_ #define _DHT11_H_ #include "stm32f10x.h" /*****全局变量定义****/
extern u8 recv_byte[5]; /***********函数定义****************/ void
THTB_DATA_InitConfig(void); void DHT11_Test(void); #endif
<<<<<dht11.c>>>>>
#include "dht11.h" /**********改变data引脚定义即可,例如我这里引脚为PB5*******************/
#define GPIO_PORT_THTB GPIOB #define RCC_THTB_PORT RCC_APB2Periph_GPIOB #define
THTB_DATA_PIN GPIO_Pin_5 #define THTB_DATA_1() GPIO_SetBits(GPIO_PORT_THTB,
THTB_DATA_PIN) /* DATA = 1 */ #define THTB_DATA_0()
GPIO_ResetBits(GPIO_PORT_THTB, THTB_DATA_PIN) /* DATA = 0 */ #define
THTB_DATA_READ() GPIO_ReadInputDataBit(GPIO_PORT_THTB, THTB_DATA_PIN) /* 读状态*/
u8 recv_byte[5] = { 0 }; //全局变量,包含头文件即可使用数据
/************************************ recv_byte[0] ==> 8bit湿度整数数据 recv_byte[1]
==> 8bit湿度小数数据 recv_byte[2] ==> 8bi温度整数数据 recv_byte[3] ==> 8bit温度小数数据
recv_byte[4] ==> 8bit校验和 ************************************/ //初始化 void
THTB_DATA_InitConfig(void){ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_THTB_PORT,ENABLE); GPIO_InitStructure.GPIO_Pin =
THTB_DATA_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIO_PORT_THTB,
&GPIO_InitStructure); GPIO_SetBits(GPIO_PORT_THTB, THTB_DATA_PIN); } static
void DATA_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = THTB_DATA_PIN; GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIO_PORT_THTB, &GPIO_InitStructure); GPIO_SetBits(GPIO_PORT_THTB,
THTB_DATA_PIN); } static void DATA_IN(void) { GPIO_InitTypeDef
GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = THTB_DATA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_IPU; GPIO_Init(GPIO_PORT_THTB, &GPIO_InitStructure);
GPIO_SetBits(GPIO_PORT_THTB, THTB_DATA_PIN); } //开始信号 void
THTB_DATA_Start(void) { DATA_OUT(); THTB_DATA_0(); delay_ms(20); DATA_IN(); }
//接收应答信号 u8 THTB_DATA_RecvACK(void) { DATA_IN(); delay_us(30);
while(THTB_DATA_READ()) { delay_us(50); if(THTB_DATA_READ()) return 1; }
delay_us(50); if(!THTB_DATA_READ()) return 0; return 1; } //读取数据 void
THTB_DATA_RecvByte(void) { int i,j = 0; DATA_IN(); delay_us(40);
while(THTB_DATA_READ()); for(j = 0;j < 5;j++){ for(i = 0;i < 8;i++) {
recv_byte[j] <<= 1; while(!THTB_DATA_READ()); delay_us(30);
if(THTB_DATA_READ()) { recv_byte[j] |= 0x01; while(THTB_DATA_READ()); } } } }
//检测 u8 DHT11_CheckOk(void) { THTB_DATA_Start(); if (THTB_DATA_RecvACK() == 0)
{ return 0; } else { return 1; } } //测试代码 //全程只需调用该函数,即可获得温湿度数据recv_buff void
DHT11_Test(void){ u8 ucErrTime=0; while(DHT11_CheckOk()){ ucErrTime++;
if(ucErrTime>25) { return ; } } THTB_DATA_RecvByte(); }

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信