[51]dht11温湿模块

/*说明:这个程序需要把data连到P1^0端,然后只有当L8亮起时校验通过,数据准确*/
#include<reg52.h> 
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint led[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; //p0端0到f,0x7f为点
uint ledx[] = { 0x00,0x0e,0x0d,0x0b,0x07,0xff };             //p2端都亮,到都灭
sbit echo = P1 ^ 0;//定义data端口
unsigned char hum1 = 0, hum2 = 0, tem1 = 0, tem2 = 0;//分别对应湿度整数、小数和温度整数、小数。
uint t1a, t1b;    //对应数码管位数
uint        t2c, t2d;    //对应数码管位数
uint h1a, h1b;    //对应数码管位数
uint          h2c, h2d;    //对应数码管位数
unsigned char check;
sbit checkled = P1 ^ 7;        //校验通过则亮灯
sbit k1 = P3 ^ 4;         //显示湿度
sbit k2 = P3 ^ 5;         //显示温度
uint displaytem = 1;     //显示模式,默认显示温度
uint i = 0;
void delay(unsigned int x) //延时 x ms
{
    unsigned int i, j;
    for (i = x; i > 0; i--)

        for (j = 110; j > 0; j--);
}
void delay_10()//延时10us
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}
void start()
{
    tem1 = 0;
    tem2 = 0;
    hum1 = 0;
    hum2 = 0;
    echo = 0;//再将DATA输出为低电平,持续时间大于18ms,此时DHT检测到后从低功耗模式->高速模式 
    delay(50);
    echo = 1;//再拉高
    while (echo == 1);
    _nop_();
    while (echo == 0);     //一个应答
    _nop_();
    while (echo == 1);     //标志即将传输数据
    _nop_();
}
void read()
{
    /*以下是湿度整数部分的数据读入*/
    if (echo == 0)while (echo == 0);
    delay_10();
    delay_10();
    delay_10();
    delay_10();
    if (echo == 1)
    {
        hum1 = 1;
        while (echo == 1);
    }
    else if (echo == 0)
    {
        hum1 = 0;
    }
    for (i = 2; i <= 8; i++)
    {
        if (echo == 0)while (echo == 0);
        delay_10();
        delay_10();
        delay_10();
        delay_10();
        if (echo == 1)
        {
            hum1 = hum1 << 1;
            hum1 += 1;
            while (echo == 1);
            continue;
        }
        else if (echo == 0)
        {
            hum1 = hum1 << 1;
            continue;
        }
    }
    /*以下是湿度小数部分的数据读入*/
    if (echo == 0)while (echo == 0);
    delay_10();
    delay_10();
    delay_10();
    delay_10();
    if (echo == 1)
    {
        hum2 = 1;
        while (echo == 1);
    }
    else if (echo == 0)
    {
        hum2 = 0;
    }
    for (i = 2; i <= 8; i++)
    {
        if (echo == 0)while (echo == 0);
        delay_10();
        delay_10();
        delay_10();
        delay_10();
        if (echo == 1)
        {
            hum2 = hum2 << 1;
            hum2 += 1;
            while (echo == 1);
            continue;
        }
        else if (echo == 0)
        {
            hum2 = hum2 << 1;
            continue;
        }
    }
    /*以下是温度整数部分的数据读入*/
    if (echo == 0)while (echo == 0);
    delay_10();
    delay_10();
    delay_10();
    delay_10();
    if (echo == 1)
    {
        tem1 = 1;
        while (echo == 1);
    }
    else if (echo == 0)
    {
        tem1 = 0;
    }
    for (i = 2; i <= 8; i++)
    {
        if (echo == 0)while (echo == 0);
        delay_10();
        delay_10();
        delay_10();
        delay_10();
        if (echo == 1)
        {
            tem1 = tem1 << 1;
            tem1 += 1;
            while (echo == 1);
            continue;
        }
        else if (echo == 0)
        {
            tem1 = tem1 << 1;
            continue;
        }
    }
    /*以下是温度小数部分的数据读入*/
    if (echo == 0)while (echo == 0);
    delay_10();
    delay_10();
    delay_10();
    delay_10();
    if (echo == 1)
    {
        tem2 = 1;
        while (echo == 1);
    }
    else if (echo == 0)
    {
        tem2 = 0;
    }
    for (i = 2; i <= 8; i++)
    {
        if (echo == 0)while (echo == 0);
        delay_10();
        delay_10();
        delay_10();
        delay_10();
        if (echo == 1)
        {
            tem2 = tem2 << 1;
            tem2 += 1;
            while (echo == 1);
            continue;
        }
        else if (echo == 0)
        {
            tem2 = tem2 << 1;
            continue;
        }
    }
    /*以下是校验部分的数据读入*/
    if (echo == 0)while (echo == 0);
    delay_10();
    delay_10();
    delay_10();
    delay_10();
    if (echo == 1)
    {
        check = 1;
        while (echo == 1);
    }
    else if (echo == 0)
    {
        check = 0;
    }
    for (i = 2; i <= 8; i++)
    {
        if (echo == 0)while (echo == 0);
        delay_10();
        delay_10();
        delay_10();
        delay_10();
        if (echo == 1)
        {
            check = check << 1;
            check += 1;
            while (echo == 1);
            continue;
        }
        else if (echo == 0)
        {
            check = check << 1;
            continue;
        }
    }
    if (check == hum1 + hum2 + tem1 + tem2)checkled = 0;
}
void main()
{
    echo = 1;//设置DATA引脚为输出状态并输出高电平
    delay(1500);//开机等待1.5S的时间稳定
    while (1)
    {    
        checkled=1;//校验灯复位
        start();
        read();
        /*温度计算部分,小数位无用*/
        t1a = tem1 / 10;
        t1b = tem1 - t1a * 10;
        t2c = tem2 / 100;
        t2d = tem2 / 10 - t2c * 10;
        /*湿度计算部分,小数位无用*/
        h1a = hum1 / 10;
        h1b = hum1 - h1a * 10;
        h2c = hum2 / 100;
        h2d = hum2 / 10 - h2c * 10;
        if (displaytem == 1)
            while (1)
            {
                P0 = led[t1a];
                P2 = ledx[1];
                delay(5);

                P0 = led[t1b];
                P2 = ledx[2];
                delay(5);

                P0 = 0x9C;
                P2 = ledx[3];
                delay(5);

                P0 = 0xC6;
                P2 = ledx[4];
                delay(5);
                if (k1 == 0) { P0 = 0xff; displaytem = 0; break; }
                else if (k2 == 0) { P0 = 0xff; displaytem = 1; break; }
            }
        else if (displaytem == 0)
            while (1)
            {
                P0 = led[h1a];
                P2 = ledx[1];
                delay(5);

                P0 = led[h1b];
                P2 = ledx[2];
                delay(5);

                P0 = 0x9C;
                P2 = ledx[3];
                delay(5);

                P0 = 0x8E;
                P2 = ledx[4];
                delay(5);
                if (k2 == 0) { P0 = 0xff; displaytem = 1; break; }
                else if (k1 == 0) { P0 = 0xff; displaytem = 0; break; }
            }
        delay(1000);//等待18ms
    }
}

猜你喜欢

转载自blog.csdn.net/echosun1996/article/details/51736949
今日推荐