找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6274|回复: 8
收起左侧

单片机大棚温湿度监测系统的Proteus仿真程序

  [复制链接]
ID:853928 发表于 2020-12-7 20:40 | 显示全部楼层 |阅读模式
仅供学习师兄参考,文件中包括原理图和程序,有问题评论
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

单片机源程序如下:
  1. #include "common.h"
  2. #include "lcd1602.h"
  3. #include "dht.h"

  4. extern unsigned char U8RH_data_H;
  5. extern unsigned char U8T_data_H;

  6. sbit key1 = P1^0;//设置键
  7. sbit key2 = P1^1;//加键
  8. sbit key3 = P1^2;//减键

  9. sbit relay1 = P1^6;//加热继电器
  10. sbit relay2 = P1^7;//降温继电器
  11. sbit relay3 = P3^6;//加湿继电器
  12. sbit relay4 = P3^7;//除湿继电器

  13. sbit beep = P2^0;//蜂鸣器

  14. unsigned char tl = 10,th = 35,hl = 15,hh = 70;//温湿度上下限初始值
  15. unsigned char setn = 0;//设置标志

  16. void display_alarm()//显示报警值
  17. {
  18.          lcd_write_char(4,0,tl/10+0x30);
  19.          lcd_write_char(5,0,tl%10+0x30);
  20.          lcd_write_char(13,0,th/10+0x30);
  21.          lcd_write_char(14,0,th%10+0x30);

  22.          lcd_write_char(4,1,hl/10+0x30);
  23.          lcd_write_char(5,1,hl%10+0x30);
  24.          lcd_write_char(13,1,hh/10+0x30);
  25.          lcd_write_char(14,1,hh%10+0x30);
  26. }

  27. void keyscan()
  28. {
  29.         if(key1 == 0)//设置键按下
  30.         {
  31.                  delay_ms(10);
  32.                 if(key1 == 0)
  33.                 {
  34.                         beep = 0;
  35.                         delay_ms(100);
  36.                         beep = 1;
  37.                          while(key1 == 0);//等待按键松开
  38.                         setn++;
  39.                         if(setn > 4)//按下次数超过4次,退出设置
  40.                         {
  41.                                  setn = 0;
  42.                                 lcd_write_com(0x0c);//关闭光标
  43.                                 lcd_write_str(0,0,"Tem:  C  Hum:  %");
  44.                           lcd_write_str(0,1,"                ");
  45.                         }
  46.                         if(setn == 1)//设置温度下限
  47.                         {
  48.                                  lcd_write_str(0,0,"Tml:  C  Tmh:  C");
  49.                           lcd_write_str(0,1,"Hml:  %  Hmh:  %");

  50.                                 display_alarm();
  51.                                 lcd_write_com(0x80+5);
  52.                                 lcd_write_com(0x0f);
  53.                         }
  54.                         if(setn == 2)//温度上限
  55.                         {
  56.                                 lcd_write_com(0x80+14);
  57.                                 lcd_write_com(0x0f);
  58.                         }
  59.                         if(setn == 3)//湿度下限
  60.                         {
  61.                                 lcd_write_com(0x80+0x40+5);
  62.                                 lcd_write_com(0x0f);
  63.                         }
  64.                         if(setn == 4)//湿度上限
  65.                         {
  66.                                 lcd_write_com(0x80+0x40+14);
  67.                                 lcd_write_com(0x0f);
  68.                         }
  69.                 }
  70.         }
  71.         if(key2 == 0)//加键按下
  72.         {
  73.                  delay_ms(10);
  74.                 if(key2 == 0)
  75.                 {
  76.                         beep = 0;
  77.                         delay_ms(100);
  78.                         beep = 1;
  79.                          while(key2 == 0);
  80.                     if(setn == 1)
  81.                         {
  82.                                  if(th - tl > 1)//上限必须大于下限,下限才能加
  83.                                 tl ++;

  84.                                 display_alarm();
  85.                                 lcd_write_com(0x80+5);
  86.                                 lcd_write_com(0x0f);
  87.                         }
  88.                         if(setn == 2)
  89.                         {
  90.                             if(th < 99)//最大到99
  91.                                 th++;
  92.                                 display_alarm();
  93.                                 lcd_write_com(0x80+14);
  94.                                 lcd_write_com(0x0f);
  95.                         }
  96.                         if(setn == 3)
  97.                         {
  98.                             if(hh - hl > 1)//上限必须大于下限,下限才能加
  99.                                 hl++;
  100.                                 display_alarm();
  101.                                 lcd_write_com(0x80+0x40+5);
  102.                                 lcd_write_com(0x0f);
  103.                         }
  104.                         if(setn == 4)
  105.                         {
  106.                             if(hh < 99)//最大到99
  107.                                 hh++;
  108.                                 display_alarm();
  109.                                 lcd_write_com(0x80+0x40+14);
  110.                                 lcd_write_com(0x0f);
  111.                         }
  112.                 }
  113.         }
  114.         if(key3 == 0)//减键按下
  115.         {
  116.                  delay_ms(10);
  117.                 if(key3 == 0 )
  118.                 {
  119.                         beep = 0;
  120.                         delay_ms(100);
  121.                         beep = 1;
  122.                          while(key3 == 0);
  123.                         if(setn == 1)
  124.                         {
  125.                                  if(tl > 0)//最小到0
  126.                                 tl --;

  127.                                 display_alarm();
  128.                                 lcd_write_com(0x80+5);
  129.                                 lcd_write_com(0x0f);
  130.                         }
  131.                         if(setn == 2)
  132.                         {
  133.                             if(th - tl > 1)//上限必须大于下限,上限才能减
  134.                                 th--;
  135.                                 display_alarm();
  136.                                 lcd_write_com(0x80+14);
  137.                                 lcd_write_com(0x0f);
  138.                         }
  139.                         if(setn == 3)
  140.                         {
  141.                             if(hl > 0)
  142.                                 hl--;
  143.                                 display_alarm();
  144.                                 lcd_write_com(0x80+0x40+5);
  145.                                 lcd_write_com(0x0f);
  146.                         }
  147.                         if(setn == 4)
  148.                         {
  149.                             if(hh - hl > 1)//上限必须大于下限,上限才能减
  150.                                 hh--;
  151.                                 display_alarm();
  152.                                 lcd_write_com(0x80+0x40+14);
  153.                                 lcd_write_com(0x0f);
  154.                         }
  155.                 }
  156.         }
  157. }

  158. void main()
  159. {
  160.           unsigned int count;
  161.           short temperature;
  162.           short humidity;

  163.           lcd_init();//1602液晶初始化
  164.           lcd_write_str(0,0,"Tem:  C  Hum:  %");
  165.           lcd_write_str(0,1,"                ");
  166.           do
  167.                 {
  168.                         RH();delay_ms(100);
  169.           }while(U8RH_data_H==0&&U8T_data_H==0);
  170.           while(1)
  171.           {
  172.              keyscan();//按键扫描
  173.                  if(count++>=10 && setn == 0)
  174.                  {
  175.                                  count=0;
  176.                                  RH();
  177.                          
  178.                            //读出温湿度,只取整数部分
  179.                humidity = U8RH_data_H;
  180.                temperature = U8T_data_H;
  181.                          
  182.                                  lcd_write_char(4,0,temperature/10+0x30);
  183.                                  lcd_write_char(5,0,temperature%10+0x30);
  184.                                  lcd_write_char(13,0,humidity/10+0x30);
  185.                                  lcd_write_char(14,0,humidity%10+0x30);

  186.                                  if(humidity>=hh)//湿度高于上限,除湿继电器开启。否则关闭
  187.                                          relay4 = 0;
  188.                                  else
  189.                                          relay4 = 1;
  190.                                  if(humidity<=hl)//湿度低于下限,加湿继电器开启。否则关闭
  191.                                          relay3 = 0;
  192.                                  else
  193.                                          relay3 = 1;
  194.                           if(temperature>=th)//温度高于上限,降温继电器开启。否则关闭
  195.                                         relay2 = 0;
  196.                                 else
  197.                                         relay2 = 1;
  198.                                 if(temperature<=tl)//温度低于下限,加热继电器开启。否则关闭
  199.                                         relay1 = 0;
  200.                                 else
  201.                                         relay1 = 1;
  202.                            if(humidity>=hh || humidity<=hl || temperature>=th || temperature<=tl)//温湿度超限
  203.                                  {
  204.                                                 beep = ~beep;//蜂鸣器报警
  205.                                           delay_ms(100);
  206.                                  }
  207.                                  else
  208.                                  {
  209.                                                 beep = 1;
  210.                                  }
  211.                  }          
  212.            }
  213. }
