IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F7驱动DHT11(HAL库) -> 正文阅读

[嵌入式]STM32F7驱动DHT11(HAL库)

首先感谢老哥提供的代码

https://blog.csdn.net/qq_38203996/article/details/103328291?utm_medium=distribute.pc_relevant_download.none-task-blog-2defaultBlogCommendFromBaidudefault-2.test_version_3&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-2defaultBlogCommendFromBaidudefault-2.test_version_

在以上的基础上用HAL库修改了代码,使用的测试开发板是正点原子阿波罗STM32F767IGT6。结果如下图所示:
在这里插入图片描述话不多说,直接上代码

main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "timer.h"
#include "DHT11.h"
#include "BH1750VI.h"

u8 temp = 0,humi=0;
u8 temp_dec=0,humi_dec=0;

int main(void)
{
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();				        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz 
    delay_init(216);                //延时初始化
	uart_init(115200);		        //串口初始化
    LED_Init();                     //初始化LED
    TIM3_Init(10000-1,10800-1);      //定时器3初始化,定时器时钟为108M,分频系数为10800-1,
                                    //所以定时器3的频率为108M/10800=10K,自动重装载为5000-1,那么定时器周期就是500ms
									//如果要定时30分钟,以定时一秒或者几秒为基准,内部设置一个计数器就好。
	delay_ms(50);
	printf("DHT11 Test Program!");
	if(!DHT11_Init()){
		printf("\r\n ERROR! THE DHT11 HAS NO RESPOND...");
		//while(1);
	}
	printf("\r\n THE DHT11 HAS RESPOND");
	delay_ms(10);   //等待DHT11发送完响应信息
	
    while(1)
    {
		
		if(DHT11_Read_Data(&temp,&temp_dec,&humi,&humi_dec))
		{
			printf("\r\n temp:%d.%d,humi:%d.%d",temp,temp_dec,humi,humi_dec);
		}
		else{
			printf("\r\n ERROR THE DHT11 HAS NO RESPOND...");
		}
		
        delay_ms(2000);              //每次获取数据间隔大于1s比较稳定,我只是需要数据没有花时间探究
		//LED0_Toggle;                //LED0翻转
	}  
}

DHT11.c

#include "DHT11.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"




GPIO_InitTypeDef GPIO_InitStructure;	//后面会改变输入输出状态

static void GPIO_SETOUT(void);
static void GPIO_SETIN(void);
static u8 DHT11_Check(void);


/**********************************************
函数名:static void DHT11_Rst(void)
参数说明:无
返回值:无
函数作用:主机发送开始信号
***********************************************/
static void DHT11_Rst(void)
{                 
	GPIO_SETOUT();			//配置成输出模式
	HAL_GPIO_WritePin(DHT11_IO,DHT11_PIN,GPIO_PIN_RESET);//拉低数据线
    delay_ms(20);    										//拉低至少18ms
    HAL_GPIO_WritePin(DHT11_IO,DHT11_PIN,GPIO_PIN_SET); 	//拉高数据线 
	delay_us(30);     									//主机拉高20~40us
	HAL_GPIO_WritePin(DHT11_IO,DHT11_PIN,GPIO_PIN_RESET);
}


/**********************************************
函数名:u8 DHT11_Init(void)
参数说明:无
返回值:u8 ,返回1代表初始化成功,0则失败
函数作用:配置IO口,并发送开始信号
***********************************************/
u8 DHT11_Init(void){
	
	//IO口配置
	
	__HAL_RCC_GPIOA_CLK_ENABLE();//换IO口需要修改,使能GPIOA
	
	GPIO_InitStructure.Pin = DHT11_PIN;
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出,如果需要考虑到IC的电流驱动能力时要接上拉电阻(5K)
	GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
	HAL_GPIO_Init(DHT11_IO,&GPIO_InitStructure);
	
	DHT11_Rst();//发送开始信号
	
	return DHT11_Check();//检测DHT11的响应
}


/**********************************************
函数名:static void GPIO_SETOUT(void)
参数说明:无
返回值:无
函数作用:配置IO口为推挽输出模式
***********************************************/
static void GPIO_SETOUT(void)
{
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出,如果需要考虑到IC的电流驱动能力时要接上拉电阻(5K)
	HAL_GPIO_Init(DHT11_IO,&GPIO_InitStructure);
	
}


