标题:
有大佬用过DHT11温湿度模块吗?单片机测出来的数据不太正常,求救
[打印本页]
作者:
单片机小白一个
时间:
2019-5-6 10:41
标题:
有大佬用过DHT11温湿度模块吗?单片机测出来的数据不太正常,求救
还有就是那个从机响应函数response()加上的话lcd就什么也不显示了,不加的话现在显示湿度68,温度46,
程序如下
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DATA=P2^0;
sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
uchar rec_dat[9]; //用于显示的接收数据数组
/*1ms延时函数*/
void delay1ms(uint x) //误差 0us
{
unsigned char a,b,c;
for(c=x;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/*80us延时函数*/
void delay80us(void) //误差 0us
{
unsigned char a,b;
for(b=11;b>0;b--)
for(a=2;a>0;a--);
}
/*60us延时函数*/
void delay60us(void) //误差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=8;a>0;a--);
}
/*24us延时函数*/
void delay24us(void) //误差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=2;a>0;a--);
}
/*27us延时函数*/
void delay27us(void) //误差 0us
{
unsigned char a;
for(a=12;a>0;a--);
}
/*主机发送起始信号*/
void start()
{
DATA=0;
delay1ms(20);
DATA=1;
delay24us();
}
/*检测从机应答信号*/
void response()
{
DATA=0;
delay80us();
DATA=1;
delay80us();
}
/*接收1字节数据*/
uint receivebyte()
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
while(!DATA);//等待50ms低电平过去
delay27us();
if(DATA==1)
dat+=1;
dat<<=1;//数据移位
while(DATA);
}
return dat;
}
void DHT11()
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revive;
start();
DATA=1;
// response();
if(DATA==0)
{
while(DATA==0);
delay80us();
R_H=receivebyte(); //接收湿度高八位
R_L=receivebyte(); //接收湿度低八位
T_H=receivebyte(); //接收温度高八位
T_L=receivebyte(); //接收温度低八位
revive=receivebyte(); //接收校正位
delay60us();
}
if((R_H+R_L+T_H+T_L)==revive) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*数据处理,方便显示*/
rec_dat[0]='0'+(RH/10);
rec_dat[1]='0'+(RH%10);
rec_dat[2]='R';
rec_dat[3]='H';
rec_dat[4]=' ';
rec_dat[5]=' ';
rec_dat[6]='0'+(TH/10);
rec_dat[7]='0'+(TH%10);
rec_dat[8]='C';
}
void lcd_wcom(uchar com)
{
rs=0;
rw=0;
P0=com;
delay1ms(5);
en=1;
delay1ms(5);
en=0;
}
void lcd_wdat(uchar dat)
{
rs=1;
rw=0;
P0=dat;
delay1ms(5);
en=1;
delay1ms(5);
en=0;
}
void lcd_init()
{
lcd_wcom(0x38);
lcd_wcom(0x0c);
lcd_wcom(0x06);
lcd_wcom(0x01);
}
void main()
{
uchar i;
lcd_init();
delay1ms(1000);
while(1)
{
DHT11();
lcd_wcom(0x80);
for(i=0;i<9;i++)
{
lcd_wdat(rec_dat[i]);
}
}
}
复制代码
作者:
1qdeuuu000
时间:
2019-5-6 18:58
主函数加个延时试试,这模块不能太过频繁调用,最好1~2s调用一次。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1