找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4842|回复: 1
收起左侧

单片机DHT11温湿度系统程序设计-带仿真

[复制链接]
ID:519003 发表于 2019-6-12 15:27 | 显示全部楼层 |阅读模式
制作出来的实物图如下:

实物图

实物图


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真电路图

仿真电路图

本文通过使用
AT89C52单片机、DHT11传感器模块、1602液晶显示屏模块以及继电器控制模块。简单明了的实现的温湿度的控制要求。DHT11数字温湿度传感器把采集到的温湿度数据传给单片机。经过单片机的处理。准确的显示到液晶屏上。如果温度超过阀值,将会驱动继电器工作。继电器将驱动负载相应的工作。在整个系统的工作中,测控系统测得的温湿度参数通过液晶显示屏显示出来供用户参考。仿真结果表明,该系统完全能够对仓库的温湿度进行监控并对过程中出现的偏差进行调节。

硬件主要以AT89C52型单片机为核心,通过LCD1602实时地显示传感器DHT11检测到的温湿度值,阀值可以通过AT24C02存储,实现断电保存。
#include <reg52.h>
#include "1602.h"
#include "dht.h"
#include "2402.h"

//定义三个LED灯
sbit Led_qushi=P1^6;           //去湿灯
sbit Led_jiangwen=P1^5;             //降温灯
sbit Led_shengwen=P1^4;            //升温灯
sbit Key_TH1 = P3^2;
sbit Key_TH2 = P3^3;
sbit Key_HH1 = P3^4;
sbit Key_HH2 = P3^5;

//定义标识
volatile bit FlagStartRH = 0;  //开始温湿度转换标志
volatile bit FlagKeyPress = 0; //有键按下


//定义温湿度传感器用外部变量
extern U8 U8FLAG,k;
extern U8 U8count,U8temp;
extern U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
extern U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
extern U8 U8comdata;
extern U8  count,count_r;

U16 temp;
S16 temperature, humidity;
S16 idata TH, HH; //温度上限和湿度上限
char * pSave;
U8 keyvalue, keyTH1, keyTH2, keyHH1, keyHH2;

//定义变量
U16 RHCounter;


//数据初始化
void Data_Init()
{
   RHCounter = 0;
   Led_qushi = 1;
   Led_jiangwen =1;
   Led_shengwen =1;
   TH = 40;
   HH = 85;
   keyvalue = 0;
   keyTH1 = 1;
   keyTH2 = 1;
   keyHH1 = 1;
   keyHH2 = 1;

}

//定时器0初始化
void Timer0_Init()
{
       ET0 = 1;        //允许定时器0中断
       TMOD =1;       //定时器工作方式选择
       TL0 =0x06;     
       TH0 =0xf8;     //定时器赋予初值
       TR0 = 1;        //启动定时器
}

//定时器0中断
void Timer0_ISR (void) interrupt 1 using 0
{
       TL0 = 0x06;
       TH0 =0xf8;     //定时器赋予初值

       //每2秒钟启动一次温湿度转换
    RHCounter ++;
    if (RHCounter>= 1000)
    {
       FlagStartRH= 1;
          RHCounter = 0;
    }
}

//存入设定值、
void Save_Setting()
{
   pSave =  (char *)&TH;    //地址低位对应低8位,高位对应高8位
   wrteeprom(0,*pSave);      //存温度上限值TH低8位
   DELAY(500);
   pSave ++;
   wrteeprom(1,*pSave);      //存温度上限值TH高8位
   DELAY(500);
   pSave =  (char *)&HH;
   wrteeprom(2,*pSave);      //存湿度上限值RH低8位
   DELAY(500);
   pSave ++;
   wrteeprom(3,*pSave);      //存湿度上限值RH高8位
   DELAY(500);

}

//载入设定值、
void Load_Setting()
{
   pSave =  (char *)&TH;
   *pSave++ =rdeeprom(0);
   *pSave =rdeeprom(1);
   pSave = (char*)&HH;
   *pSave++ =rdeeprom(2);
   *pSave =rdeeprom(3);
   if((TH>99)||(TH<0)) TH = 40;
   if((HH>99)||(HH<0)) HH = 85;
}

