OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10387|回复: 13

DHT11收到的数据不正确

[复制链接]

28

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2014-12-12
在线时间
22 小时
发表于 2014-12-16 13:36:18 | 显示全部楼层 |阅读模式
5金钱
用了原子哥的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]

最佳答案

查看完整内容[请看2#楼]

楼主挂了吗?u8 DHT11_Check(void)不对。 应该是先检测if(!dq_in()),再if(dq_in()),跟注释都相反了啊,我这里整理好了: http://www.labisart.com/blog/article/75
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2016-1-25
在线时间
16 小时
发表于 2014-12-16 13:36:19 | 显示全部楼层
本帖最后由 lanmanck 于 2017-7-20 10:03 编辑

楼主挂了吗?u8 DHT11_Check(void)不对。
应该是先检测if(!dq_in()),再if(dq_in()),跟注释都相反了啊,我这里整理好了:
http://www.labisart.com/blog/article/75
诚交各路大侠
回复

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-2-13
在线时间
0 小时
发表于 2014-12-16 13:57:37 | 显示全部楼层
改引脚不能只在初始化改噢,DHT11_IO_IN()里改了没有?
回复

使用道具 举报

28

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2014-12-12
在线时间
22 小时
 楼主| 发表于 2014-12-16 14:16:20 | 显示全部楼层
回复【2楼】托卡玛克:
---------------------------------
在.h文件里改了
回复

使用道具 举报

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2013-2-13
在线时间
0 小时
发表于 2014-12-16 15:14:24 | 显示全部楼层
我的意思是输出变输入中的函数是否有改?
回复

使用道具 举报

28

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2014-12-12
在线时间
22 小时
 楼主| 发表于 2014-12-16 15:34:59 | 显示全部楼层
回复【4楼】托卡玛克:
---------------------------------
改了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-12-16 23:05:38 | 显示全部楼层
看配置没啥问题,建议仿真看下PA7的寄存器是否是你设置的那样。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-12-6
在线时间
24 小时
发表于 2014-12-18 15:12:24 | 显示全部楼层

楼主的程序中PA7的寄存器设置的对吗?我也想用PA组中的引脚,但是不会设置。

#define DHT11_IO_IN()  {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=8<<12;}
#define DHT11_IO_OUT() {GPIOG->CRH&=0XFFFF0FFF;GPIOG->CRH|=3<<12;}

上面的两句程序是原子哥设置PG11的,要设置其他的引脚,我该怎么修改呢?
回复

使用道具 举报

28

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2014-12-12
在线时间
22 小时
 楼主| 发表于 2014-12-18 15:56:26 | 显示全部楼层
回复【7楼】cetcnav:
---------------------------------
CRH的0XFFFF0FFF从低到高分别对应8-15
回复

使用道具 举报

6

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2014-4-12
在线时间
0 小时
发表于 2014-12-18 21:35:18 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------

#define DHT11_IO_IN()  {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|= 8<<24;}
#define DHT11_IO_OUT() {GPIOC->CRL&=0XF0FFFFFF;GPIOC->CRL|= 3<<24;}
#define DHT11_DQ_OUT Cout(6) 
#define DHT11_DQ_IN  Cin(6)  

unsigned char DHT11_Init(void)
{
RCC->APB2ENR|=1<<4;    //????PORTC???±?? 
GPIOC->CRL&=0XF0FFFFFF;//PORTC.6???ì????
GPIOC->CRL|=0X03000000;
GPIOC->ODR|=1<<6;      //????1    
DHT11_Rst();
return DHT11_Check();
}

Build target 'GWSPM'
compiling dht11.c...
code\dht11.c(9): warning:  #223-D: function "Cout" declared implicitly
      DHT11_DQ_OUT = 0;         //拉低DQ
code\dht11.c(9): error:  #137: expression must be a modifiable lvalue
      DHT11_DQ_OUT = 0;         //拉低DQ
code\dht11.c(11): error:  #137: expression must be a modifiable lvalue
      DHT11_DQ_OUT = 1;         //DQ=1 
code\dht11.c(21): warning:  #223-D: function "Cin" declared implicitly
      while (DHT11_DQ_IN && retry < 100)//DHT11会拉低40~80us
code\dht11.c(41): warning:  #223-D: function "Cin" declared implicitly
        while(DHT11_DQ_IN && retry < 100)//等待变为低电平
code\dht11.c: 3 warnings, 2 errors
".\output\dongxin.axf" - 2 Error(s), 3 Warning(s).
Target not created



原子哥:这是什么原因呀??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-12-18 22:44:25 | 显示全部楼层
DHT11_IO_IN和DHT11_IO_OUT,是两个代码段,不可能赋值的。
你这调用方法就有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-2-15
在线时间
8 小时
发表于 2017-2-17 16:57:15 | 显示全部楼层
楼主问题解决了吗
回复

使用道具 举报

3

主题

9

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-2-15
在线时间
8 小时
发表于 2017-2-17 16:57:31 | 显示全部楼层
楼主问题解决了吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-9-23
在线时间
9 小时
发表于 2019-10-18 20:26:06 | 显示全部楼层
托卡玛克 发表于 2014-12-16 13:57
改引脚不能只在初始化改噢,DHT11_IO_IN()里改了没有?

感谢老哥!搞了两天终于解决了!太感谢了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-5 12:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表