/**********************************************
函数名:static void GPIO_SETIN(void)
参数说明:无
返回值:无
函数作用:配置IO口为浮空输入模式
***********************************************/
static void GPIO_SETIN(void)
{
	GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //浮空输入模式
	HAL_GPIO_Init(DHT11_IO,&GPIO_InitStructure);
}


/**********************************************
函数名:static u8 DHT11_Check(void)
参数说明:无
返回值:检测到回应-->返回1,否则0
函数作用:检测DHT11的响应信号
***********************************************/
static u8 DHT11_Check(void) 	   
{   
	u8 retry=0;
	GPIO_SETIN();			//设置为输入模式	
	
	
  while (!HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN) && retry<100)//DHT11会拉低40~50us
	{
		retry++;
		delay_us(1);
	}
	if(retry >= 100)	//超时未响应/未收到开始信号,退出检测
		return 0;
	else 
		retry = 0;
  while (HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN) && retry<100)//DHT11拉低后会再次拉高40~50us
	{
		retry++;
		delay_us(1);
	}
	if(retry>=100)		//超时,DHT11工作出错,退出检测
		return 0;
	return 1;					//设备正常响应,可以正常工作
}


/**********************************************
函数名:static u8 DHT11_Read_Bit(void)
参数说明:无
返回值:返回从DHT11上读取的一个Bit数据
函数作用:从DHT11上读取一个Bit数据
***********************************************/
static u8 DHT11_Read_Bit(void)
{
 	u8 retry = 0;
	//DHT11的Bit开始信号为12-14us低电平
	while(HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN) && retry<100)//等待变为低电平(等待Bit开始信号)
	{
		retry++;
		delay_us(1);
	}
	retry = 0;
	while(!HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN) && retry<100)//等待变高电平(代表数据开始传输)
	{
		retry++;
		delay_us(1);
	}
	delay_us(30);//等待30us
	//0信号为26-28us,1信号则为116-118us,所以说超过30us去读取引脚状态就可以知道传输的值了
	if(HAL_GPIO_ReadPin(DHT11_IO,DHT11_PIN)) return 1;
	else return 0;		   
}


/***********************************************************************
函数名:static u8 DHT11_Read_Byte(void)
参数说明:无
返回值:返回从DHT11上读取的一个byte数据
函数作用:从DHT11上读取一个byte数据
************************************************************************/
static u8 DHT11_Read_Byte(void)    
{        
  u8 i,dat;
  dat=0;
	
	for (i=0;i<8;i++) 
	{
   	dat<<=1; 
	  dat|=DHT11_Read_Bit();
  }	
	
  return dat;
}


/**************************************************************************
函数名:u8 DHT11_Read_Data(u8 *temp,u8 *humi)
参数说明:temp:用于存放温度值(范围:0~50°),humi:用于存放湿度值(范围:20%~90%)
返回值:1:成功读取数据,0:读取数据出错
函数作用:从DHT11上读取温湿度数据(这里省略小数值)
***************************************************************************/
u8 DHT11_Read_Data(u8 *temp,u8 *temp_dec,u8 *humi,u8 *humi_dec)
{        
 	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==1)	//设备响应正常
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])//进行校验
		{
			*humi = buf[0];
			*humi_dec = buf[1];
			*temp = buf[2];
			*temp_dec = buf[3];
		}
	}else return 0;		//设备未成功响应,返回0
	return 1;					//读取数据成功返回1
}

DHT11.h

#ifndef __DHT11_H
#define __DHT11_H
#include "sys.h"
#include "delay.h"


/* 设置GPIO脚,默认为PB11 */
#define DHT11_IO 		GPIOA
#define DHT11_PIN		GPIO_PIN_0

/* 初始化函数,如果DHT11存在响应则返回1,否则0 */
u8 DHT11_Init(void);
/* 从DHT11读取数据,没有小数部分 */
u8 DHT11_Read_Data(u8 *temp,u8 *temp_dec,u8 *humi,u8 *humi_dec);

#endif

由于我的目的只是采集数据,相关传感器原理只是随便看了下。代码采集数据是比较稳定的,具体原理大家自行研究吧。TOT

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:21:29  更:2021-07-22 14:22:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:25:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码