当前位置: 首页 > news >正文

STM32作业实现(五)温湿度传感器dht11

目录

STM32作业设计
STM32作业实现(一)串口通信
STM32作业实现(二)串口控制led
STM32作业实现(三)串口控制有源蜂鸣器
STM32作业实现(四)光敏传感器
STM32作业实现(五)温湿度传感器dht11
STM32作业实现(六)闪存保存数据
STM32作业实现(七)OLED显示数据
STM32作业实现(八)触摸按键TPAD
STM32作业实现(九)驱动舵机
源码位置

编写dht11(温湿度传感器)驱动文件

在这里插入图片描述
打开pa7引脚用于传输数据,tim1用做计时器(微秒级定时器,因为时钟频率72MHz,分频72之后计数一次为1us)
在这里插入图片描述
在项目所在路径的Core目录中Src下添加源文件,Inc下添加头文件

Keil uVision5中添加新建的源文件,在源文件中include头文件后编译

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
core下的src 新建并添加一个dht11.c的文件,在core下的Inc也同步新建dht11.h的空文件
在这里插入图片描述
在这里插入图片描述
编写驱动文件内容
dht11.h

#ifndef __DHT11_H__
#define __DHT11_H__#include "main.h"
#include "tim.h"uint8_t DHT_read(void); // 读取温湿度#endif

dht11.c

#include "dht11.h"uint8_t dht11_data[5] = {0, 0, 0, 0, 0};// 将GPIO引脚设置为输出
void SET_PIN_OUTPUT()
{GPIO_InitTypeDef GPIO_InitStruct = {0};/*Configure GPIO pin : PA7 */GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 输出模式GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// 将GPIO引脚设置为输入
void SET_PIN_INPUT()
{GPIO_InitTypeDef GPIO_InitStruct = {0};/*Configure GPIO pin : PA7 */GPIO_InitStruct.Pin = GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 输入模式GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// 微秒级延时
void Delay_us(uint16_t us)
{uint16_t us_cnt = us;__HAL_TIM_SET_COUNTER(&htim1, 0); // 设置计数器起始值HAL_TIM_Base_Start(&htim1);       // 启动定时器while (htim1.Instance->CNT < us_cnt); // 循环等待HAL_TIM_Base_Stop(&htim1);
}
// 电平读取函数,每8个电平存一个字节
uint8_t DGT_read_byte()
{uint8_t read_byte; // 读取到的电平uint8_t hp = 0;    // 防止死循环for (uint8_t i = 0; i < 8; i++){read_byte <<= 1;// 先判断此时引脚的电平状态,如果是低电平就一直循环等待,while ((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_RESET) && hp < 100){Delay_us(1); // 等待1ushp++;}// 直到高电平出现,高电平出现后延时 40us,Delay_us(40);// 并读取延时后的电平状态,如果此时是高电平,则数据为 1,否则为 0if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET){read_byte++;}hp = 0;// 等待低电平到来,开启下一次读取数据或结束while ((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET) && hp < 100){Delay_us(1); // 等待1ushp++;}}return read_byte;
}
// DHT11温湿度读取程序
uint8_t DHT_read(void)
{// 总线控制权在32// 发送18毫秒低电平SET_PIN_OUTPUT();                                     // 将引脚设置为输出HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); // 设置低电平HAL_Delay(18);// 拉高一段时间高电平HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET);Delay_us(20);// 总线控制在DHT11SET_PIN_INPUT();// 如果读取到低电平,说明DHT11有响应if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_RESET){uint8_t hp = 0; // 防卡死// 等待反转高电平while ((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_RESET) && hp < 100){Delay_us(1);hp++;}hp = 0;// 等待低电平到来,低电平到来后读取数据while ((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_7) == GPIO_PIN_SET) && hp < 100){Delay_us(1);hp++;}// 开始读取数据for (uint8_t i = 0; i < 5; i++){dht11_data[i] = DGT_read_byte();}// 读取结束等待50usDelay_us(50);// 校验数据uint32_t sum = dht11_data[0] + dht11_data[1] + dht11_data[2] + dht11_data[3];if ((sum & 0x000000ff) == dht11_data[4])return 1;}return 0;
}
http://www.lryc.cn/news/360432.html

相关文章:

  • java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决
  • 在 LLM 架构中应用多专家模型
  • C语言编程代码软件:深入探索与实战应用
  • 【AIGC半月报】AIGC大模型启元:2024.06(上)
  • 两款 IntelliJ IDEA 的 AI 编程插件
  • 语义化版本控制:软件工程的实用之道
  • Java设计模式总结
  • 小米路由器如何设置去广告功能,如何设置小米路由器的自定义Hosts(小米路由器如何去除小米广告、去除小米电视盒子开屏广告、视频广告)
  • HCIP-Datacom-ARST自选题库__EBGP【18道题】
  • TypeScript算法每日一题:两数之和(167)
  • 用docker搭建的Vulfocus镜像管理界面没有镜像可以拉取解决办法
  • CSPM.pdf
  • 多个短视频剪辑成一个视频:四川京之华锦信息技术公司
  • 算法第三天力扣第69题:X的平方根
  • 异常处理。
  • MySQL—函数(介绍)—字符串函数(基础)
  • CTF本地靶场搭建——静态flag题型的创建
  • 基于Django的博客系统之用HayStack连接elasticsearch增加搜索功能(五)
  • 开源VS闭源:大模型发展路径之争,你站哪一派?
  • Python | Leetcode Python题解之第115题不同的子序列
  • STM32高级控制定时器应用之检测输入PWM周期和占空比
  • [AI Google] 三种新方法利用 Gemini 提高 Google Workspace 的生产力
  • 【U-Net验证】逐元素乘积将特征投射到极高维隐式特征空间的能力
  • 快团团大团长帮卖如何导出单个团购的订单?免费教程教你怎么做!
  • services层和controller层
  • Pycharm编辑器下自定义模块导入报错:no module named问题
  • C#使用GDI对一个矩形进行任意角度旋转
  • 打印机的ip不同且连不上
  • 关于linux程序的查看、前台运行、后台运行、杀死的管理操作。
  • STM32作业设计