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

 

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.rhkb.cn/news/109145.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pyqt5开发实战记录

入职以来第一个开发项目&#xff1a; 1、如何给Qlabel加边框&#xff1a;右键label对象&#xff0c;选择“改变样式表”输入一下代码&#xff1a; border: 1px solid black;2、如何让垂直布局中button大小不发生变化&#xff1a;其实很简单&#xff0c;只需要设置button的最大…

【seaweedfs】2、Finding a needle in Haystack: Facebook’s photo storage 分布式对象存储论文

文章目录 一、介绍二、背景、设计理念2.1 背景2.2 NFS-based Design2.3 Discussion 三、设计和实现3.1 概览3.2 Haystack Directory3.3 Haystack Cache3.4 Haystack Store3.4.1 Photo Read3.4.2 Photo Write3.4.3 Photo Delete3.4.4 The Index File3.4.5 Filesystem 3.5 Recove…

WebGL 缓冲区对象介绍,创建并使用缓冲区,使用缓冲区对象向顶点着色器传入多个顶点数据的所有步骤

目录 使用缓冲区对象 使用缓冲区对象向顶点着色器传入多个顶点的数据&#xff0c;需要遵循以下五个步骤。 创建缓冲区对象&#xff08;gl.createBuffer&#xff08;&#xff09;&#xff09; gl.createBuffer&#xff08;&#xff09;的函数规范 gl.deleteBuffer &#…

C# winform加载yolov8模型测试(附例程)

第一步&#xff1a;在NuGet中下载Yolov8.Net 第二步&#xff1a;引用 using Yolov8Net; 第三步&#xff1a;加载模型 private IPredictor yolov8 YoloV8Predictor.Create("D:\\0MyWork\\Learn\\vs2022\\yolov_onnx\\best.onnx", mylabel); 第四步&#xff1a;图…

【OpenCV • c++】图像对比度调整 | 图像亮度调整

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…

window系统中如何判断是物理机还是虚拟机及VMPROTECT无法检测云主机

为什么要判断物理机&#xff0c;因为授权不能对虚拟机安装后的软件进行授权。虚拟机可以复制可以克隆&#xff0c;无法作为一个不可复制ID来使用。 总结了如何判断物理机&#xff1a; 1. 用systeminfo的系统型号。&#xff08;注&#xff0c;有资料是看处理器和bios。但是我这…

一步一步实验,讲解python中模块和包的使用

背景 为什么要提出这个问题&#xff1f; 在一个项目中&#xff0c;每一个python文件打开后&#xff0c;都会看到依赖了其他的一些包、模块等&#xff1b;概念混乱&#xff0c;魔改目标不清晰 为什么要修改&#xff1f; 如果需要将某开源包进行自定义处理&#xff0c;不再使…

Python 包管理(pip、conda)基本使用指南

Python 包管理 概述 介绍 Python 有丰富的开源的第三方库和包&#xff0c;可以帮助完成各种任务&#xff0c;扩展 Python 的功能&#xff0c;例如 NumPy 用于科学计算&#xff0c;Pandas 用于数据处理&#xff0c;Matplotlib 用于绘图等。在开始编写 Pytlhon 程序之前&#…

数据隐私与安全在大数据时代的挑战与应对

文章目录 数据隐私的挑战数据安全的挑战应对策略和方法1. 合规和监管2. 加密技术3. 匿名化和脱敏4. 安全意识培训5. 隐私保护技术 结论 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&…

【算法与数据结构】513、LeetCode找树左下角的值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题用层序遍历来做比较简单&#xff0c;最底层最左边节点就是层序遍历当中最底层元素容器的第一个值…

vue 简单实验 自定义组件 独立模块

1.概要 2.代码 2.1 const Counter {data() {return {counter: 0}},template:<div>Counter: {{ counter }}</div> }export default Counter 2.2 import Counter from ./t2.jsconst app Vue.createApp({components: {component-a: Counter} })app.mount(#count…

浅析 GlusterFS 与 JuiceFS 的架构异同

在进行分布式文件存储解决方案的选型时&#xff0c;GlusterFS 无疑是一个不可忽视的考虑对象。作为一款开源的软件定义分布式存储解决方案&#xff0c;GlusterFS 能够在单个集群中支持高达 PiB 级别的数据存储。自从首次发布以来&#xff0c;已经有超过十年的发展历程。目前&am…

不使用ip和port如何进行网络通讯(raw socket应用例子)

主要应用方向是上位机和嵌软(如stm32单片机)通讯&#xff0c;不在单片机中嵌入web server&#xff0c;即mac层通讯。 一、下面先了解网络数据包组成。 常见数据包的包头长度: EtherHeader Length: 14 BytesTCP Header Length : 20 BytesUDP Header Length : 8 BytesIP Heade…

Spring@Scheduled定时任务接入XXL-JOB的一种方案(基于SC Gateway)

背景 目前在职的公司&#xff0c;维护着Spring Cloud分布式微服务项目有25个。其中有10个左右微服务都写有定时任务逻辑&#xff0c;采用Spring Scheduled这种方式。 Spring Scheduled定时任务的缺点&#xff1a; 不支持集群&#xff1a;为避免重复执行&#xff0c;需引入分…

【VMware】CentOS 设置静态IP(Windows 宿主机)

文章目录 1. 更改网络适配器设置2. 配置虚拟网络编辑器3. 修改 CentOS 网络配置文件4. ping 测试结果 宿主机&#xff1a;Win11 22H2 虚拟机&#xff1a;CentOS-Stream-9-20230612.0 (Minimal) 1. 更改网络适配器设置 Win R&#xff1a;control 打开控制面板 依次点击&#x…

【应用层】网络基础 -- HTTPS协议

HTTPS 协议原理加密为什么要加密常见的加密方式对称加密非对称加密 数据摘要&&数据指纹 HTTPS 的工作过程探究方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密中间人攻击-针对上面的场景 CA认证理解数据签名方案5-非对…

15-模型 - 一对多 多对多

一对多&#xff1a; 1. 在多的表里定义外键 db.ForeignKey(主键) 2. 增加字段 db.relationship 建立联系 ("关联表类名","反向引用名") from ext import db# 一 class User(db.Model):id db.Column(db.Integer, primary_keyTrue, autoincrementTrue)us…

Dart PowerTCP Emulation for .NET Crack

Dart PowerTCP Emulation for .NET Crack .NET CF上的PowerTCP Emulation为手持设备提供了高级的Internet通信组件。这些功能允许同步操作&#xff0c;这样可以消耗更少的资源&#xff0c;提供更大的灵活性&#xff0c;并生成易于维护的软件。带有.NET的PowerTCP仿真包括VT52、…

gpt-3.5-turbo微调图形界面;Hugging Face完成2.35亿美元融资

&#x1f989; AI新闻 &#x1f680; 人工智能初创公司Hugging Face完成2.35亿美元融资&#xff0c;估值达到45亿美元 摘要&#xff1a;总部位于纽约的人工智能初创公司Hugging Face完成了一轮2.35亿美元的融资&#xff0c;估值达到45亿美元。本轮融资的投资者包括谷歌、亚马…

几个nlp的小任务(多选问答)

@TOC 安装库 多选问答介绍 定义参数、导入加载函数 缓存数据集 随机选择一些数据展示 进行数据预处理部分(tokenizer) 调用t