其中,表示 0 的时序如下:
表示 1 的时序如下:
1) DHT11 以低电平应答主机,然后拉高总线准备输出。输出 0 信号和 1 信号都是以低电 平开始高电平结束。
2) DHT11 输出 0、 1 信号的低电平时间相同,而高电平的时间不同,输出 0 信号时高电平 约 26-28us,而当输出 1 信号时高电平约为 70us。
2. 驱动程序 (需要详细注释的话参考 cc2540/cc2530 的 dht11 程序)
关于字符设备驱动程序的使用,我们可以参照点亮 led 灯的那个实验,这里只给出跟 dht11 密切相关的驱动程序,详细的程序请查看我们的驱动文件!
//从 dht11 中读取一个字节
static unsigned char read_byte(void)
{
unsigned char r_val = 0;
unsigned char t_count = 0; //计时器,防止超时;
unsigned char i;
for(i = 0 ; i < 8 ; i )
{
t_count = 0;
while(!DHT11_STA)
{
udelay(1);
t_count ; if(t_count>250)
{
printk("read_byte error1\n");
return 100;
}
}
t_count = 0;
udelay(32);
if(DHT11_STA == 1)
{
r_val <<= 1; r_val |= 1;
}
else
{
r_val <<= 1; continue;
}
while( DHT11_STA == 1 )
{
udelay(2);
t_count ; if(t_count>250)
{
printk("read_byte error2\n");
return 100;
}
}
}
return r_val;
}
//从 dht11 中读出数据
static unsigned int read_dht11(void)
{
unsigned char t_count = 0; //计时器;
unsigned int dht11 = 0;