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

据说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. Mysql 拼接字段查询语句和join查询拼接和时间查询

    个人平时记录的,有点乱 1.修改时间字段,如果时间字段的类型是date或者是datetime类型的 update 表名 set 时间字段 = DATE_FORMAT(NOW(),'%Y-%m-%d % ...

  2. SQLPlus 在连接时通常有四种方式

    1. sqlplus / as sysdba    操作系统认证,不需要数据库服务器启动listener,也不需要数据库服务器处于可用状态.比如我们想要启动数据库就可以用这种方式进入    sqlpl ...

  3. Flatten Binary Tree to Linked List [LeetCode]

    Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...

  4. jquery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较

    想要添加这个效果,先来弄明白页面的加载和事件执行顺序,看这个简单例子: <html xmlns="http://www.w3.org/1999/xhtml"> < ...

  5. 解决VS2015安装Android SDK 后文件不全及更新问题

    近日安装VS2015专业版后.想进行Android开发,就新建了一个Blank app 结果报[值不能为空 null 参数名:path1] 1:首先检查工具 xamarin 工具那设置的SDK路径对不 ...

  6. file_put_contents保存数据,

    file_put_contents("sui.txt", var_export($now_member,TRUE),FILE_APPEND); 可以保存数组,方便调试

  7. 微信开发订阅号(ASP.NET MVC4+jquery mobile+AppHarbor发布)

    首先应该去微信公众平台注册一个账号,因为我是用的个人,所以只能注册订阅号,然后需要提供身份证照片,这些大家慢慢折腾.然后在微信管理面板中选择高级功能,进入开发者模式. 在服务器配置中需要提供最重要的u ...

  8. 在EC2上搭建L2TP over IPSec VPN服务器

    注意(:wq保存文件 putty登陆用户名为ec2-user) 安装与配置: 环境介绍: OS:CentOS 6.4 x86_64 Minimal 1. 修改 /etc/sysctl.conf,新增如 ...

  9. Install Sublime Text 3

    $ sudo add-apt-repository ppa:webupd8team/sublime-text-3 $ sudo apt-get update $ sudo apt-get instal ...

  10. TFS Workspace 更改电脑名称

    不小心改了计算机名称 导致VS在保存项目的时候,包如下错误: 解决方法: 第一步: 第二步:输入如下片段 tf workspaces /updateComputerName:旧计算机名称  /coll ...