單片機課程設計——基於51單片機溫濕度檢測系統的設計與實現


  本文主要介紹了怎么使用51單片機最小系統板和溫濕度傳感器制作一個溫濕度檢測系統。

  本次設計主要涉及了溫濕度的測量、顯示以及實現簡單控制。硬件方面有五個模塊,即STC89C52單片機主控模塊、傳感器模塊、LCD1602液晶顯示模塊、繼電器模塊以及閾值設置模塊。整體框架如下圖所示。

  

  傳感器模塊使用的是DHT11數字溫濕度傳感器。通過DHT11檢測出當前環境下的溫濕度,將所測數據交給AT單片機進行分析和處理,並分別存入不同數組以便顯示時候用。其中,為了顯示穩定,本系統每間隔2s采集一次數據送入單片機。

  本系統采用的是繼電器驅動負載,因此無論溫度還是濕度超出范圍繼電器均可以驅動負載工作,及時啟用降溫風扇以及抽濕風扇來有效的調整糧倉等應用場所內的溫濕度。

  硬件設計

  該系統主要由五個大的模塊構成,分別是主控模塊、傳感器模塊、LCD液晶顯示模塊、繼電器模塊以及閾值設置模塊。其中主控模塊是此次畢業設計的核心模塊,主要是指STC89C52芯片,它控制整個系統的運行,利用其各個口分別控制其他模塊,使其他模塊能夠成為一個整體,實現功能的需要,從DHT11溫濕度傳感器中讀入溫度和濕度,在液晶屏上即時顯示。液晶屏上同時顯示溫濕度上限值,該上限值保存外外部EEPROM存儲器中,掉電不失,並且可以通過四只按鍵上調或下調。當溫度或濕度值超過上限值時,報警信號點亮相應報警燈。該報警信號可以通過三極管驅動繼電器,以控制外部風機或制冷器。

  軟件設計

  軟件流程圖如下所示。

  系統總體電路圖如下所示:

 

  主函數代碼如下:(如果有需要在后面的網盤鏈接中下載完整程序)

  1 #include <reg52.h>
  2 #include "1602.h"
  3 #include "dht.h"
  4 #include "2402.h"
  5 
  6 //¶¨ÒåÈý¸öLEDµÆ
  7 sbit Led_qushi=P1^6;        //ȥʪµÆ
  8 sbit Led_jiangwen=P1^5;        //½µÎµÆ
  9 sbit Led_shengwen=P1^4;        //ÉýεÆ
 10 sbit Key_TH1 = P3^2;
 11 sbit Key_TH2 = P3^3;
 12 sbit Key_HH1 = P3^4;
 13 sbit Key_HH2 = P3^5;
 14 
 15 //¶¨Òå±êʶ
 16 volatile bit FlagStartRH = 0;  //¿ªÊ¼ÎÂʪ¶Èת»»±êÖ¾
 17 volatile bit FlagKeyPress = 0; //Óмü°´ÏÂ
 18 
 19 
 20 //¶¨ÒåÎÂʪ¶È´«¸ÐÆ÷ÓÃÍⲿ±äÁ¿
 21 extern U8  U8FLAG,k;
 22 extern U8  U8count,U8temp;
 23 extern U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
 24 extern U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
 25 extern U8  U8comdata;
 26 extern U8  count, count_r;
 27 
 28 U16 temp;
 29 S16 temperature, humidity;
 30 S16 idata TH, HH;  //ζÈÉÏÏÞºÍʪ¶ÈÉÏÏÞ
 31 char * pSave;
 32 U8 keyvalue, keyTH1, keyTH2, keyHH1, keyHH2;
 33 
 34 //¶¨Òå±äÁ¿
 35 U16 RHCounter;
 36 
 37 
 38 //Êý¾Ý³õʼ»¯
 39 void Data_Init()
 40 {
 41    RHCounter = 0;
 42    Led_qushi = 1;
 43    Led_jiangwen = 1;
 44    Led_shengwen = 1;
 45    TH = 40;
 46    HH = 85;
 47    keyvalue = 0;
 48    keyTH1 = 1;
 49    keyTH2 = 1;
 50    keyHH1 = 1;
 51    keyHH2 = 1;
 52 
 53 }
 54 
 55 //¶¨Ê±Æ÷0³õʼ»¯
 56 void Timer0_Init()
 57 {
 58     ET0 = 1;        //ÔÊÐí¶¨Ê±Æ÷0ÖжÏ
 59     TMOD = 1;       //¶¨Ê±Æ÷¹¤×÷·½Ê½Ñ¡Ôñ
 60     TL0 = 0x06;     
 61     TH0 = 0xf8;     //¶¨Ê±Æ÷¸³Óè³õÖµ
 62     TR0 = 1;        //Æô¶¯¶¨Ê±Æ÷
 63 }
 64 
 65 //¶¨Ê±Æ÷0ÖжÏ
 66 void Timer0_ISR (void) interrupt 1 using 0
 67 {
 68     TL0 = 0x06;
 69     TH0 = 0xf8;     //¶¨Ê±Æ÷¸³Óè³õÖµ
 70 
 71     //ÿ2ÃëÖÓÆô¶¯Ò»´ÎÎÂʪ¶Èת»»
 72     RHCounter ++;
 73     if (RHCounter >= 1000)
 74     {
 75        FlagStartRH = 1;
 76        RHCounter = 0;
 77     }
 78 }
 79 
 80 //´æÈëÉ趨ֵ¡¢
 81 void Save_Setting()
 82 {
 83    pSave =  (char *)&TH;      //µØÖ·µÍλ¶ÔÓ¦µÍ8룬¸ßλ¶ÔÓ¦¸ß8λ
 84    wrteeprom(0, *pSave);      //´æÎ¶ÈÉÏÏÞÖµTHµÍ8λ
 85    DELAY(500);
 86    pSave ++;
 87    wrteeprom(1, *pSave);      //´æÎ¶ÈÉÏÏÞÖµTH¸ß8λ
 88    DELAY(500);
 89    pSave =  (char *)&HH;
 90    wrteeprom(2, *pSave);      //´æÊª¶ÈÉÏÏÞÖµRHµÍ8λ
 91    DELAY(500);
 92    pSave ++;
 93    wrteeprom(3, *pSave);      //´æÊª¶ÈÉÏÏÞÖµRH¸ß8λ
 94    DELAY(500);
 95 }
 96 
 97 //ÔØÈëÉ趨ֵ¡¢
 98 void Load_Setting()
 99 {
100    pSave =  (char *)&TH;
101    *pSave++ = rdeeprom(0);
102    *pSave = rdeeprom(1);
103    pSave = (char *)&HH;
104    *pSave++ = rdeeprom(2);
105    *pSave = rdeeprom(3);
106    if ((TH>99)||(TH<0)) TH = 40;
107    if ((HH>99)||(HH<0)) HH = 85;
108 }
109 
110 void KeyProcess(uint num)
111 {
112    switch (num)
113    {
114       case 1:
115          if (TH<99) TH++;
116          L1602_char(1, 15, TH/10+48);
117          L1602_char(1, 16, TH%10+48);
118          break;
119       case 2:
120          if (TH>1) TH--;
121          L1602_char(1, 15, TH/10+48);
122          L1602_char(1, 16, TH%10+48);
123          break;
124       case 3:
125          if (HH<99) HH++;
126          L1602_char(2, 15, HH/10+48);
127          L1602_char(2, 16, HH%10+48);
128          break;
129       case 4:
130          if (HH>1) HH--;
131          L1602_char(2, 15, HH/10+48);
132          L1602_char(2, 16, HH%10+48);
133          break;
134       default:
135          break;
136    }
137    Save_Setting();
138 }
139 
140 /********************************************************************
141 * Ãû³Æ : Main()
142 * ¹¦ÄÜ : Ö÷º¯Êý
143 ***********************************************************************/
144 void main()
145 {
146     U16 i, j, testnum;
147 
148     EA = 0;
149 
150     Timer0_Init();  //¶¨Ê±Æ÷0³õʼ»¯
151 
152     Data_Init();
153     EA = 1;
154 
155     L1602_init();
156     L1602_string(1,1," Welcome to T&H   ");
157     L1602_string(2,1," Control System!  ");
158     //ÑÓʱ
159     for (i=0;i<500;i++)
160        for (j=0;j<1000;j++)
161        {;}
162     //ÇåÆÁ
163     L1602_string(1,1,"                ");
164     L1602_string(2,1,"                ");
165     L1602_string(1,1,"Tem:    C  TH:");
166     L1602_string(2,1,"Hum:    %  HH:");
167     
168     //ÔØÈëζÈÉÏÏÞºÍʪ¶ÈÉÏÏÞÉ趨ֵ
169     Load_Setting();
170     L1602_char(1, 15, TH/10+48);
171     L1602_char(1, 16, TH%10+48);
172     L1602_char(2, 15, HH/10+48);
173     L1602_char(2, 16, HH%10+48);
174 
175 
176     while(1)
177     {
178        //ÎÂʪ¶Èת»»±êÖ¾¼ì²é
179          if (FlagStartRH == 1)
180          {
181              TR0 = 0;
182              testnum = RH();
183               FlagStartRH = 0;
184              TR0 = 1;
185              //¶Á³öÎÂʪ¶È£¬Ö»È¡ÕûÊý²¿·Ö
186              humidity = U8RH_data_H;
187              temperature = U8T_data_H;
188               //ÏÔʾÎÂʪ¶È
189              L1602_int(1,5,temperature);
190              L1602_int(2,5,humidity);    
191         }
192         //ÎÂʪ¶È¿ØÖÆ
193         if (temperature > TH) Led_jiangwen = 0;
194         else Led_jiangwen = 1;                    //½µÎÂ
195         if (humidity > HH) Led_qushi = 0;
196         else Led_qushi = 1;                        //ȥʪ
197          
198         //¼üÅ̲éѯ£¬ÔÚµ¯ÆðʱÏìÓ¦
199         if ((Key_TH1)&&(keyTH1==0)) {FlagKeyPress = 1; keyvalue = 1;}
200         else if ((Key_TH2)&&(keyTH2==0)) {FlagKeyPress = 1; keyvalue = 2;}
201         else if ((Key_HH1)&&(keyHH1==0)) {FlagKeyPress = 1; keyvalue = 3;}
202         else if ((Key_HH2)&&(keyHH2==0)) {FlagKeyPress = 1; keyvalue = 4;}
203         if (FlagKeyPress == 1)
204         {
205            KeyProcess(keyvalue);
206            FlagKeyPress = 0;           
207         }
208         if (!Key_TH1) keyTH1 = 0;
209         else keyTH1 = 1;
210         if (!Key_TH2) keyTH2 = 0;
211         else keyTH2 = 1;
212         if (!Key_HH1) keyHH1 = 0;
213         else keyHH1 = 1;
214         if (!Key_HH2) keyHH2 = 0;
215         else keyHH2 = 1;
216     }    
217 }
View Code

  最有如果有小伙伴需要的話,可以在網盤鏈接中下載,提取碼yu30

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM