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--);

}
}

标签: none

添加新评论