DHT11收到的数据不正确

2019-08-16 22:14发布

用了原子哥的DHT11程序  我把引脚改了一下接受到数据不对 是固定值  下面是代码 麻烦大家帮我看看
[mw_shl_code=c,true]#ifndef __DHT11_H #define __DHT11_H #include "sys.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK战舰STM32开发板 //DHT11数字温湿度传感器驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2012/9/12 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved ////////////////////////////////////////////////////////////////////////////////// //IO方向设置 #define DHT11_IO_IN() {GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=8<<28;} #define DHT11_IO_OUT() {GPIOA->CRL&=0X0FFFFFFF;GPIOA->CRL|=3<<28;} ////IO操作函数 #define DHT11_DQ_OUT PAout(7) //数据端口 PA0 #define DHT11_DQ_IN PAin(7) //数据端口 PA0 extern u8 buf[5]; u8 DHT11_Init(void);//初始化DHT11 u8 DHT11_Read_Data(u8 *temp,u8 *humi);//读取温湿度 u8 DHT11_Read_Byte(void);//读出一个字节 u8 DHT11_Read_Bit(void);//读出一个位 u8 DHT11_Check(void);//检测是否存在DHT11 void DHT11_Rst(void);//复位DHT11 #endif 下面是.c文件 #include "delay.h" #include "dht11.h" #include "PM.h" u8 buf[5]; //复位DHT11 void DHT11_Rst(void) { DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ delay_ms(18); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 delay_us(40); //主机拉高20~40us } //等待DHT11的回应 //返回1:未检测到DHT11的存在 //返回0:存在 u8 DHT11_Check(void) { u8 retry=0; DHT11_IO_IN();//SET INPUT while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us { retry++; delay_us(1); }; if(retry>=100)return 1; else retry=0; while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us { retry++; delay_us(1); }; TVOC=1; if(retry>=100)return 1; return 0; } //从DHT11读取一个位 //返回值:1/0 u8 DHT11_Read_Bit(void) { u8 retry=0; while(DHT11_DQ_IN&&retry<100)//等待变为低电平 { retry++; delay_us(1); } retry=0; while(!DHT11_DQ_IN&&retry<100)//等待变高电平 { retry++; delay_us(1); } delay_us(40);//等待40us if(DHT11_DQ_IN)return 1; else return 0; } //从DHT11读取一个字节 //返回值:读到的数据 u8 DHT11_Read_Byte(void) { u8 i,dat; dat=0; for (i=0;i<8;i++) { dat<<=1; dat|=DHT11_Read_Bit(); } return dat; } //从DHT11读取一次数据 //temp:温度值(范围:0~50°) //humi:湿度值(范围:20%~90%) //返回值:0,正常;1,读取失败 u8 DHT11_Read_Data(u8 *temp,u8 *humi) { u8 i; DHT11_Rst(); if(DHT11_Check()==1) { for(i=0;i<5;i++)//读取40位数据 { buf=DHT11_Read_Byte(); } // if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) // buf[0]=11; // buf[2]=11; *humi=buf[0]; *temp=buf[2]; }else return 1; return 0; } //初始化DHT11的IO口 DQ 同时检测DHT11的存在 //返回1:不存在 //返回0:存在 u8 DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PG端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PG11端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化IO口 GPIO_SetBits(GPIOA,GPIO_Pin_7); //PG11 输出高 DHT11_Rst(); //复位DHT11 return DHT11_Check();//等待DHT11的回应 } [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
lanmanck
1楼-- · 2019-08-17 03:10
本帖最后由 lanmanck 于 2017-7-20 10:03 编辑

楼主挂了吗?u8 DHT11_Check(void)不对。
应该是先检测if(!dq_in()),再if(dq_in()),跟注释都相反了啊,我这里整理好了:
http://www.labisart.com/blog/article/75
托卡玛克
2楼-- · 2019-08-17 09:02
 精彩回答 2  元偷偷看……
z2500053109
3楼-- · 2019-08-17 11:57
回复【2楼】托卡玛克:
---------------------------------
在.h文件里改了
托卡玛克
4楼-- · 2019-08-17 13:02
我的意思是输出变输入中的函数是否有改?
z2500053109
5楼-- · 2019-08-17 15:08
回复【4楼】托卡玛克:
---------------------------------
改了
正点原子
6楼-- · 2019-08-17 17:46
看配置没啥问题,建议仿真看下PA7的寄存器是否是你设置的那样。

一周热门 更多>