复制代码

所有资料51hei提供下载:
仿真.rar (75.32 KB, 下载次数: 258)

评分

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

查看全部评分

回复

使用道具 举报

ID:437930 发表于 2023-4-20 10:18 | 显示全部楼层
感谢分享,51黑因你而精彩
回复

使用道具 举报

ID:1028184 发表于 2023-3-5 02:59 | 显示全部楼层
为啥我仿真后,显示模块,没有亮呢,求大佬解答
025736.png
回复

使用道具 举报

ID:909346 发表于 2022-12-19 13:38 | 显示全部楼层
heloo.. 发表于 2022-12-19 10:58
应该是设置了温度下限

DHT11的湿度测量范围是20到90
回复

使用道具 举报

ID:909346 发表于 2022-12-19 10:58 | 显示全部楼层
cool2001 发表于 2021-11-18 13:15
大佬为什么湿度最低只能到20就不能再往下了

应该是设置了温度下限
回复

使用道具 举报

ID:968456 发表于 2021-11-18 13:15 | 显示全部楼层
大佬为什么湿度最低只能到20就不能再往下了
回复

使用道具 举报

ID:966373 发表于 2021-9-15 22:15 | 显示全部楼层
long919 发表于 2021-5-6 20:08
仿真文件要如何打开呢?

proteus打开呀
回复

使用道具 举报

ID:328014 发表于 2021-5-6 21:24 | 显示全部楼层
long919 发表于 2021-5-6 20:08
仿真文件要如何打开呢?

百度安装Proteus8.8白菜直装版,然后双击就打开了,如图,你看我已经打开了
1.png
回复

使用道具 举报

ID:915856 发表于 2021-5-6 20:08 | 显示全部楼层
仿真文件要如何打开呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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