这是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();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>