单片机课程设计——基于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

 

posted @ 2019-04-30 23:59  Reqaw  阅读(4469)  评论(0编辑  收藏  举报