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

  • 相关阅读:
    04面向对象编程-01-创建对象 和 原型理解(prototype、__proto__)
    03标准对象-02-RegExp 正则表达式
    03标准对象-01-Date和JSON
    广度优先搜索
    Java虚拟机(三) —— 类加载
    业务开发(一)—— MySQL
    Java并发编程(一) —— Java内存模型JMM
    深度优先搜索
    Spark学习(一)
    清泉白石
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/10798748.html
Copyright © 2020-2023  润新知