//dht11.h
#ifndef __DHT_H__
#define __DHT_H__
#include "stm32f10x.h"
#include "systick.h"
#include "led.h"
#include "stdio.h"
#include "Usart1.h"
#define DHT11_GPIO_TYPE GPIOA
#define DHT11_GPIO_PIN GPIO_Pin_8
#define DHT11_RCC RCC_APB2Periph_GPIOA
#define DHT11_OUT_H GPIO_SetBits(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)
#define DHT11_OUT_L GPIO_ResetBits(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)
#define DHT11_IN GPIO_ReadInputDataBit(DHT11_GPIO_TYPE, DHT11_GPIO_PIN)
void dht11_gpio_input(void);
void dht11_gpio_output(void);
u16 dht11_scan(void);
u16 dht11_read_bit(void);
u16 dht11_read_byte(void);
u16 dht11_read_data(u8 buffer[4]);
#endif
//dht11.c
#include "dht.h"
void dht11_gpio_input(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);
GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(DHT11_GPIO_TYPE, &GPIO_InitStruct);
}
void dht11_gpio_output(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(DHT11_RCC, ENABLE);
GPIO_InitStruct.GPIO_Pin = DHT11_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(DHT11_GPIO_TYPE, &GPIO_InitStruct);
}
void dht11_reset(void)
{
dht11_gpio_output();//配置IO口输出模式
DHT11_OUT_L;//拉低IO口
Delay_us(19000);//延时18ms-30ms之间
DHT11_OUT_H;//拉高IO口
Delay_us(30);//延时30us,等待接收
dht11_gpio_input();//配置为输入模式
}
u16 dht11_scan(void)
{
return DHT11_IN;
}
u16 dht11_read_bit(void)
{
while (DHT11_IN == RESET);//等待低电平结束
Delay_us(40);//延时40us,如果是信号0,高电平信号在26-28us之间,如果是信号1,高电平信号在70us
if (DHT11_IN == SET)//如果还是高电平就是信号1
{
while (DHT11_IN == SET);//等待此信号结束
return 1;
}
else
{
return 0;
}
}
u16 dht11_read_byte(void)
{
u16 i;
u16 data = 0;
for (i = 0; i < 8; i++)
{
data <<= 1;
data |= dht11_read_bit();
}
return data;
}
u16 dht11_read_data(u8 buffer[5])
{
u16 i = 0;
u8 checksum;
dht11_reset();//发送起始信号
if (dht11_scan() == RESET)
{
//等待响应信号结束
while (dht11_scan() == RESET);
while (dht11_scan() == SET);
for (i = 0; i < 5; i++)
{
buffer[i] = dht11_read_byte();
}
while (dht11_scan() == RESET);//接收结束,拉高片选
dht11_gpio_output();
DHT11_OUT_H;
checksum = buffer[0] + buffer[1] + buffer[2] + buffer[3];//校验数据
if (checksum != buffer[4])
{
// checksum error
return 1;
}
}
return 0;
}
//main.c测试
if(dht11_read_data(buf)==0){
hum = buf[0] + buf[1] / 10.0;
temp = buf[2] + buf[3] / 10.0;
}
printf("湿度 == %.2f%%RHrn",hum);
printf("温度 == %.2f℃rn",temp);
Delay_ms(2000);
上一篇:STM32入门篇之DHT11温湿度传感器
下一篇:STM32外设驱动篇——DHT11温湿度传感器
推荐阅读最新更新时间:2024-11-09 11:09
推荐帖子
- 流驱动函数的参数表是固定不能改变的吗?
- RT流驱动函数的参数表是固定不能改变的吗?DWORDGPIO_Write(DWORDdwData,LPCVOIDpBuf,DWORDLen){BYTE*pdatabuf;BYTEgpioNum;BYTEgpioState;pdatabuf=(BYTE*)pBuf;gpioNum=*pdatabuf++;gpioState=*pdatabuf;
- whili 嵌入式系统
- RS485简介
- RS485简介RS485简介谢谢,学习一下!Re:RS485简介继续努力Re:RS485简介支持,多发帖,多来看看Re:RS485简介
- feifei 工控电子
- 怎样完整评估一个OP AMP的性能?
- 公司现在选型一个新的运放,那么应该怎样写这个评估报告?大家有没有现成的模板。我现在的应用的处理压力传感器的差分信号,低频的。谢谢!怎样完整评估一个OPAMP的性能?
- jingzhi1221 ADI参考电路
- 【2023 DigiKey大赛参与奖】开箱帖:ESP32 BASIC COER
- 【2023DigiKey大赛参与奖】开箱帖:ESP32BASICCOER这个ESP32都哪些外设?据说做这板子的公司被乐鑫收购了?
- 许大锤 DigiKey得捷技术专区
- EVC界面设计!
- 用EVC开发的软件界面,因为都是用其自带的控件,感觉不美观,请问是不是有什么工具或者软件来美化其界面?EVC界面设计!自绘的,不用控件类派生的,因为在PB里面自绘和行为是分开的,所以从CWnd派生自绘比较好,想做什么就做什么贴图片http://m2.tech.topzj.com/thread-6414-1-1.htmlhttp://m2.tech.topzj.com/thread-6414-1-1.html
- 532250972 嵌入式系统
- 嵌入式mcu型号
- 问题1:请问现在公司里面在开发嵌入式的时候,linux使用的是什么版本的?还是红帽吗(视频上是这个),内核是多少的?问题2:MCU的型号是什么?只回答一个问题是不给分的啊,哈哈,谢谢指点嵌入式mcu型号1、我们开发环境都还都是红帽的。至于版本:Linux2.6.152、MCU?具体IC型号很很多,目前以ARM9、ARM11,以及一些PPCARM9:以三星的2410和2440为主流。ARM11:MARVELL的PXA3XX,以及三星的6410PPC:主要是飞思卡尔的MPC8
- yiran 嵌入式系统