现附上程序,往各位大神帮助解决~
注“用的是AVR-GCC的库延时函数”
#include<avr/io.h>
#include<util/delay.h>
#define uchar unsigned char
int main(void)
{
uchar p=0;
for(p=0;p<100;p++)
_delay_ms(15);
while(1)
{
/* uchar i=0,j=0,k=0,Temp=0,temp=0,Humid=0,Temper=0,Data=0;
uchar DHTData[5]={}; //存储采集到的温湿度数
uchar Display[4]={}; //提取在数码管上显示的数值
DHTOUT; //设置PB4为输出状
CLR_DHT; //设置PB4为低电平
_delay_ms(12); //MCU发送启动信号;拉低至少18ms
_delay_ms(12);
DHTIN;
_delay_us(30); //主机拉高20-40us
temp=PINB; //主机拉高20-40us
Temp=temp&0X10;
if(Temp==0X00) //如果接收到DHT11发送的80?s低电平
{
while(!Temp); //等待响应信号结束
Temp=temp&0X10;
while(Temp); //等待准备信号结束
for(i=0;i<5;i++) //读取五个字节数据
{
for(j=0;j<8;j++)
{
Data=0;
temp=PINB;
Temp=temp&0X10; //防止其他位的干扰
while(!Temp); //等待50us低电平过去,等高电平到来
_delay_us(35); //延时35us ,延时必须(26-28us)
Data<<=1;
Temp=temp&0X10;
if(Temp) //如果35us以后采集到数据还是高电平,则输出为高电平
{
Data|=0x01;
}
else
{
Data|=0x00;
}
Temp=temp&0X10;
while(Temp); //等50us低电平到来 ,然后去读下一位数据
}
DHTData[i]=Data;
}
}
Humid=DHTData[0]; //提取湿度值 humidity
Temper=DHTData[2]; //提取温度值 temperature
Display[0]=Temper/10; //提取温度的十位数
Display[1]=Temper%10; //提取温度的个位数
Display[2]=Humid/10; //提取湿度的十位数
Display[3]=Humid%10; //提取湿度的十位数
*/ |