stm32之19.温湿度模块(待补充)

news2025/1/19 14:22:23

 

dth11.c文件①

#include "dht11.h"
#include "delay.h"

// 1、温湿度模块初始化(PG9)
void Dht11_Init(void)
{
	// 0、GPIO外设信息结构体
	GPIO_InitTypeDef GPIO_InitStruct;
	
	// 1、使能硬件时钟			
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);

	// 2、配置GPIOB外设			(TRIG)
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_9;					// 引脚:第9根引脚
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_OUT;				// 模式:输出模式(现在是初始化,后面再转换)
	GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP;				// 输出类型:推挽模式
	GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;					// 是否上下拉:上拉
	GPIO_InitStruct.GPIO_Speed  = GPIO_High_Speed;				// 速度:高速
	GPIO_Init(GPIOG, &GPIO_InitStruct);							// 将配置好的外设信息,通过此函数写到其相应的外设寄存器中
	
	// 3、根据温湿度时序图,引脚一开始为高电平	
	DHT11_OUT = 1;											
	
}

// 2、转换温湿度引脚的输入输出模式
void Dht11_ConvertMode(GPIOMode_TypeDef GPIO_Mode)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin		= GPIO_Pin_9;					// 引脚:第9根引脚
	
	if(GPIO_Mode == GPIO_Mode_OUT)
	{
		GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_OUT;				// 模式:输出模式(现在是初始化,后面再转换)
		GPIO_InitStruct.GPIO_OType	= GPIO_OType_PP;				// 输出类型:推挽模式
		GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;					// 是否上下拉:上拉		// 你的开发板电路有上拉电阻,这里就不需要
		GPIO_InitStruct.GPIO_Speed  = GPIO_High_Speed;				// 速度:高速
	}
	else
	{
		GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_IN;					// 模式:输入模式
		GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;					// 是否上下拉:上拉	
	}
	
	GPIO_Init(GPIOG, &GPIO_InitStruct);								// 将配置好的外设信息,通过此函数写到其相应的外设寄存器中
}



// 3、获取温湿度的数据
int8_t Dht11_GetVal(uint8_t pbuf[5])
{
	uint16_t t_count   = 0;
	int8_t  i,j        = 0;
	uint8_t  data      = 0;
	uint8_t  check_num = 0;
	

	// 一、stm32单片机发送信号dht11模块									// 方老板:小坤啊,起来下蛋啦
	// 1、将PG9引脚设置为输出模式
	Dht11_ConvertMode(GPIO_Mode_OUT);

	// 2、将PG9引脚置为低电平
	DHT11_OUT = 0;	

	// 3、至少延时18ms以上(20ms即可)
	delay_ms(20);
	
	// 4、将PG9引脚置为高电平
	DHT11_OUT = 1;	
	
	// 5、至少延时20us-40us(30us即可)
	delay_us(30);
	
	
	// 二、dht11模块发送响应信号给stm32单片机								// 小坤:  好的,方老板,我马上下
	
	// 1、将PG9引脚设置为输入模式
	Dht11_ConvertMode(GPIO_Mode_IN);
	
	// 2、等待PG9引脚是否变为低电平(看其从高电平变为低电平时是否超时(4ms))
	t_count = 0;
	while(DHT11_IN == 1)		
	{
		t_count++;
		delay_us(1);
		if(t_count > 4000)
			return -1;
	}
	
	// 3、等待PG9引脚在低电平是否超时(80us,建议100us)
	t_count = 0;
	while(DHT11_IN == 0)		
	{
		t_count++;
		delay_us(1);
		if(t_count > 100)
			return -2;
	}
	
	// 4、等待PG9引脚在高电平是否超时(80us,建议100us)
	t_count = 0;
	while(DHT11_IN == 1)		
	{
		t_count++;
		delay_us(1);
		if(t_count > 100)
			return -3;
	}
	
	
	// 三、dht11模块发送40个bit数据给stm32单片机,stm32单片机接受并验证	// 小坤努力下40个蛋给方老板,方老板根据这些是公还是母(公比较重,母比较轻)给钱
	
	// 1、将40个数据一次性存到有5个字节的数组中(uint8_t pbuf[5])
	
	for(i=0; i<5; i++)		// 一共有5个数据(每个数据是1个字节,8位)
	{
		data = 0;
		for(j=7; j>=0; j--)	// 高位先出,因此从7开始,并需要进行移位操作
		{
		
			// a、等待发送数据的高电平的到来(看其变成低电平是否超时50us(建议60us))
			t_count = 0;
			while(DHT11_IN == 0)		
			{
				t_count++;
				delay_us(1);
				if(t_count > 70)
					return -4;
			}
			
			// b、开始延时一段时间(建议40us)
			delay_us(40);
			
			// c、判断引脚是否为高电平(1的话进行移位操作)
			if(DHT11_IN == 1)
			{
				data |= 1<<j;
				
				// 将70us剩余的高电平时间,给略过
				t_count = 0;
				while(DHT11_IN == 1)		
				{
					t_count++;
					delay_us(1);
					if(t_count > 50)
						return -5;
				}
			}	
		}
		pbuf[i] = data;
	}
	
	// 2、进行数据校验
	check_num =  (pbuf[0] + pbuf[1] +pbuf[2] +pbuf[3]) & 0xff; // 得出末8位
	if(check_num != pbuf[4])
	{
		return -6;
	}

	// 四、通信的结束
	delay_us(60);
	// 1、将PG9引脚设置为输出模式
	Dht11_ConvertMode(GPIO_Mode_OUT);

	// 2、将PG9引脚置为高电平
	DHT11_OUT = 1;

	return 0;
	
}


