使用STM32F407采集AM2302的温湿度数据,但是显示的不正确,请大家看一下。谢谢

2019-07-20 07:51发布


这是AM2302.c的完整程序,前面部分是仿照DHT11程序写的,在   u8 DHT22_Read_Data(u16 *temp,u16 *humi)  中,根据接收数据的顺序写的。
采集到的温度是50多度,湿度也很不稳定,跳动很大。大家看看是怎么回事,是哪里设置错了。谢谢。  

#include "dht22.h"
#include "delay.h"
#include "lcd.h"
#include "sys.h"
#include "stdlib.h"

float    Humi_H=0,Humi_L=0,Temp_H=0,Temp_L=0,Check_data=0;

//复位DHT22
void DHT22_Rst(void)          
{  
       
//        DHT22_IO_IN();
//        DHT22_DQ_OUT=1;
//        delay_ms(2);
       
DHT22_IO_OUT();         //SET OUTPUT,设置为输出模式
  DHT22_DQ_OUT=0;         //拉低DQ
  delay_ms(1);            //拉低至少1ms
  DHT22_DQ_OUT=1;         //DQ=1
        delay_us(30);             //主机拉高20~40us
}
//等待DHT22的回应
//返回1:未检测到DHT22的存在
//返回0:存在
u8 DHT22_Check(void)           
{   
        u8 retry=0;
        DHT22_IO_IN();//SET INPUT        从机信号输出
    while (DHT22_DQ_IN&&retry<100)//DHT22会拉低40~80us,/*轮询直到从机发出 的80us 低电平 响应信号结束*/   
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=100)
                return 1;
        else
                retry=0;
    while (!DHT22_DQ_IN&&retry<100)//DHT22拉低后会再次拉高40~80us,/*轮询直到从机发出的 80us 高电平 标置信号结束*/
        {
                retry++;
                delay_us(1);
        };
        if(retry>=100)return 1;            
        return 0;
}
//从DHT22读取一个位
//返回值:1/0
u8 DHT22_Read_Bit(void)                          
{
        u8 retry=0;
        while(DHT22_DQ_IN&&retry<100)//等待变为低电平
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT22_DQ_IN&&retry<100)//等待变高电平
        {
                retry++;
                delay_us(1);
        }
        delay_us(50);//等待50us
        if(DHT22_DQ_IN)
                return 1;
        else
                return 0;                  
}
//从DHT22读取一个字节
//返回值:读到的数据
u8 DHT22_Read_Byte(void)   
{        
    u8 i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                  
            dat|=DHT22_Read_Bit();
                        dat<<=1;
    }                                                    
    return dat;
}



//从DHT22读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败

u8 DHT22_Read_Data(u16 *temp,u16 *humi)   
{        
        u8 Sum_data;
       
        DHT22_Rst();
        if(DHT22_Check()==0)//返回0:存在
        {
               
           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();                //校验字节数据
               
                Sum_data=(Humi_H+Humi_L+Temp_H+Temp_L);
           if(Sum_data == Check_data)                //若校验通过
           {
       
                                *humi= (Humi_H*256+Humi_L);        //合成并暂存16位湿度数据
                                *temp = (Temp_H*256+Temp_L);        //合成并暂存16位温度数据
               
           }
                 
                        else
                        return 1;               
        }
                       
                       
        return 0;            
}
//初始化DHT22的IO口 DQ 同时检测DHT22的存在
//返回1:不存在
//返回0:存在             
u8 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);//初始化
        DHT22_Rst();
        return DHT22_Check();
}

























友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。