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

据说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. Sublime Text 2 代码片断

    原文:Snippets 不管是在编码,还是写畅销书,你都可能会需要一遍又一遍的用到一些文本的小片断.使用片断来结束这种单调无聊的码字吧,片断是一种智能的模板,它能在合适的上下文中插入你需要的文本内容. ...

  2. 解决xftp远程连接中文乱码

    更改乱码服务器的属性,使用UTF-8编码

  3. PHP之OOP要点摘要

    类和对象:    类是生成对象的模板,对象是活动组件;    面向对象编程实际操作都是通过类的实例(而不是类本身)完成的:    访问控制(public.protected.private):(1) ...

  4. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

    1.查看一下mysql的状态 systemctl status mariadb 2.启动mysql systemctl start mariadb

  5. 51nod1265 四点共面

    题目链接:51nod 1265 四点共面 四个点构成的三个向量a,b,c共面的充要条件是存在不全为零的实数x,y,z满足x*a+y*b+z*c=0,然后想到线代了.. 其实就是三个向量的混合积为0:( ...

  6. Electron-使用Electron开发第一个应用

    使用Electron开发第一个应用 Electron 应用的目录结构如下: app/ ├── package.json ├── main.js └── index.html 新建一个app文件夹 将这 ...

  7. Java 入门(一) - 环境变量

    Win 7 X64环境 计算机(右键)-> 属性 -> 高级系统设置 -> 环境变量1.新建系统变量 : JAVA_HOME C:\Program Files (x86)\Java\ ...

  8. [字符哈希] POJ 3094 Quicksum

    Quicksum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16488   Accepted: 11453 Descri ...

  9. 批量生成clr脚本

    use [dbname]go --1.产生crl程序集的sql --定义表变量,临时存储中间结果集declare @tb table(name nvarchar(100),permission_set ...

  10. js判断是否是移动端 访问移动端网址

    1以下为代码,可放置在网站foot底部文件,或者haead顶部文件,建议将代码放在网站顶部,这样可以实现手机访问立即跳转! <script src="http://siteapp.ba ...