本实验是按照流程图的顺序去写的文章

据说DHT11没有小数部分,规格书是错误的。不过我验证的程序确实是没有小数

一.硬件连接:DHT11的数据线接到了PB10

二.实验代码

1.开始

2.初始化——串口,Systick,GPIO

2.1GPIO初始化

void DHT11_GPIO_Config(void) //连接DHT11的数据口初始化
{ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_10);
}

2.2串口初始化

 void USART_Config(void)  //串口初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = ;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE); }

2.3Systick初始化

static u8 fac_us=;
static u16 fac_ms=; void SysTick_Init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部系统时钟,为系统时钟72MHz的1/8
fac_us=/; //在上面的时钟情况下,滴答时钟为9MHz,即1S来9M个周期,每来一个周期减少1个数字,这样1个数字是1/9微妙,9个数字正好是1us。fac_us正好是9,是1us。
fac_ms=(u16)fac_us*; //这是定时1ms所需的数字
}

三.发送起始信号

 void DHT11_Start(void) //起始信号
{
GPIO_Config_PP(); //推挽输出
GPIO_SetBits(GPIOA,GPIO_Pin_1); //拉高
GPIO_ResetBits(GPIOB,GPIO_Pin_10); //拉低
Delay_ms(); //延时最少18ms
GPIO_SetBits(GPIOB,GPIO_Pin_10); //拉高
Delay_us(); //延时30us
//发送完起始信号要改变为接受模式
//延时等待从机响应
//从机先为低电平响应,后为高电平响应
} void GPIO_Config_PP() //推完输出
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
 void GPIO_Config_IPU()  //上拉输入
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}

这个往下有两种情况,一个就是发送完信号后收到了应答型号,另一个就是发送完后没有收到应答信号,都要有对应的处理

 //数据处理
u8 DHT11_Collect(DHT11_Data_TypeDef *DHT11_Data) //指针形式确实是好用
{
DHT11_Start();
GPIO_Config_IPU(); //模式改为接收模式
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==Bit_RESET)
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==Bit_RESET); //等待从机响应为低,一直循环
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==Bit_SET); //等待从机响应为高,一直循环 //数据读取,处理
DHT11_Data->humi_int=Read_Byte(); //字节读
DHT11_Data->humi_deci=Read_Byte();
DHT11_Data->temp_int=Read_Byte();
DHT11_Data->temp_deci=Read_Byte();
DHT11_Data->check=Read_Byte(); //数据接收完成
GPIO_Config_PP(); //推挽状态输出
GPIO_SetBits(GPIOB,GPIO_Pin_10); //拉高
//数据校验
if(DHT11_Data->check==DHT11_Data->humi_int+DHT11_Data->humi_deci+DHT11_Data->temp_int+DHT11_Data->temp_deci)
return SUCCESS;
else
return ERROR; //数据校验出错
}
else
return ERROR; //没有响应
}
 //字节读数据
u8 Read_Byte(void)
{
u8 i ,temp;
for(i=;i<;i++)
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==); //等待从机响应为低,一直循环
Delay_us(); //延时40us
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==) //表示电平是0
{
temp&=~(0x01<<(-i));
}
else
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==); //说明电平是高电平
temp|=(0x01<<(-i));
}
}
return temp;
}

主函数

 typedef struct   //温湿度结构体
{
u8 humi_int;
u8 humi_deci;
u8 temp_int;
u8 temp_deci;
u8 check;
}DHT11_Data_TypeDef;
 DHT11_Data_TypeDef dht11_data_time;
int main(void)
{
SysTick_Init();
USART_Config();
DHT11_GPIO_Config();
printf("\r\n温湿度实验\r\n");
while()
{
if(DHT11_Collect(&dht11_data_time)==SUCCESS)
{
printf("\r\n连接成功\r\n");
DHT11_Collect(&dht11_data_time);
printf("\r\n当前湿度为:%d.%d%RH,当前温度为:%d.%d℃\r\n",dht11_data_time.humi_int,dht11_data_time.humi_deci,dht11_data_time.temp_int,dht11_data_time.temp_deci);
Delay_ms(); //1s显示一次
}
else
{
printf("Read DHT11 ERROR!\r\n");
}
}

十DHT11的更多相关文章

  1. 如何为编程爱好者设计一款好玩的智能硬件(十)——无线2.4G通信模块研究·一篇说完

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  2. STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

    1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...

  3. 【雕爷学编程】Arduino动手做(55)--DHT11温湿度传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...

  4. 前端开发中SEO的十二条总结

    一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...

  5. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  6. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  7. CSS十问——好奇心+刨根问底=CSSer

    最近有时间,想把酝酿的几篇博客都写出来,今天前端小学生带着10个问题,跟大家分享一下学习CSS的一些体会,我觉得想学好CSS,必须保持一颗好奇心和刨根问底的劲头,而不是复制粘贴,得过且过.本人能力有限 ...

  8. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  9. 谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

随机推荐

  1. c#数据绑定(5)--LINQ

    嶽永鹏/文 本实例以MS AdventureWorks2008Entities数据库为基础,演示了LINQ TO ENTITY.LINQ TO ENTITYSQL和LINQ TO ENTITYCLIE ...

  2. iOS 架构模式--解密 MVC,MVP,MVVM以及VIPER架构

    本文由CocoaChina译者lynulzy(社区ID)翻译 作者:Bohdan Orlov 原文:iOS Architecture Patterns 在 iOS 中使用 MVC 架构感觉很奇怪? 迁 ...

  3. ionic,angularJs实现搜索框过滤关键字

    利用AngularJS自带的过滤器,我们可以很方便的实现搜索框过滤的效果,但是怎么实现类似百度搜索过滤列表中关键字变色的效果呢? 页面上代码: <input type="text&qu ...

  4. Windows Store App JavaScript 开发:简单对象绑定

    简单对象绑定是一种基本的绑定类型,可以实现将一个对象中的数据绑定到HTML元素的属性.下面通过一个示例来演示如何使用HTML5和JavaScript开发一个实现简单对象绑定的Windows应用商店应用 ...

  5. [原创]导出CSV文件,特殊字符处理。

    CSV文件格式 1.CSV文件默认以英文逗号(,)做为列分隔符,换行符(\n)作为行分隔符.2.CSV默认认为由""括起来的内容是一个栏位,这时不管栏位内容里有除"之外字 ...

  6. AutoHotkey(AHK)

    这是2009年用过的一个软件,自动键盘执行的一个东西,能提高效率,代替人工击键和鼠标操作,现在中文化很好了,如下地址是中文文档 http://ahkcn.sourceforge.net/docs/Tu ...

  7. mysql与sqlserver之间的关系转换

    sqlserver中的数据类型与mysql之间的对应 --sqlserver = 只复制表结构 = 复制表结构和表数据 --mysql create table xx like xx; 只复制表结构 ...

  8. Python 之路 Day5 - 常用模块学习

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  9. 【图像处理】【SEED-VPM】1.注意点

    1. 新装系统要启动NFX 每次虚拟机复位要执行以下命令 /usr/sbin/exportfs -av /sbin/service nfs restart —————————————————————— ...

  10. 多个radiobutton选定一个

    asp.net中怎么判断其中一个radiobutton被选中后登录的是一个窗体,另一个被选中后登录的是另一个窗体. 页面设置两按钮的GroupName为同一组值: <asp:RadioButto ...