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

2019-07-21 04:49发布

[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 ",temperature); 50 printf("湿度"); 51 printf("%d ",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显示

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
青苹果PAD
1楼-- · 2019-07-21 09:10
不是没读到数据就是没有刷新显示。
核弹技术哪家强
2楼-- · 2019-07-21 13:04
回复【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);
}
核弹技术哪家强
3楼-- · 2019-07-21 15:23
回复【2楼】青苹果PAD:
---------------------------------
是在while循环下的,时序检查过了,没问题
ADS1993
4楼-- · 2019-07-21 19:19
驱动时序里面的延时 增大一些试试
核弹技术哪家强
5楼-- · 2019-07-21 22:27
 精彩回答 2  元偷偷看……
muniao
6楼-- · 2019-07-21 23:12
用示波器看看时序吧

一周热门 更多>