×
单片机 > 单片机程序设计 > 详情

protues仿真实现DHT11以及51单片机源程序

发布时间:2020-12-25 发布时间:
|

protues仿真DHT11显示温湿度
仿真原理图如下

DHT11单片机源程序如下:

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit Data=P3^6;   //定义数据线

uchar rec_dat[9];   //用于显示的接收数据数组


sbit lcdrs=P3^0;

sbit lcdrw=P3^1;

sbit lcden=P3^2;




void delay(uint n)

{  uint x,y; 

   for(x=n;x>0;x--) 

       for(y=110;y>0;y--); 




void write_com(uchar com)

{

        lcdrs=0;                        //rs=0时输入指令

        P2=com;

        delay(5);

        lcden=1;                        //en=1时读取信息

        delay(5);

        lcden=0;                        //1 -> 0 执行指令

}


void write_dat(uchar dat)

{

        lcdrs=1;                         //rs=1时输入数据

        P2=dat;

        delay(5);

        lcden=1;

        delay(5);

        lcden=0;

}

void init_lcd()

{

        lcden=0;

        lcdrw=0;

        write_com(0x38);          //8位数据,双列,5*7字形

        write_com(0x0c);         //开启显示屏,关光标,光标不闪烁

        write_com(0x06);         //显示地址递增,即写一个数据后,显示位置右移一位

        write_com(0x01);


}

void DHT11_delay_us(uchar n)

{

    while(--n);

}


void DHT11_delay_ms(uint z)

{

   uint i,j;

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

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

}


void DHT11_start()

{

   Data=1;

   DHT11_delay_us(2);

   Data=0;

   DHT11_delay_ms(30);   //延时18ms以上

   Data=1;

   DHT11_delay_us(30);

}


uchar DHT11_rec_byte()      //接收一个字节

{

   uchar i,dat=0;

  for(i=0;i<8;i++)    //从高到低依次接收8位数据

   {          

      while(!Data);   ////等待50us低电平过去

      DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0 

      dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位

      if(Data==1)    //数据为1时,使dat加1来接收数据1

         dat+=1;

      while(Data);  //等待数据线拉低    

    }  

    return dat;

}


void DHT11_receive()      //接收40位的数据

{

    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; 

    DHT11_start();

    if(Data==0)

    {

        while(Data==0);   //等待拉高     

        DHT11_delay_us(40);  //拉高后延时80us

        R_H=DHT11_rec_byte();    //接收湿度高八位  

        R_L=DHT11_rec_byte();    //接收湿度低八位  

        T_H=DHT11_rec_byte();    //接收温度高八位  

        T_L=DHT11_rec_byte();    //接收温度低八位

        revise=DHT11_rec_byte(); //接收校正位


        DHT11_delay_us(25);    //结束


        if((R_H+R_L+T_H+T_L)==revise)      //校正

        {

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

    }

}


/*这里使用lcd1602来显示采集到的数据,lcd1602驱动程序在博主的51单片机系列博文中有详细讲解*/

void main()

{

   uchar i;   

   init_lcd();   //lcd1602初始化

   while(1)

   {   

       DHT11_delay_ms(100);    //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令

       DHT11_receive();

       write_com(0x80);   //从lcd1602第一行第一个位置开始显示

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

       write_dat(rec_dat[i]);   //显示数据   

           write_com(0x80+0x40);

           write_dat(0x2d);

                 write_dat(0x42);

                 write_dat(0x3a);                

……………………



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计