用stm32f407采集AM2302的温湿度数据,但是采集到的数据是错误的,请看看哪里错了。

2019-07-20 07:48发布

自己按照时序写的程序,自己没有找到问题的所在,认为没有什么问题,但是就是读出来的温湿度数据是错误的。希望做过这个实验的同学们能给点帮助,谢谢了。首先感谢大家能耐心的看完,希望能提出宝贵的建议。谢谢、

附上AM2302.C程序
#include "dht22.h"
#include "delay.h"
#include "lcd.h"
#include "sys.h"
#include "stdlib.h"

int    Humi_H=0,Humi_L=0,Temp_H=0,Temp_L=0,Check_data=0,Hum,Temp;

//复位DHT22,2S的启动延时
void DHT22_Rst(void)          
{  
        delay_ms(2000);
        DHT22_IO_OUT() ;
        DHT22_DQ_OUT =1;
       
}

u8 DHT22_Read_Bit(void) //读一位                         
{
       
        while(DHT22_DQ_IN == 0);
        delay_us(50);
        if(DHT22_DQ_IN == 1)
        {
                return 1;
        }
        else
                return 0;
}

u8 DHT22_Read_Byte(void) //读一个字节   
{        
    u8 i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                  
            dat|=DHT22_Read_Bit();
                        dat<<=1;
    }                                                    
    return dat;
}


void Read_DHT22(void)//读数据
{
        u8 t = 0;
        DHT22_IO_OUT();         //SET OUTPUT,设置为输出模式
        DHT22_DQ_OUT=0;         //拉低DQ
        delay_us(1500);            //拉低至少1ms
        DHT22_DQ_OUT=1;               
        DHT22_IO_IN();       
        delay_us(30);             //主机拉高20~40us,至此是单片机的起始信息。
       
        if(DHT22_DQ_IN == 0)//判断DHT22是否返回响应
        {
                while (DHT22_DQ_IN == 0)//轮询为80us的低电平后跳出循环,时序图上说明会输出80us的低电平作为应答信号。
                {
                        t++;
                        delay_us(1);
               
                }//响应80us的低电平
                t = 0;
                while (DHT22_DQ_IN == 1)//轮询80us后跳出来,输出80us的高电平通知外设准备接受数据。
                {
                        t++;
                        delay_us(1);
               
                }//响应80us的高电平
               
        //响应结束,开始读取数据。       
       
           Humi_H=DHT22_Read_Byte();          //湿度的高8位数据
           Humi_L=DHT22_Read_Byte();          //湿度的低8位数据
           Temp_H=DHT22_Read_Byte();          //温度的高8位数据
           Temp_L=DHT22_Read_Byte();          //温度的低8位数据
           Check_data=DHT22_Read_Byte();                //校验字节数据
                                                          //这里没有写校验程序。不影响。

               //40位数据传输完之后的状态。
                DHT22_IO_IN();
                delay_us(50);
                DHT22_IO_OUT();         //SET OUTPUT,设置为输出模式
                DHT22_DQ_OUT=1;
               
        }

}
void AM2302(void)
{
         Hum=(Humi_H*256+Humi_L);//此处的湿度为实际湿度的10倍
         Temp=Temp_H*256+Temp_L;//此处的湿度为实际温度的10倍
}

void DHT22_Init(void)//初始化
{
        GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);//使能GPIOG时钟

  //GPIOF9,F10初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化

       
}























友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
bufangqi
1楼-- · 2019-07-21 06:02
kvdong 发表于 2018-6-8 09:21
看上去似乎没什么大问题,那个if()判断感觉意义不大,甚至不知道会不会起反作用。如果一直是高电平的话, ...

嗯恩,在时序上也没有找到哪里有错误,可能是那些细节上自己还没有发现。谢谢你。

一周热门 更多>