51单片机(STC89C52RC)读取DHT11模块温度湿度信号采集显示数码管

Posted jiyf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机(STC89C52RC)读取DHT11模块温度湿度信号采集显示数码管相关的知识,希望对你有一定的参考价值。

51单片机(STC89C52RC)读取DHT11模块温度湿度信号采集显示数码管

上上周末媳妇问我,家里温度多少,。。。我TM哪知道,租这么个鬼地方,啥也没有,我能猜的出来吗,当然“TM的”的是我现在现在加的。。。^_^,然后就想之前也买了一个树莓派4B也买了一个面包板,再回忆一下大学时曾经所学的知识,算求了,想做个这么个玩意儿,然后,就。。。。。网上一搜,20多块钱就能买一个。。。。但是作为一个程序员,就是这么喜欢折腾。。。也想多赞点儿私房钱。。然后就多要了点儿经费。。O(∩_∩)O哈哈~

我只是一个单纯的软件开发工程师。。对于硬件仅仅局限于大学那点儿知识而且毕业四五年了,早忘的差不多了,都是靠百度和各位大神的分享来去驱动。。。

1.成品展示

左侧温度,右侧湿度   成品和仿真电路有区别,做着过程中发生了变化,就没有再去仿真了,就增加了俩个报警指示灯

技术图片

2.问老婆申请经费(O(∩_∩)O)

技术图片

技术图片

3.下单,购买器件

(这里真是没想到,买个成品可能20块钱,但是你要做一个,各东西都得买。。前前后后下单了3次,这里只贴一张图吧。。,还买俩个万用表、电烙铁。。。。各种器件。。。线材啥的。。。。。反正很多)

技术图片

 

4.绘制电路图仿真Proteus8.6版本

(基本百度就完了,各种各样的都有,这个比较简单)左侧温度,右侧湿度

技术图片

Proteus电路仿真和C语言程序源代码下载

 程序

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P3^6;       //定义数据线
uchar rec_dat[9];   //用于显示的接收数据数组
//数码管数字 0--9
uint led[10]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  



void delay(uint n)
{  
    uint x,y; 
   for(x=n;x>0;x--) 
       for(y=110;y>0;y--); 
} 



void write_com(uchar com)
{
                           //rs=0时输入指令
        P2=com;
        delay(5);

}



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


//延时程序 单位ms
void delay222(unsigned int x)
{
    unsigned int i,j;

    for(i=x;i>0;i--)
        for(j=110;j>0;j--);
}


//设置温度值
void SetTemperature(uchar value)
{

    //取出个位、十位数字
   int unitPlace = value/1%10;
   int tenPlace = value/10%10;
    
    
    P0 = led[tenPlace];
    P2 = 0x80;
    delay222(3);
    P2 = 0x00;
          
    P0 = led[unitPlace];
    P2 = 0x40;
    delay222(3);
    P2 = 0x00;
}

//设置湿度值
void SetHumidity(uchar value)
{

    //取出个位、十位数字
   int unitPlace = value/1%10;
   int tenPlace = value/10%10;
    
    
    P0 = led[tenPlace];
    P2 = 0x20;
    delay222(3);
    P2 = 0x00;
          
    P0 = led[unitPlace];
    P2 = 0x10;
    delay222(3);
    P2 = 0x00;
}
void DHT11_receive()      //接收40位的数据
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; 
    int number; //闪烁频率
    int count2;
    uchar tempValue;
    uchar  humidityValue;


    number = 20;
    count2 = 0;

    DHT11_start();



    count2 = 0;
    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‘;




        //读取温度湿度
             tempValue = RH;
             humidityValue = TH;
            
            while(count2 < number)
            {
                //设置温度
                SetTemperature(tempValue);
                //设置湿度
                SetHumidity(humidityValue);

                count2++;
            }
    
            count2=0;

    }
}



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

   while(1)
   {   

       DHT11_receive();
           
   }
}

 

5.面包板调试电路和程序  

买了俩个红色的2位共阳极数码管10脚的,结果没有接限流电阻,烧坏了一个,被迫又一次下单购买,结果购买错了,买了俩个绿色的共阴极18脚的,太恶心了,焊接过得人估计能体会

技术图片

技术图片

6.器件部署和电路板焊接

焊接的过程中,发现还可以增加个报警指示灯。于是又焊接了俩个报警指示灯连接到了P1.0(温度)和P1.1(湿度)

因为不会绘制pcb布线,就大概摆了一下,然后就开始焊接了。。。

技术图片

 

技术图片

技术图片

技术图片

实不相瞒,太恶心了,就因为买错了,买了个共阴极18脚的2位数码管。。就焊接成这样了,水平有限大神直接飘过吧。。。。

7.成品展示

左侧是温度,右侧是湿度显示,然后因为数码管换了,所以程序也改了,并且新增了个报警指示灯

 技术图片

技术图片

电路大概介绍

技术图片

 

以上是关于51单片机(STC89C52RC)读取DHT11模块温度湿度信号采集显示数码管的主要内容,如果未能解决你的问题,请参考以下文章

51单片机定时器设置入门 (STC89C52RC)

8051单片机实战分析(以STC89C52RC为例) | 11 - 定时器中断的使用

STC89C52RC单片机额外篇 | 03 - 认识C51编译器支持的数据类型

8051单片机实战分析(以STC89C52RC为例) | 10 - 外部中断的使用

8051单片机实战分析(以STC89C52RC为例) | 12 - 串行口中断的使用

STC89C52RC单片机额外篇 | 04 - 认识头文件<intrins.h>与_nop_函数