找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3561|回復(fù): 4
收起左側(cè)

基于51單片機的溫濕度控制程序仿真(數(shù)碼管,DHT11,獨立按鍵)

  [復(fù)制鏈接]
ID:1102164 發(fā)表于 2023-12-2 16:54 | 顯示全部樓層 |閱讀模式
1、使用DHT11測量溫濕度
2、數(shù)碼管顯示溫濕度以及閥值
3、按鍵設(shè)置報警值
4、溫濕度過限能輸出對應(yīng)控制和報警

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei截圖20220518200405.png
51hei截圖20220518200335.png
51hei截圖20220518200343.png
51hei截圖20220518200358.png
51hei截圖20220518200415.png
界面說明.gif
按鍵流程圖.jpg
控制流程圖.jpg
主流程圖.jpg

溫濕度控制(數(shù)碼管,DHT11,獨立按鍵).zip

1.17 MB, 下載次數(shù): 117, 下載積分: 黑幣 -5

Proteus仿真 程序

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:467203 發(fā)表于 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;//數(shù)碼管
  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,無小數(shù)點
  23. uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//顯示0~9,有小數(shù)點

  24. uchar time=0,mode=0;//系統(tǒng)變量
  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()//主函數(shù)
  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))//設(shè)置
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:1082459 發(fā)表于 2024-5-29 21:30 | 顯示全部樓層
有程序嗎
回復(fù)

使用道具 舉報

ID:673920 發(fā)表于 2024-9-17 21:21 | 顯示全部樓層
正在頭疼把1602顯示改為兩位數(shù)碼管顯示!編譯已通過!按開發(fā)板修改IO口再試!試驗通過后,加上控制邏輯,除濕機就又可以運行了!
回復(fù)

使用道具 舉報

ID:673920 發(fā)表于 2024-9-21 18:48 | 顯示全部樓層
今天,用開發(fā)板試驗已通過,sbit button1=P2^4;這是顯示模式切換,
開機 case 0:  st=0;      break;         //只顯示溫度;
按 button1鍵,case 1:  st=1;      break;         //只顯示濕度;
再按 button1鍵,  case 2:  td=1;      break;          //循環(huán)顯示5秒溫度,顯示5秒濕度;
在這個基礎(chǔ)上加上設(shè)定,就可以實現(xiàn)溫濕度控制!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表