DHT11是一款温湿度传感器,通讯采用单总线通讯协议,
它的精度看起来挺渣的= =,但是它的通讯协议简单,可以用来学习按照时序来写代码:
{% asset_img DHT11.jpg %}
#include "reg52.h"
sbit dht = P1^0;
int point[8];
int wetint[8];
int temint[8];
void delay30ms(void);
void delay30us(void);
void delay36us(void);
void delay2s(void);
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI);// 等特数据传送
TI = 0;// 清除数据传送标志
}
void start()
{
dht = 0;
delay30ms();//拉低总线,初始化dht
dht = 1;
delay30us();//释放总线,等待dht响应
dht = 1;
while(!dht);//80us dht响应
while(dht);//准备开始传输
}
void readp()
{
char t;
for(t=0;t<8;t++)
{
while(!dht);
delay36us();
if(dht == 1)
{
point[7-t]=1;
while(dht);
}
else
{
point[7-t]=0;
}
}
t=0;
}
void readw()
{
char t;
for(t=0;t<8;t++)
{
while(!dht);
delay36us();
if(dht == 1)
{
wetint[7-t]=1;
while(dht);
}
else
{
wetint[7-t]=0;
}
}
t=0;
}
void readt()
{
char t;
for(t=0;t<8;t++)
{
while(!dht);
delay36us();
if(dht == 1)
{
temint[7-t]=1;
while(dht);
}
else
{
temint[7-t]=0;
}
}
t=0;
}
void main()
{
unsigned char cnt,str[3],p;
int tresult=0;
int wresult=0;
TMOD = 0x20;// 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD;// 波特率9600
TL1 = 0xFD;
SCON = 0x50;// 设定串行口工作方式
PCON &= 0xef;// 波特率不倍增
TR1 = 1;// 启动定时器1
IE = 0x0;// 禁止任何中断
while(1)
{
if(RI)// 是否有数据到来
{
RI = 0;
delay2s();
start(); //初始化
readw();
readp();
readt();
readp();
for(cnt=0;cnt<8;cnt++) tresult="">>cnt)&1)*(1<
>cnt)&1)*(1<<cnt);
}
send_char('\n');
str[0]=tresult/100+48; //取百位
str[1]=(tresult/10)%10+48; //取十位
str[2]=tresult%10+48; //取个位
for(p=0;p<3;p++)
{
send_char(str[p]);
}
send_char(' ');
str[0]=wresult/100+48; //取百位
str[1]=(wresult/10)%10+48; //取十位
str[2]=wresult%10+48; //取个位
for(p=0;p<3;p++) tresult="0;" wresult="0;" void="" unsigned="" char="" c="35;c">0;c--)
for(b=122;b>0;b--)
for(a=2;a>0;a--);
}
void delay30us(void) //误差 0us
{
unsigned char a;
for(a=11;a>0;a--);
}
void delay36us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=14;a>0;a--);
}
void delay2s(void) //误差 0us
{
unsigned char a,b,c;
for(c=127;c>0;c--)
for(b=235;b>0;b--)
for(a=32;a>0;a--);
}
}