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

据说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");
}
}

最新文章

  1. 一步步学习javascript基础篇(6):函数表达式之【闭包】
  2. 1Z0-053 争议题目解析25
  3. SDcard
  4. 阅读DNA-2014年读书
  5. iOS真机调试
  6. [开发笔记]-sqlite数据库在使用时遇到的奇葩问题记录
  7. HTML5 3D动画效果
  8. Java基础知识强化之集合框架笔记68:Collections类概述和成员方法(备注:Collection 和 Collections区别)
  9. unity tips
  10. C语言函数qsort的使用方法
  11. shell 变量自增(转)
  12. Android4.2中Phone的P-sensor的应用的分析。
  13. #define命令的一些高级用法
  14. Linux学习 -- 日志管理
  15. ES6的数据类型
  16. 判断系统是64位还是32位的bat方法
  17. 读javascript高级程序设计-目录
  18. Spark-Unit2-Spark交互式命令行与SparkWordCount
  19. SPLAY,LCT学习笔记(四)
  20. Couldn’t load locSDK3

热门文章

  1. C指针的大小
  2. 使用robot frame selenium中遇到的问题汇总
  3. a链接中套a链接
  4. C语言 多线程测试
  5. Ajax实现原理
  6. js中Array的一些扩展
  7. 使用VMware Workstation 12.5.2新建虚拟机
  8. java开发连接Oracle 12c采用PDB遇到问题记录
  9. MicroERP1.0简介及下载
  10. 初学3D Touch