OpenEdv-开源电子网

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

DHT11温湿度传感器,显示的值永远为104,求解

[复制链接]

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-3-28
在线时间
0 小时
发表于 2015-7-3 21:48:14 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]1 DHT11代码和主函数代码如下 ,已经纠结了几天了,找不到原因,原子的原程序改的 1 DHT11函数 view sourceprint? 1 01 #include "dht11.h" 02 #include "delay.h" 03 04 void DHT11_Rst(void) 05 { 06 DHT11_IO_OUT(); //SET OUTPUT 07 DHT11_DQ_OUT=0; 08 delay_ms(30); 09 DHT11_DQ_OUT=1; //DQ=1 10 delay_us(50); 11 } 12 13 u8 DHT11_Check(void) 14 { 15 u8 retry=0; 16 DHT11_IO_IN();//SET INPUT 17 while (DHT11_DQ_IN&&retry<100) 18 { 19 retry++; 20 delay_us(1); 21 }; 22 if(retry>=100)return 1; 23 else retry=0; 24 while (!DHT11_DQ_IN&&retry<100) 25 { 26 retry++; 27 delay_us(1); 28 }; 29 if(retry>=100)return 1; 30 return 0; 31 } 32 33 u8 DHT11_Read_Bit(void) 34 { 35 u8 retry=0; 36 while(DHT11_DQ_IN&&retry<100) 37 { 38 retry++; 39 delay_us(1); 40 } 41 retry=0; 42 while(!DHT11_DQ_IN&&retry<100) 43 { 44 retry++; 45 delay_us(1); 46 } 47 delay_us(40); 48 if(DHT11_DQ_IN)return 1; 49 else return 0; 50 } 51 52 u8 DHT11_Read_Byte(void) 53 { 54 u8 i,dat; 55 dat=0; 56 for (i=0;i<8;i++) 57 { 58 dat<<=1; 59 dat|=DHT11_Read_Bit(); 60 } 61 return dat; 62 } 63 64 u8 DHT11_Read_Data(u8 *temp,u8 *humi) 65 { 66 u8 buf[5]; 67 u8 i; 68 DHT11_Rst(); 69 if(DHT11_Check()==0) 70 { 71 for(i=0;i<5;i++) 72 { 73 buf=DHT11_Read_Byte(); 74 } 75 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4]) 76 { 77 *humi=buf[0]; 78 *temp=buf[2]; 79 } 80 }else return 1; 81 return 0; 82 } 83 84 85 u8 DHT11_Init(void) 86 { 87 GPIO_InitTypeDef GPIO_InitStructure; 88 89 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 90 91 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 92 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 93 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 94 GPIO_Init(GPIOA, &GPIO_InitStructure); 95 GPIO_SetBits(GPIOA,GPIO_Pin_11); 96 97 DHT11_Rst(); 98 return DHT11_Check(); 99 } 1 1 主函数 1 01 #include "led.h" 02 #include "delay.h" 03 #include "key.h" 04 #include "sys.h" 05 #include "12864.h" 06 #include "usart.h" 07 #include "dht11.h" 08 09 10 int main(void) 11 { 12 u8 t=0; 13 u8 temperature; 14 u8 humidity; 15 16 delay_init(); 17 NVIC_Configuration(); 18 uart_init(9600); 19 LED_Init(); 20 21 KEY_Init(); 22 InitDis(); 23 24 DisStr(1,1,"DHT11_测试"); 25 26 while(DHT11_Init()) 27 { 28 29 DisStr(2,3,"DHT11 Error"); 30 delay_ms(200); 31 32 delay_ms(200); 33 } 34 35 DisStr(2,3,"DHT11 OK"); 36 37 DisStr(3,1,"温度 C"); 38 DisStr(4,1,"湿度 %"); 39 while(1) 40 { 41 if(t%10==0) 42 { 43 DHT11_Read_Data(&temperature,&humidity); 44 45 DisInt(3,4,temperature); 46 DisInt(4,4,humidity); 47 } 48 printf("温度"); 49 printf("%d\r\n",temperature); 50 printf("湿度"); 51 printf("%d\r\n",humidity); 52 53 delay_ms(10); 54 t++; 55 if(t==20) 56 { 57 t=0; 58 LED0=!LED0; 59 } 60 } 61 } [/mw_shl_code]

接的是开发板上3.3v电源,12864上显示,应该是1s刷新一次,但是数据永远是104

程序是原子的原版程序,只是改成了12864显示



我待ARM如初恋,ARM虐我千百遍!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

43

主题

278

帖子

1

精华

高级会员

Rank: 4

积分
621
金钱
621
注册时间
2013-12-27
在线时间
0 小时
发表于 2015-7-3 22:23:24 | 显示全部楼层
不是没读到数据就是没有刷新显示。
水的比较多。
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-3-28
在线时间
0 小时
 楼主| 发表于 2015-7-3 22:32:22 | 显示全部楼层
