#define DHT_H_1 PORTD|=(1<
#define DHT_L_0 PORTD&=~(1<
#define DHT_Out_1 DDRD|=(1<
#define DHT_in_0 DDRD&=~(1<
uchar DHT_Read()
{
uchar i,Data1=0;
for (i=0;i<8;i++)
{
while(PIND7==0);//等待数据开始的低电平结束
_delay_us(28); //等待28us
Data1<<=1;
if (PD7==1)//如果等待28us后 pin7为高电平该信号为1
{
Data1|=0x01;
}
else
{
Data1|=0x00;
}
while(PIND7==0);//等待结束低电平结束,以便开始下一个数据的接收
}
return Data1;
}
void DHT_Data()
{
uchar i;
DHT_Out_1;//DDR pin7输出
DHT_L_0; // 把pin7高电平拉低
_delay_ms(18);//拉低持续2ms,资料上说是拉低大于1ms
DHT_H_1;//释放pin7
DHT_in_0;//设置pin7为输入
DHT_H_1;
_delay_us(25);//总线由上拉电阻拉高主机延时 >20us等待25us以便DHT应答
if(PIND7==0)//检测pin7状态。DHT是否拉低PIN7响应
{
while(PIND7==0)//等待DHT拉低PIN7 80us
while(PIND7==1)//等待DHT释放PIN7 80us
for (i=0;i<5;i++)//开始数据传输
{
TempData[i]=DHT_Read();
}
}
} |