久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 21498|回復: 54
收起左側

基于SHT11的溫濕度控制 帶proteus仿真,單片機源程序

  [復制鏈接]
ID:148509 發表于 2017-1-7 21:50 | 顯示全部樓層 |閱讀模式
設計成果,SHT11的溫濕度控制下面是仿真原理圖:
0.png

單片機源程序部分預覽:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>   
  4. #include <stdio.h>
  5. #include <1602.h>
  6. #include <sht11.h>
  7. #include <24c02.h>     
  8. #define uchar unsigned char
  9. #define uint  unsigned  int
  10. #define W_cmd 0xa0   //24c02寫指令
  11. #define R_cmd 0xa1
  12. uint temp,humi;
  13. value humi_val,temp_val;     //定義兩個共同體,一個用于濕度,一個用于溫度
  14. uchar error;                 //用于檢驗是否出現錯誤
  15. uchar checksum;              //CRC
  16. uchar TEMP_data[7];          //用于記錄實測的溫度
  17. uchar HUMI_data[6];          //用于記錄實測的濕度
  18. uchar show_temp[5];           //顯示設定的溫度
  19. uchar show_humi[4];           //顯示設定的濕度

  20. uchar data temp_humi_cache[4]; //溫濕度設置緩存
  21. uchar temp_set;                 //保存溫度變量
  22. uchar humi_set;          //保存濕度變量
  23. uchar presskeynum;    //按鍵次數變量
  24. uchar nn;            //用于蜂鳴器
  25. uchar code word1[]={"  a product of  "};
  26. uchar code word2[]={"UNITED ELECTRONS"};
  27. uchar code word3[]={" Welcome........"};
  28. sbit k1=P2^0; //選擇按鍵
  29. sbit k2=P2^1; //增加按鍵
  30. sbit k3=P2^2; //減小按鍵
  31. sbit k4=P2^3;// 確認按鍵
  32. sbit led1=P1^4;         //溫度過低指示燈
  33. sbit led2=P1^5;        //        溫度過高
  34. sbit led3=P1^6;        //濕度低于下限值,報警,加濕。
  35. sbit led4=P1^7;        //濕度過高,報警,不調濕
  36. sbit motor1=P1^0;
  37. sbit motor2=P1^1;
  38. sbit motor3=P1^2;
  39. sbit motor4=P1^3;
  40. sbit P2_6=P2^6;

  41. //********延時函數*********
  42. void delay(uint z)  //z為毫秒數

  43. {
  44.      int a,b;
  45.      for(a=z;a>0;a--)
  46.      for(b=120;b>0;b--);
  47. }
  48. void key()
  49. {
  50.      uchar m;
  51.      if (k1==0) //調整按鍵檢測
  52.      {
  53.          delay(5);
  54.          if (k1==0)
  55.          {
  56.              presskeynum++;
  57.              if(presskeynum==3)
  58.              presskeynum=0;
  59.              while(k1==0);         //若一直按下,循環
  60.              LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  61.          }
  62.      }
  63.      if(presskeynum==1)//溫度設置
  64.      {
  65.          if(k2==0)    // 加
  66.          {
  67.              delay(300);
  68.              temp_set++;
  69.              if (temp_set>30)
  70.              temp_set=30;
  71.              while(k2==0);       //加上此句必須松按鍵才處理
  72.           }
  73.           if(k3==0)//減
  74.           {
  75.                delay(300);
  76.                 temp_set--;
  77.                 if (temp_set<18)
  78.                 temp_set=18;
  79.                 while(k3==0);       //加上此句必須松按鍵才處理
  80.            }
  81.      
  82.        }
  83.       
  84.          if(presskeynum==2)//濕度設置
  85.          {
  86.               if(k2==0)// 加
  87.               {
  88.                   delay(300);
  89.                   humi_set++;
  90.                   if (humi_set>99)
  91.                   humi_set=99;
  92.                   while(k2==0);
  93.                 }
  94.                 if(k3==0)//減
  95.                 {
  96.                     delay(300);
  97.                     humi_set--;
  98.                     if (humi_set<1)
  99.                     humi_set=1;
  100.                   }
  101.       
  102.            }
  103.      

  104.       
  105.        if(k4==0)// 退出鍵
  106.        {
  107.             delay(10);
  108.             if(k4==0)
  109.             {
  110.                 while(k4==0);
  111.                 presskeynum=0;
  112.                 temp_humi_cache[0]=temp_set/10;
  113.                 temp_humi_cache[1]=temp_set%10;
  114.                 temp_humi_cache[2]=humi_set/10;
  115.                 temp_humi_cache[3]=humi_set%10;
  116.       
  117.                 for(m=0;m<4;m++)
  118.                 {  
  119.                      WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]);      //設定值寫入24c02
  120.                 }
  121.                 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  122.      
  123.      
  124.              }
  125.         }
  126. }




  127. //主函數

  128. void main()
  129. {
  130.          uchar t;
  131.      k1=k2=k3=k4=1;
  132.          motor1=motor2=motor3=motor4=0;
  133.          P2_6=0;
  134.      for (t=0;t<4;t++)
  135.      temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd);  //讀入24c02設定的值
  136.      temp_set=temp_humi_cache[0]*10+temp_humi_cache[1];
  137.      humi_set=temp_humi_cache[2]*10+temp_humi_cache[3];
  138.      LCD_Initial();    //液晶初始化
  139.      GotoXY(0,0);
  140.      Print_slow(word1);
  141.      GotoXY(0,1);
  142.      Print_slow(word2);
  143.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
  144.      GotoXY(0,0);
  145.      Print_slow(word3);
  146.      LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏                     
  147.      while(1)
  148.         {
  149.                      key();
  150.              if(presskeynum==0)         //測量溫濕度
  151.              {                                                                  
  152.              s_connectionreset(); //啟動連接復位
  153.              error=0;                                           //初始化error=0,即沒有錯誤
  154.              error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //溫度測量
  155.              error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //濕度測量
  156.              if(error!=0)
  157.                          s_connectionreset();                 //如果發生錯誤,系統復位
  158.              else
  159.                  {
  160.                       humi_val.f=(float)humi_val.i;                   //轉換為浮點數
  161.                       temp_val.f=(float)temp_val.i;                   //轉換為浮點數
  162.                       calc_sth10(&humi_val.f,&temp_val.f);            //修正相對濕度及溫度
  163.                       temp=temp_val.f*10;
  164.                       humi=humi_val.f*10;
  165.                                           GotoXY(0,0);                                       //選擇溫度顯示位置
  166.                       Print("Temp:      C");                             //5格空格
  167.                       GotoXY(0,1);                                       //選擇濕度顯示位置
  168.                       Print("Humi:      %");                            //5格空格                           
  169.                       GotoXY(5,0);                                      //設置溫度顯示位置
  170.                       TEMP_data[0]=temp/1000+'0';                     //溫度百位
  171.                       if (TEMP_data[0]==0x30)
  172.                                           TEMP_data[0]=0x20;
  173.                       TEMP_data[1]=temp%1000/100+'0';                //溫度十位      
  174.                       if (TEMP_data[1]==0x30 && TEMP_data[0]!=0x30)
  175.                                           TEMP_data[1]=0x20;
  176.                       TEMP_data[2]=temp%100/10+'0';                   //溫度個位
  177.                       TEMP_data[3]=0x2e;                              //小數點
  178.                       TEMP_data[4]=temp%10+'0';                       //溫度小數點后第一位            
  179.                       TEMP_data[5]=0xdf;                              //顯示溫度符號℃
  180.                       TEMP_data[6]='\0';
  181.                       Print(TEMP_data);                                //輸出溫度               
  182.                       GotoXY(5,1);                                    //設置濕度顯示位置
  183.                                           HUMI_data[0]=humi/1000+'0';                     //濕度百位                           
  184.                       if (HUMI_data[0]==0x30)
  185.                                           HUMI_data[0]=0x20;
  186.                       HUMI_data[1]=humi%1000/100+'0';          //濕度十位      
  187.                       HUMI_data[2]=humi%100/10+'0';            //濕度個位
  188.                       HUMI_data[3]='.' ;                       //小數點
  189.                       HUMI_data[4]=humi%10+'0';                //濕度小數點后第一位   
  190.                       HUMI_data[5]='\0';
  191.                       Print(HUMI_data);                         //輸出濕度                     
  192.                                           if ((temp/10)<temp_set)
  193.                                           {
  194.                                              led1=0; //加熱
  195.                                                  motor1=1;
  196.                                                  led2=1;
  197.                                                  motor2=0;                                
  198.                          if((temp/10)==temp_set)
  199.                                {
  200.                                                 led1=1;
  201.                                                         motor1=0;
  202.                                              }
  203.                                            }
  204.                       else if ((temp/10)>temp_set)
  205.                       {
  206.                                               led2=0; //制冷
  207.                                                   motor2=1;
  208.                                                   led1=1;
  209.                                                   motor1=0;
  210.                           if ((temp/10)==temp_set)
  211.                                                   {
  212.                               led2=1;
  213.                                                           motor2=0;
  214.                                                    }
  215.                                            }
  216.                       if ((humi/10)<humi_set)
  217.                       {
  218.                                               led3=0; //加濕
  219.                                                   motor3=1;
  220.                                                   led4=1;
  221.                                                   motor4=0;
  222.                           if ((humi/10)==humi_set)
  223.                           {
  224.                                                        led3=1;
  225.                                                            motor3=0;
  226.                                                    }
  227.                                           }
  228.                       else if ((humi/10)>humi_set)
  229.                       {
  230.                                               led4=0; //干燥
  231.                                                   motor4=1;
  232.                                                   led3=1;
  233.                                                   motor3=0;
  234.                           if ((humi/10)==humi_set)
  235.                           {
  236.                                                        led4=1;
  237.                                                            motor4=0;
  238.                                                   }
  239.                                            }
  240.                      
  241.                }  //else
  242.        }  //if
  243.                      
  244.                if(presskeynum==1)  //設定溫度時顯示的內容
  245.                {
  246.                    show_temp[0]=temp_set/10+0x30;
  247.                    show_temp[1]=temp_set%10+0x30;
  248.                    show_temp[2]=0xdf;
  249.                    show_temp[3]='C';
  250.                    show_temp[4]='\0';
  251.                    GotoXY (0,0);
  252.                    Print("SET TEMP:");
  253.                    GotoXY (0,1);
  254.                    Print(show_temp);
  255.                        
  256.                }
  257.                        

  258.               if(presskeynum==2)                      //設定濕度時顯示的內容
  259.               {
  260.                     show_humi[0]=humi_set/10+0x30;
  261.                     show_humi[1]=humi_set%10+0x30;
  262.                     show_humi[2]='%';
  263.                     show_humi[3]='\0';
  264.                     GotoXY (0,0);
  265.                     Print("SET HUMI:");
  266.                     GotoXY (0,1);
  267.                     Print(show_humi);
  268.                }
  269.          
  270.                                                                                             
  271.          }//while
  272. }   //mian
復制代碼

0.png

Keil2代碼與Proteus7.5仿真下載(注意版本):
1130.zip (167.19 KB, 下載次數: 841)

評分

參與人數 1黑幣 +5 收起 理由
ABC123456789啊 + 5 絕世好帖!

查看全部評分

回復

使用道具 舉報

ID:151215 發表于 2017-1-9 16:08 | 顯示全部樓層
好資料,51黑有你更精彩!!!我幫大家轉為了Keil5的版本 和Proteus8.8版本
51hei.gif

新版本.7z

78.63 KB, 下載次數: 15, 下載積分: 黑幣 -5

回復

使用道具 舉報

ID:160980 發表于 2017-1-9 17:23 | 顯示全部樓層
好,非常感謝
回復

使用道具 舉報

ID:82421 發表于 2017-1-10 18:30 | 顯示全部樓層
好東西
回復

使用道具 舉報

ID:148321 發表于 2017-2-22 11:13 | 顯示全部樓層
非常感謝
回復

使用道具 舉報

ID:169957 發表于 2017-3-29 17:38 | 顯示全部樓層
請問24c02是干什莫用的?
回復

使用道具 舉報

ID:169957 發表于 2017-4-5 14:33 | 顯示全部樓層
yanjingshe 發表于 2017-3-29 17:38
請問24c02是干什莫用的?