回复【2楼】青苹果PAD:
---------------------------------
while(1)
{          
  if(t%10==0)//??100ms????????
{   
DHT11_Read_Data(&temperature,&humidity);     
// LCD_ShowNum(60+40,150,temperature,2,16);      
DisInt(3,4,temperature);
// LCD_ShowNum(60+40,170,humidity,2,16);      
DisInt(4,4,humidity);
}
我待ARM如初恋,ARM虐我千百遍!
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-3-28
在线时间
0 小时
 楼主| 发表于 2015-7-3 22:32:48 | 显示全部楼层
回复【2楼】青苹果PAD:
---------------------------------
是在while循环下的,时序检查过了,没问题
我待ARM如初恋,ARM虐我千百遍!
回复

使用道具 举报

3

主题

111

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1085
金钱
1085
注册时间
2015-5-22
在线时间
607 小时
发表于 2015-7-3 22:46:31 | 显示全部楼层
驱动时序里面的延时 增大一些试试
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-3-28
在线时间
0 小时
 楼主| 发表于 2015-7-4 13:27:01 | 显示全部楼层
回复【5楼】ADS1993:
---------------------------------
都增大了,还是不行,用的是原子的程序,只是改了一下12864显示
我待ARM如初恋,ARM虐我千百遍!
回复

使用道具 举报

14

主题

490

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1229
金钱
1229
注册时间
2012-8-4
在线时间
248 小时
发表于 2015-7-4 13:34:17 | 显示全部楼层
用示波器看看时序吧
nrf51822蓝牙4.0手环开发板: 淘宝小店
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2015-7-6 11:59:24 | 显示全部楼层
这个这么奇怪啊,换一个传感器试试呢
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-3-28
在线时间
0 小时
 楼主| 发表于 2015-7-14 15:02:01 | 显示全部楼层
回复【8楼】ST-FAE-SALE:
---------------------------------
换了新的DHT11还是这样,应该是程序的问题 ,但是程序找不到任何问题,因为是原子的程序改了12864显示
我待ARM如初恋,ARM虐我千百遍!
回复

使用道具 举报

8

主题

45

帖子

0

精华

高级会员

Rank: 4

积分
838
金钱
838
注册时间
2015-10-23
在线时间
163 小时
发表于 2016-12-6 16:07:54 | 显示全部楼层
如果DHT11改了端口的话,注意DHT11.h里面的如下语句一定要彻底修改。我就因此走了弯路。//IO·&#189;&#207;òéè&#214;&#195;
#define DHT11_IO_IN()  {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=8<<0;}
#define DHT11_IO_OUT() {GPIOA->CRL&=0XFFFFFFF0;GPIOA->CRL|=3<<0;}

////IO2ù×÷oˉêy                                                                                          
#define        DHT11_DQ_OUT PAout(0) //êy&#190;Y&#182;&#203;&#191;ú        PA0
#define        DHT11_DQ_IN  PAin(0)  //êy&#190;Y&#182;&#203;&#191;ú        PA0
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2017-9-5
在线时间
3 小时
发表于 2017-9-16 00:18:18 | 显示全部楼层
我也有这种问题,楼主解决了吗
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-5-10
在线时间
20 小时
发表于 2018-5-23 10:45:00 | 显示全部楼层
wsw1232002 发表于 2016-12-6 16:07
如果DHT11改了端口的话,注意DHT11.h里面的如下语句一定要彻底修改。我就因此走了弯路。//IO·&#189;&#207; ...

这个要怎么根据修改呢?
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2018-3-8
在线时间
41 小时
发表于 2019-3-3 15:26:52 | 显示全部楼层
我的也是这样,请问楼主解决了吗,
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-6-18
在线时间
5 小时
发表于 2020-7-5 12:30:35 | 显示全部楼层
请问楼主解决了吗
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-7-17
在线时间
0 小时
发表于 2020-7-17 23:23:27 | 显示全部楼层
没读到数据,得到的是一个随机的数
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2021-7-28
在线时间
1 小时
发表于 2021-8-9 19:54:04 | 显示全部楼层
我刚刚也遇到了并且解决了。是这样:因为这个改过端口
#define         DHT_Direction_I          {GPIOA->CRL &= 0XFFFFFFF0; GPIOA->CRL |= 8;}
#define         DHT_Direction_O         {GPIOA->CRL &= 0XFFFFFFF0; GPIOA->CRL |= 3;}
/*        IO Definitions        */
#define                O_DHT_DAT                PAout(0)
#define                I_DHT_DAT                PAin(0)
#define                DHT_DAT_Pin                GPIO_Pin_0//这个如果修改过的话,上面的PAout(0)PAin(0都得修改)就像上面老哥说的一样要完全修改才行
#define            DHTPORT         GPIOA
#define     DHTCLKLINE      RCC_APB2Periph_GPIOA

回复

使用道具 举报

37

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
345
金钱
345
注册时间
2016-7-3
在线时间
87 小时
发表于 2021-8-10 15:21:11 | 显示全部楼层
没读成功,有时候是传感器问题,以前经常遇到这个问题,换个传感器就行了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 11:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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