DHT11的编程
时间:10-02
整理:3721RD
点击:
哪位大虾帮我看看,哪里出错了!
//这个程序只检测湿度
#include <reg52.h>
//湿度位定义
sbit dht11 = P2^0;
//存放两字节数据的数组
static unsigned char value_array[2];
static unsigned char code array[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//函数声明
void Delay_1ms(unsigned int ms);//延时
static void Delay_10us(void); //延时 10us
static unsigned char ReadValue(void);//读一个字节的数据
static void SMG_Display(unsigned int value); //数码管显示
unsigned char ReadTempAndHumi(void);//读一次的数据,共五字节
int humi_value;
int main(void)
{
//先等上电稳定
Delay_1ms(1000);
//因为读一次数据dht11 才会触发一次采集数据.
//即在先使用数据时采集一次数据
ReadTempAndHumi();
while(1)
{
//显示湿度
SMG_Display(humi_value);
}
return 0;
}
//延时
void Delay_1ms(unsigned int ms)
{
unsigned int x,y;
for(x=ms;x>0;x--)
{
for(y=124;y>0;y--);
}
}
//延时10us
static void Delay_10us(void)
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
//*读一个字节的数据
static unsigned char ReadValue(void)
{
unsigned char count, value = 0, i;
for(i=2;i>0;i--)
{
//高位在先
value <<= 1;
count = 0;
//每一位数据前会有一个50us 的低电平时间.等待50us 低电平结束
while(dht11==0);
//26-28us 的高电平表示该位是0,为70us 高电平表该位1
Delay_10us();
Delay_10us();
Delay_10us();
//延时30us 后检测数据线是否还是高电平
if(dht11 != 0)
{
//进入这里表示该位是1
value++;
//等待剩余(约40us)的高电平结束
while(dht11 != 0)
{
dht11 = 1;
}
}
}
return (value);
}
//读一次的数据,共两字节
unsigned char ReadTempAndHumi(void)
{
unsigned char i=0,check_value=0,count=0;
dht11=0; //拉低数据线大于18ms 发送开始信号
Delay_1ms(20); //需大于18 毫秒
dht11=1; //释放数据线,用于检测低电平的应答信号
//延时20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线80us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
if(dht11==0)
{
count = 0;
dht11 = 1;//释放数据线
}
//应答信号后会有一个80us 的高电平,等待高电平结束
while(dht11 != 0);
//读出湿.温度值
for(i=0;i<2;i++)
{
value_array[i] = ReadValue();
check_value += value_array[i];
}
humi_value = value_array[0];
return humi_value;
}
//数码管显示函数
static void SMG_Display(unsigned int value)
{
unsigned char ge,bai,shi;
ge=value%10;
shi=value%100/10;
bai=value%1000/100;
P0=array[bai];
Delay_1ms(2);
P0=array[shi];
P0|=0x80; /*显示小数点*/
Delay_1ms(2);
P0=array[ge];
Delay_1ms(2);
}
//这个程序只检测湿度
#include <reg52.h>
//湿度位定义
sbit dht11 = P2^0;
//存放两字节数据的数组
static unsigned char value_array[2];
static unsigned char code array[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//函数声明
void Delay_1ms(unsigned int ms);//延时
static void Delay_10us(void); //延时 10us
static unsigned char ReadValue(void);//读一个字节的数据
static void SMG_Display(unsigned int value); //数码管显示
unsigned char ReadTempAndHumi(void);//读一次的数据,共五字节
int humi_value;
int main(void)
{
//先等上电稳定
Delay_1ms(1000);
//因为读一次数据dht11 才会触发一次采集数据.
//即在先使用数据时采集一次数据
ReadTempAndHumi();
while(1)
{
//显示湿度
SMG_Display(humi_value);
}
return 0;
}
//延时
void Delay_1ms(unsigned int ms)
{
unsigned int x,y;
for(x=ms;x>0;x--)
{
for(y=124;y>0;y--);
}
}
//延时10us
static void Delay_10us(void)
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
//*读一个字节的数据
static unsigned char ReadValue(void)
{
unsigned char count, value = 0, i;
for(i=2;i>0;i--)
{
//高位在先
value <<= 1;
count = 0;
//每一位数据前会有一个50us 的低电平时间.等待50us 低电平结束
while(dht11==0);
//26-28us 的高电平表示该位是0,为70us 高电平表该位1
Delay_10us();
Delay_10us();
Delay_10us();
//延时30us 后检测数据线是否还是高电平
if(dht11 != 0)
{
//进入这里表示该位是1
value++;
//等待剩余(约40us)的高电平结束
while(dht11 != 0)
{
dht11 = 1;
}
}
}
return (value);
}
//读一次的数据,共两字节
unsigned char ReadTempAndHumi(void)
{
unsigned char i=0,check_value=0,count=0;
dht11=0; //拉低数据线大于18ms 发送开始信号
Delay_1ms(20); //需大于18 毫秒
dht11=1; //释放数据线,用于检测低电平的应答信号
//延时20-40us,等待一段时间后检测应答信号,应答信号是从机拉低数据线80us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
if(dht11==0)
{
count = 0;
dht11 = 1;//释放数据线
}
//应答信号后会有一个80us 的高电平,等待高电平结束
while(dht11 != 0);
//读出湿.温度值
for(i=0;i<2;i++)
{
value_array[i] = ReadValue();
check_value += value_array[i];
}
humi_value = value_array[0];
return humi_value;
}
//数码管显示函数
static void SMG_Display(unsigned int value)
{
unsigned char ge,bai,shi;
ge=value%10;
shi=value%100/10;
bai=value%1000/100;
P0=array[bai];
Delay_1ms(2);
P0=array[shi];
P0|=0x80; /*显示小数点*/
Delay_1ms(2);
P0=array[ge];
Delay_1ms(2);
}
加油
俺也不懂 不过俺想要小编的程序可否给?
!
其实我也不懂 谁给解说一下呀
我问一下,你这个程序数据智能检测到湿度吗。
这个这个这个俺也是新手
为什么我把DHT11的数据口接在STC89C52的P1^3时始终采集不到数据,电路我检查过没问题,而接在P2口就可以采集到数据,这是为什么呢?要毕业了,在忙这个毕业设计,好头痛!
挺好的程序,希望可以使用
哎,,,高不会
不懂 小编可否讲解一下
请问你的问题解决了吗
请问你还找得到这个程序吗,