51单片机DHT11的使用方法

DHT11的使用方法:

51单片机DHT11的使用方法_第1张图片

51单片机DHT11的使用方法_第2张图片

0

51单片机DHT11的使用方法_第3张图片

1

51单片机DHT11的使用方法_第4张图片

使用步骤

  1. 初始化
  2. 读取数据
  3. 显示数据

初始化:

out=0;

delay20ms();

out=1;

delay40us();

读取数据

Uchar x,shuju;

If(out==0)

{

While(out==0);

While(out==1);

While(out==0);

X=0;

Delay(30us);

If(out==1)

X=1;

Shuju=shuju<<1;

Shuju=shuju|x;

}

完整程序

#include

#include

#define uint unsigned int

#define uchar unsigned char

uchar code table[]="shidu:";  //把你要显示的东西写成数组

uchar code table1[]="wendu:";

sbit out = P0^0;

sbit shinen=P0^2;                   //使能

sbit RS=P0^4;                        //数据命令选择端

sbit RW=P0^3;                              //读或写的选择

sbit duan=P2^6;                            //数码管的段

sbit wei=P2^7;                              //数码管的位

uchar num;

bit flag=0;

void delay30us(void)   //误差 0us

{

    unsigned char a,b;

    for(b=3;b>0;b--)

        for(a=3;a>0;a--);

}

void delay20ms(void)   //误差 0us

{

    unsigned char a,b;

    for(b=215;b>0;b--)

        for(a=45;a>0;a--);

    _nop_();  //if Keil,require use intrins.h

    _nop_();  //if Keil,require use intrins.h

}

void delay40us(void)   //误差 0us

{

    unsigned char a,b;

    for(b=1;b>0;b--)

        for(a=17;a>0;a--);

}

void delay(uint xms)               //xms等于几就延迟几毫秒

{

    uint i,j;

for(i=xms;i>0;i--)

    for(j=112;j>0;j--);

}

void xieminglin(uchar com)     //写命令

{

RS=0;

RW=0;

P2=com;

delay(5);

shinen=1;

delay(5);

shinen=0;

}

void xieshuju(uchar date)        //写数据

{

RS=1;

RW=0;

P2=date;

delay(5);

shinen=1;

delay(5);

shinen=0;

}

void t11chushihua()

{

out=0;

delay20ms();

out=1;

delay40us(); 

}

uchar dushuju()

{

uchar num=0;

uchar i;

        for(i=0;i<8;i++)

{

        while(out==0);

        flag=0;

        delay30us();

        if(out==1)

        flag=1;

        num=num<<1;

        num=num|flag;

        while(out==1);

}

return num;

}

void chushihua()                            //初始化

{

duan=0;                //关闭数码管的段和位,避免对LCD1602产生影响

wei=0;

shinen=0;

delay(15);

xieminglin(0x38);  //写入0x38设置16X2显示,5X7点阵,8位数据接口

xieminglin(0x01);  //显示清0,数据指针清0

xieminglin(0x06);  //写一个字符后,地址指针自动加1

xieminglin(0x0c);  //设置开显示,不显示光标

}

void lcdshow1(uchar wendu)

{

xieminglin(0x80);           //写入命令,第一行

for(num=0;num<6;num++)     //写入数据,每一位数据之间有延时

{

        xieshuju(table[num]);

        delay(5);

}

xieshuju(wendu/10+0x30);

delay(5);

xieshuju(wendu%10+0x30);

delay(5);

}

void lcdshow2(shidu)

{

xieminglin(0x80+0x40);         //写入命令,第二行

for(num=0;num<6;num++)      //写入数据

{

        xieshuju(table1[num]);

        delay(5);

}

xieshuju(shidu/10+0x30);

delay(5);

xieshuju(shidu%10+0x30);

delay(5);

}

void main()

{      

uchar wendu1=0;

uchar wendu2=0;

uchar shidu1=0;

uchar shidu2=0;

uchar jiaoyan=0;

uchar ture=0;

chushihua();

while(1)

{

        t11chushihua();

        if(out==0)

        {

               while(out==0);

               while(out==1);

               wendu1=dushuju();

               wendu2=dushuju();

               shidu1=dushuju();

               shidu2=dushuju();

               jiaoyan=dushuju();

               ture=wendu1+wendu2+shidu1+shidu2;

               if(jiaoyan==ture)

               {

                      lcdshow1(wendu1);

                      lcdshow2(shidu1);

               }

        }

}

}

你可能感兴趣的