DHT11单总线通讯
DHT11为单总线双向通信,一次通讯时间4ms左右
引脚定义:
1脚:连接3-5V;2脚:数据线;3脚悬空;4脚接地
STM32cubemx 中只需要开启IIC 参数默认即可
在keil中加入相关头文件 和 c源文件(文件名打错了 应该是dht11 不过不影响)
要根据通讯过程写驱动代码
首先主机要给数据引脚输出一个至少18ms的低电平 然后拉高等待20-40微妙
等待DHT11回应 这时GPIO就要改变为输入状态,DHT11响应拉低80微妙 再拉高80微妙
这个过程结束后就开始发送数据。
数据为二进制0 1 区别方法为高电平的时间。如果高电平为26-28微妙时 为数据0,高电平时间为70微妙时 为数据1 基本上完成了一次数据采集
然后就是相关文件的代码
.H文件中
#ifndef __HT11_H_
#define __HT11_H_
#include "main.h"
extern TIM_HandleTypeDef htim2; //引入变量
//函数原型
void Delay_us(uint8_t); //微妙延时函数,启用了一个定时器。因为DHT11通讯过程涉及微妙延时
void GPIO_Input(void); //GPIO 状态转变的函数 CUBEMX默认的GPIO初始化我只开启了相关总线的使能
//把GPIO状态(输入 输出)封装成了两个函数
void GPIO_Output(void);
void DHT11_Rst(void); //主机开始采集的信号
uint8_t DHT11_Check(void); //检查DHT是否回应
uint8_t DHT11_Init(void); //初始化函数
uint8_t DHT11_ReadBit(void); //读取一位
uint8_t DHT11_ReadByte(void); //读取一个字节
uint8_t DHT11_ReadData(uint8_t *); //读取数据(40个位)
#endif
C源文件
#include "ht11.h"
void Delay_us(uint8_t us)
{
HAL_TIM_Base_Start(&htim2);
__HAL_TIM_SetCounter(&htim2,us);
while(__HAL_TIM_GetCounter(&htim2) > 0);
HAL_TIM_Base_Stop(&htim2)