STM32驱动DHT11
1、开发平台
- 使用野火STM32H750开发板
- 无RTOS
- 使用HAL库进行开发
硬件连接:
SDA---->PA12
2、DHT11介绍
起始信号:
从机响应信号:
传输:
贴上代码:
dht11.h
#ifndef __dht11_h
#define __dht11_h#include "main.h"/*底层接口*/
#define __DHT11_GPIO_INIT() dht11_gpio_init()
#define __DHT11_MODE(MODE) DHT11_MODE(MODE)
#define __DHT11_OUT_H() HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET)
#define __DHT11_OUT_L() HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET)
#define __DHT11_READ() HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN)
#define __DHT11_DELAY_MS(nms) delay_ms(nms)
#define __DHT11_DELAY_US(nms) delay_us(nms)/*硬件接口*/
#define __DHT11_PIN_CLK() __HAL_RCC_GPIOA_CLK_ENABLE()
#define DHT11_PIN GPIO_PIN_12
#define DHT11_PORT GPIOA/*延时函数*/
#define SYSCLK 400000000/1000000 //指明CPU工作频率为(SystemCoreClock/1000000)MHz
#define A 6 //一次循环所花的周期数
#define B 3 //调用、初始化、返回总共所用的周期数
#define delay_us(nus) wait(((nus)*(SYSCLK)-(B))/(A))
#define delay_ms(nms) delay_us((nms)*1000)
#define delay_s(ns) delay_ms((ns)*1000)/*结构体成员定义*/
typedef struct
{uint8_t humi_int; //湿度的整数部分uint8_t humi_deci; //湿度的小数部分uint8_t temp_int; //温度的整数部分uint8_t temp_deci; //温度的小数部分uint8_t check_sum; //校验和}DHT11_Data_TypeDef;/*函数声明*/
void wait(unsigned long n);
void dht11_init(void);
uint8_t ReadByte(void);
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data);
void DHT11_PRINTF(void);
#endif
dht11.c
#include "dht11.h"GPIO_InitTypeDef DHT11_GPIO_Init;DHT11_Data_TypeDef DHT11_Data;/****************************************************************
*@function: dht11_gpio_init
*@input : none
*@output : none
*@describe: DHT11的GPIO口初始化
*@author : sola
****************************************************************/
void dht11_gpio_init(void)
{ __DHT11_PIN_CLK(); //开启时钟DHT11_GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;DHT11_GPIO_Init.Pin = DHT11_PIN;DHT11_GPIO_Init.Pull = GPIO_NOPULL;DHT11_GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(DHT11_PORT, &DHT11_GPIO_Init);
}/****************************************************************
*@function: DHT11_MODE
*@input : mode (0/1)
*@output : none
*@describe: DHT11 GPIO输入输出模式选择
*@author : sola
****************************************************************/
void DHT11_MODE(uint8_t mode)
{if(mode == 0){DHT11_GPIO_Init.Mode = GPIO_MODE_INPUT;DHT11_GPIO_Init.Pin = DHT11_PIN;DHT11_GPIO_Init.Pull = GPIO_NOPULL;DHT11_GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(DHT11_PORT, &DHT11_GPIO_Init);}else if(mode == 1){DHT11_GPIO_Init.Mode = GPIO_MODE_OUTPUT_PP;DHT11_GPIO_Init.Pin = DHT11_PIN;DHT11_GPIO_Init.Pull = GPIO_NOPULL;DHT11_GPIO_Init.Speed = GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(DHT11_PORT, &DHT11_GPIO_Init);}
}/*---------------------------应用层----------------------------*//****************************************************************
*@function: dht11_delay
*@input : n (MHz)
*@output : none
*@describe: 延时
*@author : sola
****************************************************************/
void wait(unsigned long n)
{ do{n--;}while(n);
}/****************************************************************
*@function: dht11_init
*@input : none
*@output : none
*@describe: DHT11 起始信号
*@author : sola
****************************************************************/
void dht11_init(void)
{__DHT11_GPIO_INIT();
}/****************************************************************
*@function: ReadByte
*@input : none
*@output : temp
*@describe: 读一个字节
*@author : sola
****************************************************************/
uint8_t ReadByte(void) {uint8_t i, temp = 0;for(i=0;i<8;i++) {while(__DHT11_READ() == 0);__DHT11_DELAY_US(40); //40usif(__DHT11_READ() == 1) {while(__DHT11_READ() == 1);temp |= (uint8_t)(0x01<<(7-i));}else {temp &= (uint8_t)~(0x01<<(7-i));}} return temp;
}/****************************************************************
*@function: Read_DHT11
*@input : *DHT11_Data
*@output : temp
*@describe: DHT11 读数据
*@author : sola
****************************************************************/
uint8_t Read_DHT11(DHT11_Data_TypeDef *DHT11_Data) {__DHT11_MODE(1); //配置为输出__DHT11_OUT_L(); //拉低__DHT11_DELAY_MS(18); //18ms__DHT11_OUT_H(); //拉高__DHT11_DELAY_US(13); //13us__DHT11_MODE(0); //配置为输入if(__DHT11_READ() == 0) {while(__DHT11_READ() == 0); while(__DHT11_READ() == 1);DHT11_Data->humi_int= ReadByte(); //读取湿度整数DHT11_Data->humi_deci= ReadByte(); //读取湿度小数DHT11_Data->temp_int= ReadByte(); //读取温度整数DHT11_Data->temp_deci= ReadByte(); //读取温度整数DHT11_Data->check_sum= ReadByte(); //应答读取__DHT11_MODE(1); //配置为输出__DHT11_OUT_H();if(DHT11_Data->check_sum == DHT11_Data->humi_int + DHT11_Data->humi_deci + DHT11_Data->temp_int+ DHT11_Data->temp_deci) {return SUCCESS;}else { return ERROR; }}return 0;
}/****************************************************************
*@function: DHT11_PRINTF
*@input : none
*@output : none
*@describe: DHT11 打印数据
*@author : sola
****************************************************************/
#if 1
void DHT11_PRINTF(void) {if(Read_DHT11(&DHT11_Data) == SUCCESS) {printf("\r\n\r\n湿度为%d.%d %RH ,温度为 %d.%d℃ \r\n",DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci);}
}
#endif
移植也方便,就修改几个地方就好了。
注意:如果移植后通讯不成功,请修改delay_us和delay_ms,也可以调节参数A,这个在不同MCU上需要执行的周期时间是不一样的。
STM32驱动DHT11相关推荐
- 基于stm32的DHT11温湿度采集LCD显示Proteus仿真
*本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...
- STM32单片机DHT11数字温湿度监测
OLED液晶接口电路图 DHT11传感器接口电路图 STM32单片机DHT11数字温湿度监测程序源代码 #include "sys.h" #define LED_RED PBout ...
- STM32项目设计:基于STM32的DHT11、MQ-2、光照强度检测
一.项目功能概述 1.通过DHT11温湿度模块检测温湿度 2.通过MQ-2烟雾传感器检测烟雾 3.通过光敏电阻模块检测光照强度 4.oled液晶屏显示实时检测到的数据 5.超限蜂鸣器报警 源码下载地址 ...
- 关于STM32驱动DS1302实时时钟的一点思考
关于STM32驱动DS1302实时时钟的一点思考 之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难, ...
- stm32官方例程在哪找_正点原子Linux第十一章模仿STM32驱动开发格式实验
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第十一章模仿STM32驱动开发格式实验 在上一章使用C语 ...
- ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)
参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...
- stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)
RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...
- STM32驱动LCD实战
目录 01 驱动时序 02 FSMC外设配置 03 背光驱动 04 复位驱动 05 寄存器配置 前段时间写了<STM32驱动LCD原理>和<STM32的FSMC外设简介>两篇文 ...
- STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏
STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏 串口屏 基础指令集 硬件和接线 接线 实验前准备 STM32程序 串口程序 主函数 实验现象 总结 串口屏 串口屏是一个集 ...
最新文章
- 【Linux】Linux简单操作之vi与vim编辑器
- 小程序这件事 撸起袖子加油干
- 【POJ1321棋盘问题】【poj2251Dungeon Master】【poj3278Catch That Cow】【poj1426Find The Multi】
- Winform中设置ZedGraph的颜色填充使用Fill
- linux下改变python的版本
- ajax 偶尔302,关于Ajax 中response出现302的一点见解
- wdatepicker使用指南
- Git和Github之间的区别
- linux脚本生成数字写入文本,4.2 编写Shell脚本(P80-85)——《Linux就该这么学》学习笔记16...
- Golang简单日志类
- 携程是如何借助“预测式外呼”提高呼叫效率的
- 三国将星录java阵容_三国将星录,通关攻略
- 如何进行自学软件测试?
- 如何在Cell里画出虚线?
- IDC发布中国AI云服务市场报告 百度智能云排名第一
- 最新微信hook3.0二次开发C#源码介绍
- 软件测试团队口号及队名,团队队名口号(精选50句)
- 计算机图形学之机器人
- linux用户禁止登录,Linux限制用户登录
- Cisco 防火墙Firwall Failover ActiveActive 双HSRP 实现双ISP完美切换
热门文章
- oracle 查找表列名,oracle查询列名(查询表字段名称)
- C++程序度量驱动调优实例:看狄更斯的双城记,寻找性能瓶颈
- 云计算服务商中云融信 十一月产品升级
- php校验邮箱是否可用 socket helo,如何利用PHP验证邮箱是否合格
- 可视化的 CSS 编辑器 Simple CSS
- 观看 比尔盖茨及梅琳达在斯坦福2014届毕业生毕业典礼上的演讲有感
- 【考研复习】不定积分公式,总结了个好记的办法
- 分布式架构原理解析常见问题解决
- 收藏:21个强大的jQuery特效展示
- 基于flask徐州市天气信息可视化分析系统-计算机毕设 附源码 04600