有人知道嗎
回復

使用道具 舉報

ID:188062 發表于 2017-5-3 15:58 | 顯示全部樓層
有用謝謝
回復

使用道具 舉報

ID:196777 發表于 2017-5-5 10:37 | 顯示全部樓層
好東西,支持
回復

使用道具 舉報

ID:111182 發表于 2017-5-18 20:38 | 顯示全部樓層
下載出現服務器錯誤,只扣黑幣,下載不了

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 已經補償

查看全部評分

回復

使用道具 舉報

ID:202354 發表于 2017-5-18 22:18 | 顯示全部樓層
正在做借鑒到了很多謝謝大腿
回復

使用道具 舉報

ID:34643 發表于 2017-5-19 06:05 | 顯示全部樓層
正在收集這方面的資料,先收藏。
回復

使用道具 舉報

ID:190568 發表于 2017-6-6 09:14 來自手機 | 顯示全部樓層
這個驅動電路中三極管放大倍數是多少
回復

使用道具 舉報

ID:110866 發表于 2017-6-9 12:38 | 顯示全部樓層
程序根本編譯不通過
回復

使用道具 舉報

ID:231170 發表于 2017-9-5 16:42 | 顯示全部樓層
下載出錯扣幣沒下載
回復

使用道具 舉報

ID:149736 發表于 2017-11-29 21:35 | 顯示全部樓層

不知道
回復

使用道具 舉報

ID:255460 發表于 2017-11-29 22:18 | 顯示全部樓層
請問24c02是干什莫用的? 好東西
回復

使用道具 舉報