void KeyProcess(uint num)
{
   switch (num)
   {
      case 1:
            if (TH<99) TH++;
            L1602_char(1, 15, TH/10+48);
            L1602_char(1, 16, TH%10+48);
            break;
         case 2:
            if (TH>1) TH--;
            L1602_char(1, 15, TH/10+48);
            L1602_char(1, 16, TH%10+48);
            break;
         case 3:
            if (HH<99) HH++;
            L1602_char(2, 15, HH/10+48);
            L1602_char(2, 16, HH%10+48);
            break;
         case 4:
            if (HH>1) HH--;
            L1602_char(2, 15, HH/10+48);
            L1602_char(2, 16, HH%10+48);
            break;
         default:
            break;
   }
   Save_Setting();

}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
***********************************************************************/
void main()
{
    U16 i, j,testnum;

    EA = 0;

       Timer0_Init();  //定时器0初始化

    Data_Init();
       EA = 1;

       L1602_init();
       L1602_string(1,1,"Welcome to T&H   ");
       L1602_string(2,1,"Control System!  ");
       //延时
       for(i=0;i<500;i++)
          for (j=0;j<1000;j++)
          {;}
    //清屏
       L1602_string(1,1,"                ");
       L1602_string(2,1,"                ");
   L1602_string(1,1,"Tem:   C  TH:");
       L1602_string(2,1,"Hum:    % HH:");

    //载入温度上限和湿度上限设定值
       Load_Setting();
       L1602_char(1,15, TH/10+48);
       L1602_char(1,16, TH%10+48);
       L1602_char(2,15, HH/10+48);
       L1602_char(2,16, HH%10+48);


       while(1)
       {
       //温湿度转换标志检查
               if (FlagStartRH == 1)
               {
                   TR0 = 0;
            testnum = RH();
                     FlagStartRH = 0;
                      TR0 = 1;
             //读出温湿度,只取整数部分
                      humidity = U8RH_data_H;
                      temperature = U8T_data_H;
                     //显示温湿度
                      L1602_int(1,5,temperature);
                   L1602_int(2,5,humidity);   
              }
              //温湿度控制
              if(temperature > TH) Led_jiangwen = 0;
              elseLed_jiangwen = 1;                        //降温
              if(humidity > HH) Led_qushi = 0;
              elseLed_qushi = 1;                                    //去湿

              //键盘查询,在弹起时响应
              if((Key_TH1)&&(keyTH1==0)) {FlagKeyPress = 1; keyvalue = 1;}
        else if((Key_TH2)&&(keyTH2==0)) {FlagKeyPress = 1; keyvalue = 2;}
        else if((Key_HH1)&&(keyHH1==0)) {FlagKeyPress = 1; keyvalue = 3;}
        else if((Key_HH2)&&(keyHH2==0)) {FlagKeyPress = 1; keyvalue = 4;}
              if(FlagKeyPress == 1)
              {
          KeyProcess(keyvalue);
          FlagKeyPress = 0;           
              }
        if (!Key_TH1)keyTH1 = 0;
              elsekeyTH1 = 1;
        if(!Key_TH2) keyTH2 = 0;
              elsekeyTH2 = 1;
        if(!Key_HH1) keyHH1 = 0;
              elsekeyHH1 = 1;
        if(!Key_HH2) keyHH2 = 0;
              elsekeyHH2 = 1;

       }     
}
0.png

全部资料51hei下载地址:
基于单片机的温湿度系统设计.zip (257.92 KB, 下载次数: 110)

评分

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

查看全部评分

回复

使用道具 举报

ID:720981 发表于 2020-4-2 16:12 | 显示全部楼层
在下新手,试着用这个程序练习。发现KEIL程序找不到1602、DHT和2402头文件。问一下您的头文件是自己编写的还是在网上下载的,方便发一下吗?谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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