dth11.c版本②

#include <stm32f4xx.h>
#include "delay.h"
#define PFout(n) (*(volatile uint32_t *)(0x42000000+(GPIOF_BASE+0x14-0x40000000)*32+(n)*4))
#define PAin(n) (*(volatile uint32_t *)(0x42000000+(GPIOA_BASE+0x10-0x40000000)*32+(n)*4))
#define PEout(n) (*(volatile uint32_t *)(0x42000000+(GPIOE_BASE+0x14-0x40000000)*32+(n)*4))
#define PEin(n) (*(volatile uint32_t *)(0x42000000+(GPIOE_BASE+0x10-0x40000000)*32+(n)*4))
#define PBout(n) (*(volatile uint32_t *)(0x42000000+(GPIOB_BASE+0x14-0x40000000)*32+(n)*4))	
#define PBin(n) (*(volatile uint32_t *)(0x42000000+(GPIOB_BASE+0x10-0x40000000)*32+(n)*4))	
#define PCin(n) (*(volatile uint32_t *)(0x42000000+(GPIOC_BASE+0x10-0x40000000)*32+(n)*4))	
#define PCout(n) (*(volatile uint32_t *)(0x42000000+(GPIOC_BASE+0x14-0x40000000)*32+(n)*4))	
#define PGout(n) (*(volatile uint32_t *)(0x42000000+(GPIOG_BASE+0x14-0x40000000)*32+(n)*4))
#define PGin(n) (*(volatile uint32_t *)(0x42000000+(GPIOG_BASE+0x10-0x40000000)*32+(n)*4))
static GPIO_InitTypeDef GPIO_InitStructure;
void dht11_init(void)
{
	//打开端口G的硬件时钟,就是供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);


	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9; 	//9号引脚
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;	//输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;	//开漏
	GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
	GPIO_Init(GPIOG,&GPIO_InitStructure);

	//只要有输出模式,肯定会有初始电平的状态,看连接设备的说明书
	PGout(9)=1;

}


int32_t dht11_read(uint8_t *buf)
{
	uint32_t t=0;
	int32_t i=0,j=0;
	uint8_t d=0;
	uint8_t *p=buf;
	uint8_t check_sum=0;
	
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9; 	//9号引脚
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;	//输出模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;	//开漏
	GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
	GPIO_Init(GPIOG,&GPIO_InitStructure);	
	
	PGout(9)=0;
	delay_ms(18);
	
	PGout(9)=1;
	delay_us(30);
	
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9; 	//9号引脚
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN;	//输入模式
	GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;	//开漏
	GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
	GPIO_Init(GPIOG,&GPIO_InitStructure);
	
	//等待低电平出现
	t=0;
	while(PGin(9))
	{
		t++;
		delay_us(1);
		
		if(t >= 4000)
			return -1;
	}

	//用超时检测的方法测量低电平的合法性
	t=0;
	while(PGin(9)==0)
	{
		t++;
		delay_us(1);
		
		if(t >= 100)
			return -2;
	}	
	
	//用超时检测的方法测量高电平的合法性
	t=0;
	while(PGin(9))
	{
		t++;
		delay_us(1);
		
		if(t >= 100)
			return -3;
	}	
	
	for(j=0; j<5; j++)
	{
		//接收一个字节的数据
		for(d=0,i=7; i>=0; i--)
		{
			//用超时检测的方法测量低电平的合法性
			t=0;
			while(PGin(9)==0)
			{
				t++;
				delay_us(1);
				
				if(t >= 100)
					return -4;
			}

			//延时40us (延时时间在28us ~ 70us)
			delay_us(40);
			
			if(PGin(9))
			{
				d|=1<<i;	//将d变量对应的bit置1
				
				//等待高电平持续完毕
				t=0;
				while(PGin(9))
				{
					t++;
					delay_us(1);
					
					if(t >= 100)
						return -5;
				}			
			}
		}	
		p[j]=d;
	}
	
	//延时50us,可以忽略通讯结束的低电平
	delay_us(50);
	
	//计算校验和,检查接收到的数据是否准确
	check_sum = (p[0]+p[1]+p[2]+p[3])&0xFF;
	
	if(check_sum == p[4])
		return 0;
	
	return -6;
}