ID:208540 發表于 2018-1-5 17:56 | 顯示全部樓層
可以可以
回復

使用道具 舉報

ID:272510 發表于 2018-1-6 20:26 | 顯示全部樓層
正在學習,下載看看,謝謝樓主分享

評分

參與人數 1黑幣 +1 收起 理由
lxx20142298 + 1 淡定

查看全部評分

回復

使用道具 舉報

ID:171855 發表于 2018-3-29 14:55 | 顯示全部樓層
樓主對程序的解釋很清楚,很容易看懂,是個很不錯的設計。
回復

使用道具 舉報

ID:300185 發表于 2018-4-12 03:38 | 顯示全部樓層
溫度和濕度顯示為什么和SHT11上的不一樣?
回復

使用道具 舉報

ID:159139 發表于 2018-4-12 10:21 來自手機 | 顯示全部樓層
看來不錯,下個學習學習,謝謝分享。
回復

使用道具 舉報

ID:292004 發表于 2018-4-15 15:10 | 顯示全部樓層
3760609865 發表于 2018-4-12 10:21
看來不錯,下個學習學習,謝謝分享。

這個編譯后能用嗎?
回復

使用道具 舉報

ID:319717 發表于 2018-5-1 11:26 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:319811 發表于 2018-5-1 14:58 | 顯示全部樓層
可以直接點擊運行仿真了嗎?
回復

使用道具 舉報

ID:319811 發表于 2018-5-1 14:59 | 顯示全部樓層
yinkun230 發表于 2017-11-29 22:18
請問24c02是干什莫用的? 好東西

好像是掉電之后儲存數據的
回復

使用道具 舉報

ID:319811 發表于 2018-5-1 15:02 | 顯示全部樓層

可以運行嗎?
回復

使用道具 舉報

ID:324882 發表于 2018-5-8 11:10 | 顯示全部樓層
非常好的分享
回復

使用道具 舉報

ID:301392 發表于 2018-5-23 10:15 | 顯示全部樓層
太感謝了樓主,十分有用,
回復

使用道具 舉報

ID:315785 發表于 2018-5-24 17:46 | 顯示全部樓層
東西如何?
回復

使用道具 舉報

ID:399171 發表于 2018-9-17 19:07 | 顯示全部樓層
我想看一看  沒有黑幣
回復

使用道具 舉報

ID:399383 發表于 2018-9-18 10:14 | 顯示全部樓層
xiexie
回復

使用道具 舉報

ID:97811 發表于 2018-9-19 07:20 | 顯示全部樓層
謝謝分享!下來學習學習
回復

使用道具 舉報

ID:399383 發表于 2018-9-19 22:21 | 顯示全部樓層
大神,溫度設置最底到18,就不能繼續減了,怎么解決
回復

使用道具 舉報

ID:408627 發表于 2018-10-12 16:01 | 顯示全部樓層
程序運行不了
回復

使用道具 舉報

ID:413916 發表于 2018-10-24 14:35 | 顯示全部樓層
666啊 學習學習
回復

使用道具 舉報

ID:413916 發表于 2018-10-25 09:38 | 顯示全部樓層
  這個真的很贊啊!!!
回復

使用道具 舉報

ID:430628 發表于 2018-11-21 16:20 | 顯示全部樓層
正在學習,下載看看,謝謝樓主分享
回復

使用道具 舉報

ID:456677 發表于 2018-12-27 18:28 | 顯示全部樓層
謝謝樓主
回復

使用道具 舉報

ID:443678 發表于 2018-12-27 19:11 | 顯示全部樓層
非常好的分享
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区免费 | 亚洲国产精品第一区二区 | 在线播放亚洲 | 黄a网 | 成人不卡 | 久久成人综合 | 欧美成人一级 | 国产原创在线观看 | 97超碰人人草 | 91精品国产欧美一区二区成人 | 国产精品久久久久婷婷二区次 | 日韩av在线免费 | 色久在线| 午夜电影在线播放 | 亚洲精品电影在线观看 | 亚洲导航深夜福利涩涩屋 | 欧美a级成人淫片免费看 | 人人艹人人爽 | 久久久久国产 | 天天干夜夜拍 | 国产精品国产精品国产专区不卡 | 午夜视频网| 色视频在线播放 | 精品九九久久 | 91免费福利在线 | 国产精品亚洲成在人线 | 欧美女优在线观看 | a级大片免费观看 | 国内成人免费视频 | 超碰超碰| 一级做a爰片久久毛片免费看 | 久久九| 伊人春色在线 | 午夜影视网 | 久久国产精品视频 | 九一在线观看 | 日本在线一区二区三区 | 欧美一级久久 | 午夜影院在线免费观看视频 | 欧美精品综合在线 | 国产精品亚洲视频 |