找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 562|回复: 1
打印 上一主题 下一主题
收起左侧

基于单片机DHT11湿度测量与控制-CO2光照报警系统程序和仿真

[复制链接]
跳转到指定楼层
楼主
一、系统方案
1、本设计采用这51单片机作为主控器。
2、DHT11温湿度、CO2、光照强度送到液晶1602显示。
3、按键设置报警值。
4、蜂鸣器报警。


二、硬件设计
原理图如下:

三、单片机软件设计
  1. 1、首先是系统初始化
  2. //初始化LCD************************************************************
  3. void LCD_Initial()
  4. {
  5.     E=0;
  6.     LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
  7.     LCD_Write(LCD_COMMAND,0x38);
  8.     LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
  9.     LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  10.     LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
  11. }
  12. 2、液晶显示程序
  13. //1602程序
  14. //内部等待函数*************************************************************
  15. unsigned char LCD_Wait(void)
  16. {
  17.     RS=0;
  18.     RW=1;    _nop_();
  19.     E=1;    _nop_();           
  20.     E=0;
  21.     return DBPort;  
  22. }
  23. //向LCD写入命令或数据********************************************************
  24. #define LCD_COMMAND         0      // Command
  25. #define LCD_DATA            1      // Data
  26. #define LCD_CLEAR_SCREEN    0x01      // 清屏
  27. #define LCD_HOMING          0x02      // 光标返回原点
  28. void LCD_Write(bit style, unsigned char input)
  29. {
  30.     E=0;
  31.     RS=style;
  32.     RW=0;        _nop_();
  33.     DBPort=input;   _nop_();//注意顺序
  34.     E=1;        _nop_();//注意顺序
  35.     E=0;        _nop_();
  36.     LCD_Wait();
  37. }
  38. 3、按键程序
  39. void key()
  40. {
  41.    uchar m;
  42.    if (k1==0)                               //调整按键检测
  43.    {
  44.       delay(10);
  45.       if (k1==0)
  46.       {
  47.          LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  48.                                 presskeynum++;
  49.          if(presskeynum==8)
  50.                                  {
  51.          presskeynum=0;
  52.                                 
  53.                                  }
  54.          while(k1==0);
  55.          
  56.       }
  57.    }
  58.    if(presskeynum==1)//温度上限设置
  59.    {
  60.       if(k2==0)// 加
  61.       {
  62.          delay(300);
  63.          temp_high++;
  64.          if (temp_high>99)
  65.          temp_high=0;
  66.          if (temp_high<0)
  67.          temp_high=99;
  68.          while(k2==0);       //加上此句必须松按键才处理
  69.       }
  70.       if(k3==0)//减
  71.       {
  72.          delay(300);
  73.          temp_high--;
  74.          if (temp_high>99)
  75.          temp_high=0;
  76.          if (temp_high<0)
  77.          temp_high=99;
  78.          while(k3==0);       //加上此句必须松按键才处理
  79.       }
  80.    }
  81.    if(presskeynum==2)//温度下限设置
  82.    {
  83.       if(k2==0)// 加
  84.       {
  85.          delay(300);
  86.          temp_low++;
  87.          if (temp_low>99)
  88.          temp_low=0;
  89.          if (temp_low<0)
  90.          temp_low=99;
  91.          while(k2==0);
  92.       }
  93.       if(k3==0)
  94.       {
  95.          delay(300);
  96.          temp_low--;
  97.          if (temp_low>99)
  98.          temp_low=0;
  99.          if (temp_low<0)
  100.          temp_low=99;
  101.          while(k3==0);
  102.       }
  103.    }
  104.    if(presskeynum==3)//湿度上限设置
  105.    {
  106.       if(k2==0)// 加
  107.       {
  108.           delay(300);
  109.           humi_high++;
  110.           if (humi_high>99)
  111.           humi_high=0;
  112.           if (humi_high<0)
  113.           humi_high=99;
  114.           while(k2==0);
  115.       }
  116.       if(k3==0)
  117.       {
  118.           delay(300);
  119.           humi_high--;
  120.           if (humi_high>99)
  121.           humi_high=0;
  122.           if (humi_high<0)
  123.           humi_high=99;
  124.           while(k3==0);
  125.       }
  126.    }
  127.    if(presskeynum==4)//湿度下限设置
  128.    {
  129.       if(k2==0)//加
  130.       {
  131.           delay(300);
  132.           humi_low++;
  133.           if (humi_low>99)
  134.           humi_low=0;
  135.           if (humi_low<0)
  136.           humi_low=99;
  137.           while(k2==0);
  138.       }
  139.       if(k3==0)// 减
  140.       {
  141.           delay(300);
  142.           humi_low--;
  143.           if (humi_low>99)
  144.           humi_low=0;
  145.           if (humi_low<0)
  146.           humi_low=99;
  147.           while(k3==0);
  148.       }
  149.    }
  150.          if(presskeynum==5)//湿度下限设置
  151.    {
  152.       if(k2==0)//加
  153.       {
  154.           delay(300);
  155.           gh++;
  156.           if (gh>99)
  157.           gh=0;
  158.       
  159.           while(k2==0);
  160.       }
  161.       if(k3==0)// 减
  162.       {
  163.           delay(300);
  164.          gh--;
  165.         
  166.          gh=99;
  167.           while(k3==0);
  168.       }
  169.    }
  170.          if(presskeynum==6)//湿度下限设置
  171.    {
  172.       if(k2==0)//加
  173.       {
  174.           delay(300);
  175.          gl++;
  176.           if (gl>99)
  177.          gl=0;
  178.          
  179.           humi_low=99;
  180.           while(k2==0);
  181.       }
  182.       if(k3==0)// 减
  183.       {
  184.           delay(300);
  185.           gl--;
  186.         
  187.           if (gl<0)
  188.          gl=99;
  189.           while(k3==0);
  190.       }
  191.    }
  192.          if(presskeynum==7)//湿度下限设置
  193.    {
  194.       if(k2==0)//加
  195.       {
  196.           delay(300);
  197.           CO2++;
  198.           if (CO2>99)
  199.          CO2=0;
  200.          
  201.           while(k2==0);
  202.       }
  203.       if(k3==0)// 减
  204.       {
  205.           delay(300);
  206.           CO2--;
  207.          
  208.           if (CO2<0)
  209.           CO2=99;
  210.           while(k3==0);
  211.       }
  212.    }
  213.         
  214.    if(k4==0)// 退出键
  215.    {
  216.       delay(10);
  217.       if(k4==0)
  218.       {
  219.           while(k4==0);
  220.                                 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);                           //清屏
  221.           presskeynum=0;
  222.           temp_humi_cache[0]=temp_high;
  223.      
  224.           temp_humi_cache[1]=temp_low;
  225.      
  226.      
  227.           temp_humi_cache[2]=humi_high;
  228.           temp_humi_cache[3]=humi_low;
  229.          
  230.                                 
  231.                                    temp_humi_cache[4]=gh;
  232.         
  233.           temp_humi_cache[5]=gl;
  234.       
  235.           temp_humi_cache[6]=CO2;
  236.          
  237.                                 
  238.                                 
  239.                                        
  240.                                 
  241.           for(m=0;m<=6;m++)
  242.           {  
  243.                WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]);              //设定值写入24c02
  244.                                                 
  245.           }
  246.          
  247.        }
  248.    
  249.         
  250.          }
  251. }
  252. 4、核心算法程序
  253. unsigned char adc0832(unsigned char CH)
  254. {
  255.      unsigned char i,test,adval;
  256.      adval = 0x00;
  257.      test = 0x00;
  258.      Clk = 0;      
  259.      DATI = 1;
  260.      _nop_();
  261.      CS = 0;
  262.      _nop_();
  263.      Clk = 1;
  264.      _nop_();
  265.     if ( CH == 0x00 )      
  266.     {
  267.        Clk = 0;
  268.        DATI = 1;      
  269.        _nop_();
  270.        Clk = 1;
  271.        _nop_();
  272.        Clk = 0;
  273.        DATI = 0;      
  274.        _nop_();
  275.        Clk = 1;
  276.        _nop_();
  277.      }
  278.      else
  279.      {
  280.        Clk = 0;
  281.        DATI = 1;      
  282.        _nop_();
  283.        Clk = 1;
  284.        _nop_();
  285.        Clk = 0;
  286.        DATI = 1;      
  287.        _nop_();
  288.        Clk = 1;
  289.        _nop_();
  290.      }
  291.       Clk = 0;
  292.       DATI = 1;
  293.      for( i = 0;i < 8;i++ )      
  294.      {
  295.        _nop_();
  296.        adval <<= 1;
  297.        Clk = 1;
  298.        _nop_();
  299.        Clk = 0;
  300.        if (DATO)
  301.           adval |= 0x01;
  302.       else
  303.           adval |= 0x00;
  304.     }
  305.       for (i = 0; i < 8; i++)      
  306.       {
  307.            test >>= 1;
  308.            if (DATO)
  309.               test |= 0x80;
  310.            else
  311.               test |= 0x00;
  312.           _nop_();
  313.           Clk = 1;
  314.           _nop_();
  315.           Clk = 0;
  316.       }
  317.       if (adval == test)      
  318.            dat = test;
  319.       _nop_();
  320.        CS = 1;        
  321.        DATO = 1;
  322.        Clk = 1;
  323.       return dat;
  324. }
复制代码

四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1112098 发表于 2024-4-16 09:45 | 只看该作者
您好,可以在附件分享一下电路图设计和仿真图设计吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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