OpenEdv-开源电子网

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

求帮忙看一下这个DHT11温湿度传感器的时序代码到底是哪里错了,好无助

[复制链接]
回帖奖励 4 金钱 回复本帖可获得 4 金钱奖励! 每人限 1 次(中奖概率 70%)

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-12-20
在线时间
10 小时
发表于 2019-1-22 22:55:03 | 显示全部楼层 |阅读模式
项目里用DHT11温湿度传感器搞了好久好久,始终发现不了问题,好无助新手小白
求大神帮帮忙 真的不觉得自己时序有错 发送数据到串口 ack=1 dat始终=255



#include "dht11.h"
#include "delay.h"

u8 ack,hh;
u8 BUF[5];
long long  value=0;
       
void DHT11_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
       
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        GPIO_SetBits(GPIOA, GPIO_Pin_7);
        delay_ms(1000);

}


void input_mode()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;   
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
}

void output_mode()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;   
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}


void DHT11_send()
{
        GPIO_ResetBits(GPIOA,GPIO_Pin_7);
        delay_ms(18);
        GPIO_SetBits(GPIOA,GPIO_Pin_7);
        delay_us(30);
        input_mode();
       
}

u8 DHT11_check()                                       //check=1
{
        u8 retry=50;
        while(!DHT11_DQ_IN)
                        {
                                retry--;
                        delay_us(1);
                                }
         if(retry ==0) return 0;//3¬ê±íË3ö
         else retry=60;
       

        while(DHT11_DQ_IN &&retry>0)
           {
                                retry--;
                        delay_us(1);
                }
        if(retry==0) return 0;
  else return 1;
}


//void Time_us(u16 count)
//{
//        count--;
//        delay_us(1);
//}

//u8 DHT11_Read_Bit()
//{
//        u8 countdown=10;
//        while((!DHT11_DQ_IN)&&countdown)
//        {
//                countdown--;
//                delay_us(1);
//        }
//        delay_us(35);
//        if(DHT11_DQ_IN==1) return 1;
//        return 0;
//}

u8 DHT11_Read_byte()
{
        u8 dat=0;
        u8 i;
        for(i=0;i<8;i++)
   {
     while(!DHT11_DQ_IN)
                 delay_us(40);
    if( DHT11_DQ_IN)      //&#161;°1&#161;±
             dat=(dat<<1)+1;
                else
                   dat=(dat<<1)+1;     //&#161;°0&#161;±
          
   }
         return dat;
}


void DHT11_Get(u8 *temperature,u8* humidity )            
{
//    u8 i;
          DHT11_send();
   ack=DHT11_check();
        hh=DHT11_Read_byte();
        if(ack)
                {
                  BUF[0]=DHT11_Read_byte();
                        BUF[1]=DHT11_Read_byte();
                        BUF[2]=DHT11_Read_byte();
                        BUF[3]=DHT11_Read_byte();
                       
          }
          if(BUF[0]+BUF[1]+BUF[2]+BUF[3]==BUF[4])
                        {
                                        *humidity =(BUF[0]<<4)+BUF[1];
                                        *temperature =(BUF[2]<<4)+BUF[3];
                                }
          
}




以下是main函数部分
int main(void)
{               
       
        delay_init();                   
        uart_init(115200);       
        DHT11_Init();
        while(1)
        {
                DHT11_Init();
                DHT11_Get(&humid,&temp);
                delay_ms(10);

                printf("\r\n%d\r\n ",ack);
                printf("\r\n%d\r\n ",hh);
                printf("\r\nhumid:%d\r\n",humid);
                printf("\r\ntemp:%d\r\n",temp);
                delay_ms(3000);
                         
}
        }

另附时序图
求大佬帮忙啊啊啊 此贴勿沉 谢谢了 真的搞了很久很难过




QQ截图20190122225314.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-1-23 09:24:59 | 显示全部楼层
多一半是延时的问题,用示波器看看波形。
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2019-1-23 10:23:29 | 显示全部楼层

回帖奖励 +4 金钱

IO的使用合适不确认下,延时合适不合适确认下,一般就这问题导致的
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 07:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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