主函数main.c


int main(void)
{
	uint8_t buf[5];
	int32_t rt;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
		//抢占优先级0~3,支持4级!
	//响应优先级0~3,支持4级!
	key_init();
	Led_init();
	usart1_init(115200);
	dht11_init();

	printf("this is dht11 test\r\n");
	
	printf("1<<6=%X \r\n",1<<6);	
	printf("1<<3=%X \r\n",1<<3);		
	
	while(1)
	{
		rt = dht11_read(buf);
		
		if( rt == 0)
		{
			printf("温度:%d.%d 湿度:%d.%d\r\n",buf[2],buf[3],buf[0],buf[1]);
		
		}
		else
		{
			printf("dht11 read error code is %d\r\n",rt);
		}

		//官方要求,每6秒
		delay_ms(6000);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/925886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微调Llama2自我认知

一、概述 最近在学习了解大模型微调相关的内容&#xff0c;在学习的过程中也遇到了很多问题&#xff0c;所以将自己的学习过程记录下来&#xff0c;希望对大模型微调感兴趣的小伙伴提供一点帮助&#xff0c;本文主要介绍一下如何通过SFT微调Llama2的自我认知&#xff0c;先看一…

最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码

全新PHP短网址系统URL缩短器平台&#xff0c;它使您可以轻松地缩短链接&#xff0c;根据受众群体的位置或平台来定位受众&#xff0c;并为缩短的链接提供分析见解。 系统使用了Laravel框架编写&#xff0c;前后台双语言使用&#xff0c;可以设置多域名&#xff0c;还可以开设套…

语音芯片国产品牌—认准“深圳唯创知音”语音IC方案商,稳定可靠

​随着科技的飞速发展&#xff0c;语音技术正逐渐渗透进入我们生活的方方面面&#xff0c;从智能助手到智能家居&#xff0c;从汽车到工业设备&#xff0c;语音成为了人机交互的一种重要方式。而在这个充满激烈竞争的领域里&#xff0c;深圳唯创知音作为语音芯片领域的领军品牌…

亚马逊买家评论怎么删除

亚马逊的评论删除通常是由买家自行操作的。如果你是一名亚马逊买家&#xff0c;想要删除你之前发布的评论&#xff0c;可以按照以下步骤进行&#xff1a; 1、登录亚马逊账户 2、找到你的评论&#xff1a;在页面的右上角&#xff0c;你可以找到“Hello, [你的名字]”或者“你好…

关于数组和指针的笔试题解析(详解)

文章目录 说明&#x1f6a9;数组笔试题&#x1f4bb;一维数组&#x1f4c4;练习&#xff1a;&#x1f4a1;解析 &#x1f4bb;字符数组&#x1f4c4;练习1&#xff1a;&#x1f4a1;解析&#x1f4c4;练习2&#xff1a;&#x1f4a1;解析&#x1f4c4;练习3&#xff1a;&#x…

科技资讯|三星再申请智能戒指商标,智能穿戴进入更小型化发展

三星正在积极扩展可穿戴设备生态&#xff0c;近日向英国知识产权局提交了名为“Samsung Curio”的新商标&#xff0c;其分类为“Class 9”&#xff0c;可能会用于未来的智能戒指。 智能戒指&#xff1a; 可穿戴计算机本质上的智能手环、智能项链、智能眼镜和智能戒指&#xff1…

新KG视点 | 白硕—大模型时代的知识图谱

OpenKG 大模型专辑 导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力&#xff0c;知识图谱则丰富了表示知识的方式&#xff0c;两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下&#xff0c;OpenKG组织…

全套解决方案:基于pytorch、transformers的中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!

全套解决方案&#xff1a;基于pytorch、transformers的中文NLP训练框架&#xff0c;支持大模型训练和文本生成&#xff0c;快速上手&#xff0c;海量训练数据&#xff01; 1.简介 目标&#xff1a;基于pytorch、transformers做中文领域的nlp开箱即用的训练框架&#xff0c;提…

如何满足影视飓风对空间智能化的“挑剔”?智哪儿专访Aqara杭州上城区服务商

最近&#xff0c;商务部、住房城乡建设部等13部门联合印发了关于促进家居消费若干措施的通知&#xff0c;明确提出要促进智能家居设备互联互通&#xff0c;推动单品智能向全屋智能发展。在国家相关政策的支持下&#xff0c;全屋智能引领下的空间智能化面临前所未有的发展机会&a…

“传递信任 服务发展”金融科技标准认证生态大会成功举办 同创永益为支持单位

8月16日下午&#xff0c;北京国家金融科技认证中心&#xff08;以下简称“国金认证”&#xff09;在第十三届农村金融机构信息化发展创新座谈会期间&#xff0c;成功举办“传递信任 服务发展”金融科技标准认证生态大会&#xff0c;邀请管理部门、行业机构、产业机构&#xff0…

亚马逊云科技CEO谈及企业领导力原则的核心:坚持顾客至上

亚马逊云科技首席执行官Adam Selipsky几乎从一开始就在那里&#xff1a;他于2005年加入&#xff0c;在效力亚马逊11年后于2016年离开&#xff0c;转而经营Tableau&#xff0c;并于2021年成为亚马逊云科技首席执行官。当时亚马逊云科技前首席执行官安迪贾西(Andy Jassy)接替杰夫…

基于NXP i.MX 6ULL核心板的物联网模块开发案例(3)

前言 本文主要介绍基于创龙科技TLIMX6U-EVM评估板的物联网模块开发案例&#xff0c;适用开发环境&#xff1a; Windows开发环境&#xff1a;Windows 7 64bit、Windows 10 64bit 虚拟机&#xff1a;VMware15.1.0 Linux开发环境&#xff1a;Ubuntu18.04.4 64bit U-Boot&…

大型企业是否有必要进行数字化转型?

在数字化、信息化、智能化蓬勃发展的今天&#xff0c;初创公司可以很轻易的布局规划数字化发展的路径。而对于大型企业而言&#xff0c;其已经形成了较为成熟稳固的业务及组织架构&#xff0c;是否还有必要根据自身行业发展特点寻求数字化转型&#xff1f;&#xff08;比如制造…

喜讯|思迈特软件入选2023爱分析·数据智能优秀厂商

近期&#xff0c;“2023爱分析数据智能优秀厂商”评选结果于第五届数据智能高峰论坛现场正式公布&#xff0c;思迈特软件凭借在数据智能领域的技术及服务水平&#xff0c;从150家数据智能厂商中脱颖而出&#xff0c;成功入选为“2023爱分析数据智能优秀厂商”。 本次评选是基于…

Python“牵手”1688商品列表数据,关键词搜索1688API接口数据,1688API接口申请指南

1688平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c; 1688API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问1688平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现1688平…

Wi-Fi网络泄露你位置的新恶意软件,如何保护自己?

通常&#xff0c;当黑客用恶意软件感染最好的Windows笔记本电脑时&#xff0c;经济利益是他们的动机。然而&#xff0c;他们也喜欢部署信息窃取恶意软件来获取你的个人数据。 Secureworks反威胁部门的安全研究人员发现了一种神秘的新恶意软件&#xff0c;它完全是在寻找其他东…

【Unity小技巧】在Unity中实现类似书的功能(附git源码)

文章目录 前言本文实现的最终效果素材1. 页面素材2. 卡片内容素材地址 翻页实现1. 配置我们的canvas参数2. 添加封面和页码3. 翻页效果4. 添加按钮5. 脚本控制6. 运行效果 页面内容1. 添加卡片内容2. shader控制卡片背面3. 页面背面显示不同卡片 源码参考完结 前言 欢迎来到游…

【两区域系统的自动发电控制】任何区域突然负荷变化的情况下,如何测量两个区域共享的功率研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

No message found under code ‘-1‘ for locale ‘zh_CN‘.

导出中的报错&#xff1a;No message found under code -1 for locale zh_CN. 报错原因&#xff1a;页面中展示的数据和后端excel中的数据不一致导致 具体原因&#xff1a;

ray-分布式计算框架-集群与异步Job管理

0. ray 简介 ray是开源分布式计算框架&#xff0c;为并行处理提供计算层&#xff0c;用于扩展AI与Python应用程序&#xff0c;是ML工作负载统一工具包 Ray AI Runtime ML应用程序库集 Ray Core 通用分布式计算库 Task -- Ray允许任意Python函数在单独的Python worker上运行&…