一、前期准备
单片机:STM32F103ZET6
开发环境:MDK5.14
库函数:标准库V3.5
DHT11模块:淘宝有售
二、实验效果
三、驱动原理
看数据手册。需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。
四、驱动代码
dht11.h
#ifndef __DHT11_H__
#define __DHT11_H__
#include "stm32f10x.h"
#include "gpio.h"
#include "delay.h"
#define DHT_Direction_I {GPIOA->CRL &= 0XFFFFFFF0; GPIOA->CRL |= 8;}
#define DHT_Direction_O {GPIOA->CRL &= 0XFFFFFFF0; GPIOA->CRL |= 3;}
/* IO Definitions */
#define O_DHT_DAT PAout(0)
#define I_DHT_DAT PAin(0)
#define DHT_DAT_Pin GPIO_Pin_0
#define DHTPORT GPIOA
#define DHTCLKLINE RCC_APB2Periph_GPIOA
extern void DHT11Configuration(void);
extern uint8_t DHT11_IsOnline(void);
extern uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi);
#endif
ds1302.c
#include "dht11.h"
//复位DHT11
void DHT11_Reset(void)
{
DHT_Direction_O;
O_DHT_DAT = 0;
DelayMs(20);
O_DHT_DAT = 1;
DelayUs(30);
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_IsOnline(void)
{
uint8_t retry = 0;
DHT_Direction_I;
while (I_DHT_DAT && retry < 100)//DHT11会拉低40~80us
{
retry ++;
DelayUs(1);
}
if(retry >= 100)
{
return 1;
}
else
{
retry = 0;
}
while (!I_DHT_DAT && retry < 100)//DHT11拉低后会再次拉高40~80us
{
retry ++;
DelayUs(1);
}
if(retry >= 100)
{
return 1;
}
return 0;
}
uint8_t DHT11_ReadBit(void)
{
uint8_t retry = 0;
while(I_DHT_DAT && retry < 100)
{
retry ++;
DelayUs(1);
}
retry = 0;
while(!I_DHT_DAT && retry < 100)
{
retry ++;
DelayUs(1);
}
DelayUs(40);//等待40us
if(I_DHT_DAT)
{
return 1;
}
else
{
return 0;
}
}
uint8_t DHT11_ReadByte(void)
{
uint8_t i,dat;
dat = 0;
for (i = 0; i < 8; i ++)
{
dat <<= 1;
dat |= DHT11_ReadBit();
}
return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)
{
uint8_t buf[5];
uint8_t i;
DHT11_Reset();
if(DHT11_IsOnline() == 0)
{
for(i = 0; i < 5; i ++)//读取40位数据
{
buf[i] = DHT11_ReadByte();
}
if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
{
*humi = buf[0];
*temp = buf[2];
}
}
else
{
return 1;
}
return 0;
}
void DHT11Configuration(void)
{
GPIO_InitTypeDef MyGPIO;
RCC_APB2PeriphClockCmd(DHTCLKLINE, ENABLE);
MyGPIO.GPIO_Pin = DHT_DAT_Pin;
MyGPIO.GPIO_Mode = GPIO_Mode_Out_PP;
MyGPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DHTPORT, &MyGPIO);
O_DHT_DAT = 1;
DHT11_Reset(); //复位DHT11
}
上一篇:US-020超声波模块驱动(STM32)
下一篇:DS1302驱动(STM32)
推荐阅读最新更新时间:2024-11-19 16:01
设计资源 培训 开发板 精华推荐
- 纸张计数器
- 具有低电池电量指示的 MCP1256 稳压 3.3V、低纹波充电泵的典型应用,具有低工作电流睡眠模式或旁路模式
- Sg1845 用于电流检测尖峰抑制的电流模式 PWM 控制器的典型应用
- LK32T102 开发版 1.5V
- 使用 ON Semiconductor 的 NCV7691 的参考设计
- 使用 Cypress Semiconductor 的 MB39A130A 的参考设计
- 同步多个 LTC1063、单片 5 极低通滤波器
- [已验证]Arduino UNO R3现代化升级版
- KIT33887EKEVBE: 评估套件 - 33887,电感负载驱动器
- 使用 Allegro MicroSystems 的 A8501 的参考设计