|
编译环境:WINAVR2010
使用芯片:ATmega16L
系统晶振:7.3728MHz
外围器件:DHT11
-------------------------------------------------------------------------------------------
从网上找了几个DHT11的资料,发现有2个版本,主要是数据格式的不同,如图所示
(格式一:数字0=12-14us低电平+26-28us高电平;数字1=12-14us低电平+116-118us高电平
格式二:数字0=50us低电平+26-28us高电平;数字1=50us低电平+70us高电平)
我实在不明白为什么同样的型号会有2种完全不同的手册,后来我用M16的定时器测试了一下,发现我的DHT11是格式二。
但是读出来的数据除了湿度的整数一直是70%,其余的都是0(读出的数据已经通过校验),附下我的程序,请高手们帮我看看,谢谢!
unsigned char DHT11_Init()
{
DA_OUT; //引脚输出模式
DA_0;
_delay_ms(20); //至少18ms的开始信号
DA_1;
_delay_us(40);
DA_IN;
_delay_us(10);
if(DA_PIN) return 0;
_delay_us(60);
if(DA_PIN) return 1;
else return 0;
}
void DHT11_Read()
{
unsigned char i,j,k,n;
if(!DHT11_Init()) {DHT11_DAT[0]=255;DHT11_DAT[1]=255;DHT11_DAT[2]=255;DHT11_DAT[3]=255;}
else
{
while(DA_PIN);
for(j=0;j<5;j++)
{
for(i=0;i<8;i++)
{
while(!DA_PIN);
TCCR0=0x02;
while(DA_PIN);
TCCR0=0x00;n=TCNT0;TCNT0=0X00;
if(n>=50) DHT11_DAT[j]|=(1<<(7-i));
else DHT11_DAT[j]&=~(1<<(7-i));
}
}
if(DHT11_DAT[4]==DHT11_DAT[0]+DHT11_DAT[1]+DHT11_DAT[2]+DHT11_DAT[3]) ;
else DHT11_DAT[0]=0;DHT11_DAT[1]=0;DHT11_DAT[2]=0;DHT11_DAT[3]=0;
DA_OUT;
DA_1;
}
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|