当前位置 博文首页 > 通信汪的美好生活的博客:51单片机温湿度调节系统

    通信汪的美好生活的博客:51单片机温湿度调节系统

    作者:[db:作者] 时间:2021-07-11 22:22

    电路:在这里插入图片描述

    程序:一个主函数,三个头文件分别对应设计中用到的三个主要元件
    在这里插入图片描述

    //主函数
    #include<reg52.h>
    #include <intrins.h>
    #include <math.h>   
    #include <stdio.h>
    #include <1602.h>
    #include <sht11.h>
    #include <24c02.h>     
    #define uchar unsigned char
    #define uint  unsigned  int
    #define W_cmd 0xa0   //24c02写指令
    #define R_cmd 0xa1
    uint temp,humi; 
    value humi_val,temp_val;     //定义两个共同体,一个用于湿度,一个用于温度
    uchar error;                 //用于检验是否出现错误
    uchar checksum;              //CRC
    uchar TEMP_data[7];          //用于记录实测的温度
    uchar HUMI_data[6];          //用于记录实测的湿度
    uchar show_temp[5];           //显示设定的温度
    uchar show_humi[4];           //显示设定的湿度
    
    uchar data temp_humi_cache[4]; //温湿度设置缓存
    uchar temp_set;                 //保存温度变量
    uchar humi_set;          //保存湿度变量
    uchar presskeynum;    //按键次数变量
    uchar nn;            //用于蜂鸣器
    uchar code word1[]={"  a product of  "};
    uchar code word2[]={"UNITED ELECTRONS"};
    uchar code word3[]={" Welcome........"};
    sbit k1=P2^0; //选择按键
    sbit k2=P2^1; //增加按键
    sbit k3=P2^2; //减小按键
    sbit k4=P2^3;// 确认按键
    sbit led1=P1^4;	 //温度过低指示灯
    sbit led2=P1^5;	//	温度过高
    sbit led3=P1^6;	//湿度低于下限值,报警,加湿。
    sbit led4=P1^7;	//湿度过高,报警,不调湿
    sbit motor1=P1^0;
    sbit motor2=P1^1;
    sbit motor3=P1^2;
    sbit motor4=P1^3;
    sbit P2_6=P2^6;
    
    //********延时函数*********
    void delay(uint z)  //z为毫秒数
    
    {
         int a,b;
         for(a=z;a>0;a--)
         for(b=120;b>0;b--);
    }
    void key()
    {
         uchar m;
         if (k1==0) //调整按键检测
         {
             delay(5);
             if (k1==0)
             {
                 presskeynum++;
                 if(presskeynum==3)
                 presskeynum=0;
                 while(k1==0);	 //若一直按下,循环
                 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
             }
         }
         if(presskeynum==1)//温度设置
         {
             if(k2==0)    // 加
             {
                 delay(300);
                 temp_set++;
                 if (temp_set>30)
                 temp_set=30;
                 while(k2==0);       //加上此句必须松按键才处理
              }
              if(k3==0)//减
              {
                   delay(300);
                    temp_set--;
                    if (temp_set<18)
                    temp_set=18;
                    while(k3==0);       //加上此句必须松按键才处理
               }
         
           }
          
             if(presskeynum==2)//湿度设置
             {
                  if(k2==0)// 加
                  {
                      delay(300);
                      humi_set++;
                      if (humi_set>99)
                      humi_set=99;
                      while(k2==0);
                    }
                    if(k3==0)//减
                    {
                        delay(300);
                        humi_set--;
                        if (humi_set<1)
                        humi_set=1;
                      }
          
               }
         
    
          
           if(k4==0)// 退出键
           {
                delay(10);
                if(k4==0)
                {
                    while(k4==0);
                    presskeynum=0;
                    temp_humi_cache[0]=temp_set/10;
                    temp_humi_cache[1]=temp_set%10;
                    temp_humi_cache[2]=humi_set/10;
                    temp_humi_cache[3]=humi_set%10;
          
                    for(m=0;m<4;m++)
                    {  
                         WriteIIC(W_cmd,0x00+m,temp_humi_cache[m]);      //设定值写入24c02
                    }
                    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
         
         
                 }
            }
    }
    
    
    
    
    //主函数
    
    void main()
    { 
    	 uchar t;
         k1=k2=k3=k4=1;
    	 motor1=motor2=motor3=motor4=0;
    	 P2_6=0;
         for (t=0;t<4;t++)
         temp_humi_cache[t]=ReadIIC(W_cmd,0x00+t,R_cmd);  //读入24c02设定的值
         temp_set=temp_humi_cache[0]*10+temp_humi_cache[1];
         humi_set=temp_humi_cache[2]*10+temp_humi_cache[3];
         LCD_Initial();    //液晶初始化
         GotoXY(0,0);
         Print_slow(word1);
         GotoXY(0,1);
         Print_slow(word2);
         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
         GotoXY(0,0);
         Print_slow(word3);
         LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏                     
         while(1)
            {
    		     key();
                 if(presskeynum==0)	 //测量温湿度
                 {                                                                  
                 s_connectionreset(); //启动连接复位
                 error=0;                                           //初始化error=0,即没有错误
                 error+=s_measure((unsigned char*)&temp_val.i,&checksum,TEMP); //温度测量
                 error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量
                 if(error!=0)
    			 s_connectionreset();                 //如果发生错误,系统复位
                 else
                     { 
                          humi_val.f=(float)humi_val.i;                   //转换为浮点数
                          temp_val.f=(float)temp_val.i;                   //转换为浮点数
                          calc_sth10(&humi_val.f,&temp_val.f);            //修正相对湿度及温度
                          temp=temp_val.f*10