找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6517|回复: 10
收起左侧

基于51单片机的dht11温湿度采集报警系统

  [复制链接]
ID:89606 发表于 2020-3-17 13:11 | 显示全部楼层 |阅读模式
本帖最后由 liujia21 于 2020-3-22 00:31 编辑

基于51单片机的温湿度采集报警系统,用dht11采集温湿度,液晶实时显示温湿度,三个按键,第一个按键是设置键,第二个按键是加,第三个是减,当实时的温湿度超过最高或者低于最低,蜂鸣器会报警。完整的程序和电路图在压缩包里面,51程序用keil4打开,电路图是altium designer画的,下面有源文件。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^0;   
uchar rec_dat[13]="000000000000";   
extern void InitLcd1602();
uchar showset[16]="000000000000";
int wendu=0;
int shidu=0;
sbit shezhi=P2^0;
sbit jia=P2^1;
sbit jian=P2^2;
sbit beep=P3^7;
int wendul=5;
int wenduh=30;
int shidul=30;
int shiduh=60;
int change=0;
uchar key_can;  
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
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(20);   
   Data=1;
   DHT11_delay_us(30);
}
uchar DHT11_rec_byte()   
{
   uchar i,dat=0;
  for(i=0;i<8;i++)   
   {         
      while(!Data);   
      DHT11_delay_us(8);   
      dat<<=1;         
      if(Data==1)   
         dat+=1;
      while(Data);      
    }  
    return dat;
}
void DHT11_receive()   
{
    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);  
        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;
        }
    shidu=RH;
    wendu=TH;
    rec_dat[0]='H';
    rec_dat[1]=':';
    rec_dat[2]='0'+(RH/10);
        rec_dat[3]='0'+(RH%10);
        rec_dat[4]='R';
        rec_dat[5]='H';
        rec_dat[6]=' ';
        rec_dat[7]=' ';
   
    rec_dat[8]='T';
    rec_dat[9]=':';
        rec_dat[10]='0'+(TH/10);
        rec_dat[11]='0'+(TH%10);
        rec_dat[12]='C';
    }
}

void main()
{   
   InitLcd1602();  
   while(1)
   {   
       DHT11_delay_ms(500);   
       DHT11_receive();
   
    if(shezhi==0)
    {
     DHT11_delay_ms(2);
     if(shezhi==0)
    {
      change++;
      if(change>3)
      {
      change=0;
      
      }
     
      }
     }
   
    if(change==0)
    {
     if(jia==0)
     {
      DHT11_delay_ms(2);
        if(jia==0)
        {
        shidul++;
       if(shidul>99)
       {
        shidul=99;
        
       }
     
        }
        }
      
      if(jian==0)
     {
      DHT11_delay_ms(2);
        if(jian==0)
        {
        shidul--;
       if(shidul<0)
       {
        shidul=0;
        
       }
     
        }
        }
    }
   
    if(change==1)
    {
     if(jia==0)
     {
      DHT11_delay_ms(2);
        if(jia==0)
        {
        shiduh++;
       if(shiduh>99)
       {
        shiduh=99;
        
       }
     
        }
        }
      
      if(jian==0)
     {
      DHT11_delay_ms(2);
        if(jian==0)
        {
        shiduh--;
       if(shiduh<0)
       {
        shiduh=0;
        
       }
     
        }
        }
    }
   
   
   
    if(change==2)
    {
     if(jia==0)
     {
      DHT11_delay_ms(2);
        if(jia==0)
        {
        wendul++;
       if(wendul>99)
       {
        wendul=99;
        
       }
     
        }
        }
      
      if(jian==0)
     {
      DHT11_delay_ms(2);
        if(jian==0)
        {
        wendul--;
       if(wendul<0)
       {
        wendul=0;
        
       }
     
        }
        }
    }
   
    if(change==3)
    {
     if(jia==0)
     {
      DHT11_delay_ms(2);
        if(jia==0)
        {
        wenduh++;
       if(wenduh>99)
       {
        wenduh=99;
        
       }
     
        }
        }
      
      if(jian==0)
     {
      DHT11_delay_ms(2);
        if(jian==0)
        {
        wenduh--;
       if(wenduh<0)
       {
        wenduh=0;
        
       }
     
        }
        }
    }

      showset[0]='L';
    showset[1]=':';
    showset[2]='0'+(shidul/10);
        showset[3]='0'+(shidul%10);
   
      showset[4]='H';
    showset[5]=':';
    showset[6]='0'+(shiduh/10);
        showset[7]='0'+(shiduh%10);
   
    showset[8]='L';
    showset[9]=':';
        showset[10]='0'+(wendul/10);
        showset[11]='0'+(wendul%10);
       showset[12]='L';
    showset[13]=':';
        showset[14]='0'+(wenduh/10);
        showset[15]='0'+(wenduh%10);
   
    if((shidu< shidul )|| (shidu>shiduh))
    {
     beep=0;
     
    }
    else if((wendu< wendul )|| (wendu>wenduh))
    {
     beep=0;
    }
    else
    {
     beep=1;
    }
    LcdShowStr(0,1,showset);  //显示设定的最高和最低湿度
   LcdShowStr(0,0,rec_dat);  //显示实时湿度         
   }
}
IMG_20200316_221927.jpg

基于51单片机的dht11温湿度采集程序.zip

48.96 KB, 下载次数: 248, 下载积分: 黑币 -5

基于51单片机的dht11温湿度采集电路.zip

191.56 KB, 下载次数: 164, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:706798 发表于 2020-3-26 18:26 | 显示全部楼层
为啥第一行显示不出来
回复

使用道具 举报

ID:710049 发表于 2020-3-31 00:23 | 显示全部楼层
52hz92 发表于 2020-3-26 18:26
为啥第一行显示不出来

数据口得改  p1.1
回复

使用道具 举报

ID:631911 发表于 2020-5-5 12:18 | 显示全部楼层
楼主,为啥不显示呢,小白请指导
回复

使用道具 举报

ID:724046 发表于 2020-5-14 16:47 | 显示全部楼层
不能显示呀,能帮忙解决一下吗
回复

使用道具 举报

ID:321836 发表于 2020-5-15 17:19 | 显示全部楼层
不错的,谢谢楼主发的资料
回复

使用道具 举报

ID:752951 发表于 2020-5-16 15:39 来自手机 | 显示全部楼层
有proteus仿真图吗
回复

使用道具 举报

ID:341546 发表于 2020-10-15 22:18 | 显示全部楼层
可以实现吗
回复

使用道具 举报

ID:341546 发表于 2020-10-15 23:05 | 显示全部楼层
为什么仿真不出来呀?
回复

使用道具 举报

ID:831896 发表于 2020-10-19 20:17 | 显示全部楼层
so nice
回复

使用道具 举报

ID:861045 发表于 2020-12-15 23:50 | 显示全部楼层
我用的AT89C52在PROTEUS上仿真,引脚都改好了,LCD上第二行能很顺利显示,第一行就是一直在显示rec_dat的初始值,研究之后发现似乎是DHT11输出过来的数据一直是零网上说时序有问题我又不会调时序,它到底是不是DHT11数据的事,求助求助
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表