自己按照时序写的程序,自己没有找到问题的所在,认为没有什么问题,但是就是读出来的温湿度数据是错误的。希望做过这个实验的同学们能给点帮助,谢谢了。首先感谢大家能耐心的看完,希望能提出宝贵的建议。谢谢、
附上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);//初始化
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>