十DHT11
本实验是按照流程图的顺序去写的文章
据说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的更多相关文章
- 如何为编程爱好者设计一款好玩的智能硬件(十)——无线2.4G通信模块研究·一篇说完
六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...
- STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题
1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...
- 【雕爷学编程】Arduino动手做(55)--DHT11温湿度传感器
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...
- 前端开发中SEO的十二条总结
一. 合理使用title, description, keywords二. 合理使用h1 - h6, h1标签的权重很高, 注意使用频率三. 列表代码使用ul, 重要文字使用strong标签四. 图片 ...
- 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- CSS十问——好奇心+刨根问底=CSSer
最近有时间,想把酝酿的几篇博客都写出来,今天前端小学生带着10个问题,跟大家分享一下学习CSS的一些体会,我觉得想学好CSS,必须保持一颗好奇心和刨根问底的劲头,而不是复制粘贴,得过且过.本人能力有限 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- 谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
随机推荐
- Mysql 拼接字段查询语句和join查询拼接和时间查询
个人平时记录的,有点乱 1.修改时间字段,如果时间字段的类型是date或者是datetime类型的 update 表名 set 时间字段 = DATE_FORMAT(NOW(),'%Y-%m-%d % ...
- SQLPlus 在连接时通常有四种方式
1. sqlplus / as sysdba 操作系统认证,不需要数据库服务器启动listener,也不需要数据库服务器处于可用状态.比如我们想要启动数据库就可以用这种方式进入 sqlpl ...
- 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 ...
- jquery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
想要添加这个效果,先来弄明白页面的加载和事件执行顺序,看这个简单例子: <html xmlns="http://www.w3.org/1999/xhtml"> < ...
- 解决VS2015安装Android SDK 后文件不全及更新问题
近日安装VS2015专业版后.想进行Android开发,就新建了一个Blank app 结果报[值不能为空 null 参数名:path1] 1:首先检查工具 xamarin 工具那设置的SDK路径对不 ...
- file_put_contents保存数据,
file_put_contents("sui.txt", var_export($now_member,TRUE),FILE_APPEND); 可以保存数组,方便调试
- 微信开发订阅号(ASP.NET MVC4+jquery mobile+AppHarbor发布)
首先应该去微信公众平台注册一个账号,因为我是用的个人,所以只能注册订阅号,然后需要提供身份证照片,这些大家慢慢折腾.然后在微信管理面板中选择高级功能,进入开发者模式. 在服务器配置中需要提供最重要的u ...
- 在EC2上搭建L2TP over IPSec VPN服务器
注意(:wq保存文件 putty登陆用户名为ec2-user) 安装与配置: 环境介绍: OS:CentOS 6.4 x86_64 Minimal 1. 修改 /etc/sysctl.conf,新增如 ...
- Install Sublime Text 3
$ sudo add-apt-repository ppa:webupd8team/sublime-text-3 $ sudo apt-get update $ sudo apt-get instal ...
- TFS Workspace 更改电脑名称
不小心改了计算机名称 导致VS在保存项目的时候,包如下错误: 解决方法: 第一步: 第二步:输入如下片段 tf workspaces /updateComputerName:旧计算机名称 /coll ...