找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的温湿度控制程序仿真(数码管,DHT11,独立按键)

[复制链接]
跳转到指定楼层
楼主
1、使用DHT11测量温湿度
2、数码管显示温湿度以及阀值
3、按键设置报警值
4、温湿度过限能输出对应控制和报警

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)

51hei截图20220518200335.png (154.09 KB, 下载次数: 32)

51hei截图20220518200335.png

51hei截图20220518200343.png (156.4 KB, 下载次数: 32)

51hei截图20220518200343.png

51hei截图20220518200358.png (157.04 KB, 下载次数: 28)

51hei截图20220518200358.png

51hei截图20220518200415.png (157.68 KB, 下载次数: 36)

51hei截图20220518200415.png

界面说明.gif (69.25 KB, 下载次数: 32)

界面说明.gif

按键流程图.jpg (28.89 KB, 下载次数: 29)

按键流程图.jpg

控制流程图.jpg (37.32 KB, 下载次数: 27)

控制流程图.jpg

主流程图.jpg (28.95 KB, 下载次数: 29)

主流程图.jpg

温湿度控制(数码管,DHT11,独立按键).zip

1.17 MB, 下载次数: 77, 下载积分: 黑币 -5

Proteus仿真 程序

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:467203 发表于 2023-12-4 02:34 | 只看该作者
主程序:
  1. #include "reg51.h"
  2. #include "DHT11.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit k1=P1^4;//按钮
  6. sbit k2=P1^5;
  7. sbit k3=P1^6;
  8. sbit k4=P1^7;
  9. sbit out1=P2^4;//输出控制
  10. sbit out2=P2^5;
  11. sbit out3=P2^6;
  12. sbit out4=P2^7;
  13. sbit led1=P3^4;//led
  14. sbit led2=P3^5;
  15. sbit led3=P3^6;
  16. sbit led4=P3^7;
  17. sbit beep=P1^0;//蜂鸣器
  18. sbit smg1=P2^0;//数码管
  19. sbit smg2=P2^1;
  20. sbit smg3=P2^2;
  21. sbit smg4=P2^3;

  22. uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
  23. uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示0~9,有小数点

  24. uchar time=0,mode=0;//系统变量
  25. uchar flag=0,time1=0;//显示切换
  26. uchar lim1=20,lim2=30,lim3=30,lim4=80;//阀值

  27. //延时
  28. void delay(uint i)
  29. {
  30.         while(i--);
  31. }

  32. void main()//主函数
  33. {
  34.         uchar k=0;
  35.         TMOD|=0X01;//初始化定时器
  36.         TH0=0X3C;
  37.         TL0=0XB0;       
  38.         ET0=1;//打开定时器0中断允许
  39.         EA=1;//打开总中断
  40.         TR0=1;//打开定时器
  41.         while(1)
  42.         {
  43.                 if(!k1 &&(k!=1))//设置
  44.                 {
  45.                         if(mode<4)
  46.                                 mode++;
  47.                         else
  48.                                 mode=0;
  49.                         k=1;
  50.                 }
  51.                 if(!k2 &&(k!=2))//加
  52.                 {
  53.                         switch(mode)
  54.                         {
  55.                                 case 1:
  56.                                         if(lim1<lim2)
  57.                                                 lim1++;
  58.                                         break;
  59.                                 case 2:
  60.                                         if(lim2<99)
  61.                                                 lim2++;
  62.                                         break;
  63.                                 case 3:
  64.                                         if(lim3<lim4)
  65.                                                 lim3++;
  66.                                         break;
  67.                                 case 4:
  68.                                         if(lim4<99)
  69.                                                 lim4++;
  70.                         }
  71.                         k=2;
  72.                 }
  73.                 if(!k3 &&(k!=3))//减
  74.                 {
  75.                         switch(mode)
  76.                         {
  77.                                 case 1:
  78.                                         if(lim1>0)
  79.                                                 lim1--;
  80.                                         break;
  81.                                 case 2:
  82.                                         if(lim2>lim1)
  83.                                                 lim2--;
  84.                                         break;
  85.                                 case 3:
  86.                                         if(lim3>0)
  87.                                                 lim3--;
  88.                                         break;
  89.                                 case 4:
  90.                                         if(lim4>lim3)
  91.                                                 lim4--;
  92.                         }
  93.                         k=3;
  94.                 }
  95.                 if(!k4)//OK
  96.                 {
  97.                         mode=0;
  98.                 }
  99.                 if(k1 && k2 && k3)
  100.                         k=0;
  101.                 //显示
  102.                 if(mode==0)
  103.                 {
  104.                         if(flag==0)//显示温度
  105.                         {
  106.                                 P0=0x01;
  107.                                 smg1=0;
  108.                                 delay(100);
  109.                                 smg1=1;
  110.                                 P0=smgduan0[dht11_dat[2]/10];
  111.                                 smg3=0;
  112.                                 delay(100);
  113.                                 smg3=1;
  114.                                 P0=smgduan0[dht11_dat[2]%10];
  115.                                 smg4=0;
  116.                                 delay(100);
  117.                                 smg4=1;
  118.                         }
  119.                         else//显示湿度
  120.                         {
  121.                                 P0=0x08;
  122.                                 smg1=0;
  123.                                 delay(100);
  124.                                 smg1=1;
  125.                                 P0=smgduan0[dht11_dat[0]/10];
  126.                                 smg3=0;
  127.                                 delay(100);
  128.                                 smg3=1;
  129.                                 P0=smgduan0[dht11_dat[0]%10];
  130.                                 smg4=0;
  131.                                 delay(100);
  132.                                 smg4=1;
  133.                         }
  134.                 }
  135.                 if(mode==1)//温度下限
  136.                 {
  137.                         P0=smgduan0[1];
  138.                         smg1=0;
  139.                         delay(100);
  140.                         smg1=1;
  141.                         P0=smgduan0[lim1/10];
  142.                         smg3=0;
  143.                         delay(100);
  144.                         smg3=1;
  145.                         P0=smgduan0[lim1%10];
  146.                         smg4=0;
  147.                         delay(100);
  148.                         smg4=1;
  149.                 }
  150.                 if(mode==2)//温度上限
  151.                 {
  152.                         P0=smgduan0[2];
  153.                         smg1=0;
  154.                         delay(100);
  155.                         smg1=1;
  156.                         P0=smgduan0[lim2/10];
  157.                         smg3=0;
  158.                         delay(100);
  159.                         smg3=1;
  160.                         P0=smgduan0[lim2%10];
  161.                         smg4=0;
  162.                         delay(100);
  163.                         smg4=1;
  164.                 }
  165.                 if(mode==3)//湿度下限
  166.                 {
  167.                         P0=smgduan0[3];
  168.                         smg1=0;
  169.                         delay(100);
  170.                         smg1=1;
  171.                         P0=smgduan0[lim3/10];
  172.                         smg3=0;
  173.                         delay(100);
  174.                         smg3=1;
  175.                         P0=smgduan0[lim3%10];
  176.                         smg4=0;
  177.                         delay(100);
  178.                         smg4=1;
  179.                 }
  180.                 if(mode==4)//湿度上限
  181.                 {
  182.                         P0=smgduan0[4];
  183.                         smg1=0;
  184.                         delay(100);
  185.                         smg1=1;
  186.                         P0=smgduan0[lim4/10];
  187.                         smg3=0;
  188.                         delay(100);
  189.                         smg3=1;
  190.                         P0=smgduan0[lim4%10];
  191.                         smg4=0;
  192.                         delay(100);
  193.                         smg4=1;
  194.                 }
  195.                 led1=out1;
  196.                 led2=out2;
  197.                 led3=out3;
  198.                 led4=out4;
  199.         }
  200. }
  201. //定时器中断
  202. void Timer0() interrupt 1
  203. {
  204.         if(time<10)//0.5s
  205.                 time++;
  206.         else
  207.         {
  208.                 time=0;
  209.                 dht11_recive();//测量温湿度
  210.                 if(dht11_dat[2]<lim1)//加热
  211.                         out2=0;
  212.                 else
  213.                         out2=1;
  214.                    if(dht11_dat[2]>lim2)//散热
  215.                         out1=0;
  216.                 else
  217.                         out1=1;
  218.                 if(dht11_dat[0]<lim3)//加湿
  219.                         out4=0;
  220.                 else
  221.                         out4=1;
  222.                    if(dht11_dat[0]>lim4)//除湿
  223.                         out3=0;
  224.                 else
  225.                         out3=1;
  226.                 beep=out1 && out2 && out3 && out4;
  227.                 //切换
  228.                 if(time1<6)
  229.                         time1++;
  230.                 else
  231.                 {
  232.                         time1=0;
  233.                         flag=!flag;
  234.                 }
  235.         }
  236.         TH0=0X3C;
  237.         TL0=0XB0;
  238. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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