STM32毕设:智能大棚温湿度控制系统(源码、硬件、论文)

文章目录

  • 0 前言
  • 1 主要功能
  • 2 硬件设计(原理图)
  • 3 核心软件设计
  • 4 实现效果
  • 5 最后

  • 0 前言

    🔥
    这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 毕业设计 单片机智能大棚温湿度控制系统(源码+硬件+论文)

    🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分
  • 🧿 项目分享:见文末!

    1 主要功能

    本系统的设计的硬件主要包括:主要是单片机STC89C52,检测系统,显示电路,继电器驱动电路等。利用传感器测量大棚内的温湿度经过信号处理,将传感器测得的数据送至控制系统(STC89C52),与预设的农作物最适合生长的温湿度值的上下限进行对比,并通过显示电路将测得的温湿度进行实时显示,超过范围发出报警并且执行相应的动作,此外我们还增加了手机蓝牙查看温湿度的功能。如果不同作物的适合生长的温度不一样,可以通过键盘电路修改预设值。

              当检测的湿度低于下限时 =====>进行加湿;
              当检测的湿度高于上限时 =====>进行除湿;
              当检测的温度低于下限时 =====>进行升温;
              当检测的温度高于上限时 =====>进行降温;
    

    这样就使温度和湿度一直控制在设定的上下限之间,这样就实现了对大棚温湿度的自动控制。
    本文主要研究内容如下:
    1.进行温湿度控制系统的整体研究与设计。
    2.利用键盘设置温湿度的上下限值。
    3.利用数字温湿度传感器测量大棚内的温湿度。
    4.利用LCD对温湿度进行实时显示。
    5.当大棚温湿度值超出设定范围值时,系统会自动驱动信号控制继电器对大棚温湿度进行调节。

    2 硬件设计(原理图)


    3 核心软件设计

    主程序流程图

    关键代码

    include <reg52.h>
    #define uint unsigned int 
    #define uchar unsigned char
    #include <intrins.h>
    
    typedef bit BOOL  ; 
    
    sbit io = P1^7 ;
    sbit FMQ=P2^0;   //蜂鸣器
    sbit TempH=P1^3;  //降温控制
    sbit TempL=P1^2;  //加温控制
    
    sbit HumiH=P1^1;   //除湿
    sbit HumiL=P1^0;   //加湿
    sbit rs = P2^5 ; 
    sbit rw = P2^6 ;
    sbit ep = P2^7 ;
    bit flag_300ms ;
    
    sbit K1=P3^2;
    sbit K2=P3^3;
    sbit K3=P3^4;
    
    uchar yemian=0;
    uchar flat=1;
    uchar data_byte;
    uchar RH,RL,TH,TL;
    uchar WenDu_H,WenDu_L,ShiDu_H,ShiDu_L;//报警的温度和湿度
    #include "eeprom52.h"
    
    
    /****************************延时程序****************************/
    void delay(uchar ms)
    {       // 延时子程序
    	 uchar i ;
    	 while(ms--)
    	 {
    	  	for(i = 0 ; i<250;i++) ;
    	 }
    }
    
    void delay1()//延时10us
    {
    	uchar i;
    	i--;
    	i--;
    	i--;
    	i--;
    	i--;
    	i--;
    }
    void longdelay(uchar s) //长延时
    {
    	 while(s--)
    	 {
    	  	delay(20) ;
    	 }
    }
    
    
    
    /************************LCD模块******************************************/
    
    BOOL lcd_bz()//测试LCD忙碌状态
    {      
    	 BOOL result ;
    	 rs = 0 ;
    	 rw = 1 ;
    	 ep = 1 ;
    	 result = (BOOL)(P0 & 0x80) ;
    	 ep = 0 ;
    	 return result ; 
    }
    
    void write_cmd(uchar cmd)// 写指令
    {       
     	while(lcd_bz()) ;
    	rs = 0 ;
    	rw = 0 ;
    	ep = 0 ;
    	P0 = cmd ;
    	ep = 1 ;
    	ep = 0 ;  
    }
    
    void write_addr(uchar addr)//写地址
    {       
     	write_cmd(addr|0x80) ;
    }
    
    uchar receive_byte()//接收一个字节
    {
    	uchar i,temp,count;
    	for(i=0;i<8;i++)
    	{
    		count=2;
    		while((!io)&&count++)//等待50us低电平结束
    		temp=0;
    		delay1();delay1();delay1();delay1();
    		if(io==1)temp=1;
    		count=2;
    	
    		if(count==1)break;
    		data_byte<<=1;	
    		data_byte|=temp;
    	}
    	return data_byte;
    }
    void receive()//接收数据
    {
    	uchar T_H,T_L,R_H,R_L,check,num_check;
    	uchar count;
    	start();//开始信号
    	io=1;
    	if(!io)//读取DHT11响应信号
    	{
    	count=2;
    	while((!io)&&count++);//DHT11高电平80us是否结束
    	count=2;
    	while((io)&&count++);
    	R_H=receive_byte();
    	R_L=receive_byte();
    	io=0;//拉低延时50us
    	delay1();delay1();delay1();delay1();delay1();
    	io=1;
    	num_check=R_H+R_L+T_H+T_L;
    	if(num_check=check)
    	{
    		TH=T_H;
    		TL=T_L;
    		check=num_check;
    	}
    	}
    }
    
    
    void showw()   // 问候语函数
    {      
    	   lcd_init(); //初始化
    	    delay(10);
    	
         display(0x05,'W');
         display(0x06,'e');
    		 display(0x07,'l');
    		 display(0x08,'c');
    		 display(0x09,'o');
    		 display(0x0a,'m');
         display(0x0b,'e');
    	   delay(250); //短暂延时
    	   delay(250);
    	   delay(250);
    	   
    
    /*********************************/
    /*
    	   display(0x40,' ') ;
    		 display(0x41,'h');
    		 display(0x42,'e');
    		
     */
    }
    
    
    /*************定时器0初始化程序***************/
    void time_init()	  
    {
    	EA   = 1;	 	  //开总中断
    	TMOD = 0X01;	  //定时器0、定时器1工作方式1
    	ET0  = 1;		  //开定时器0中断 
    	TR0  = 1;		  //允许定时器0定时
    }
    
    
    
    void key() //按键程序 选择菜单模式
    {
         
    	  if(!K1)
    		   {  
    			  delay(20);
    			    if(!K1)
    		         {   
    							 while(!K1)
    				           ;
    							  yemian++;
                                  if(yemian>=5) { yemian=0; } 
    								
                 }
    		   }
     
    	
    	
    }
    
    
    shezhi()  //对里面的数值进行修改
    {
        if(!K2)
    		   {  
    			  delay(50);
    			    if(!K2)
    		         {   
    							 ;
    							 
    							 if(yemian==1)
    							 {
    							   
    								if(WenDu_H<99 && WenDu_H>=WenDu_L )  {  WenDu_H+=1; }  //湿度上限加
    							 }
    							 
    
    							if(yemian==2)
    							 {
    							  
    								if(WenDu_L>=0 &&  WenDu_L<WenDu_H)   {  WenDu_L+=1; }  //温度下限加
    							 }
    
    
    
    							 if(yemian==3)
    							 {
    							 	if(ShiDu_H<99 && ShiDu_H>=ShiDu_L )  {  ShiDu_H+=1; }  //湿度上限加
    							 }
    
    							  if(yemian==4)
    							 {
    							 	if(ShiDu_L>=0 &&  ShiDu_L<ShiDu_H)   {  ShiDu_L+=1; }  //湿度下限加
    //=============蜂鸣器==============================
     if( TempH==0 || TempL==0 || HumiH==0  || HumiL==0 )
       {
         FMQ=0; //打开蜂鸣器
       }
    	 
    if( TempH==1 && TempL==1 && HumiH==1  && HumiL==1 )
       {
         FMQ=1;  //关闭蜂鸣器
       }
    							 }
    							 
    								write_eeprom();       //保存数据		
                 }
    		   }
    			 
    			  if(!K3)
    		   {  
    			    delay(50);
    			     if(!K3)
    		         {   
    							
    				           ;
    							   if(yemian==1)
    							 {
    							   
    								if(WenDu_H>0 && WenDu_H>WenDu_L )  {  WenDu_H-=1; }  //湿度上限减
    							 }
    							 
    
    							if(yemian==2)
    							 {
    							  
    								if(WenDu_L>0 )   {  WenDu_L-=1; }  //温度下限减
    							 }
    
    
    
    							 if(yemian==3)
    							 {
    							 	if(ShiDu_H>0 && ShiDu_H>ShiDu_L )  {  ShiDu_H-=1; }  //湿度上限减
    							 }
    
    							  if(yemian==4)
    							 {
    							 	if(ShiDu_L>0 )   {  ShiDu_L-=1; }  //湿度下限减
    							 }
    							 
    								write_eeprom();       //保存数据	
                 }
    		   }
    
    }
    
    
    
    /***************************主程序*********************************/
    void main()
    {
    	 init_eeprom();      			//读eeprom数据
       time_init();				//初始化定时器 
       showw();    //显示问候语 和名字
      
    	while(1)
    	{   
    		
    		   key();
    		//====================yemian==0时 进入工作状态=================================
    		 	if(yemian==0)  
    			{ 
    				if(flat==1)
    				 {
                         flat=2;
    					 lcd_init(); //初始化
    					 	 
    					 display(0x00,'T') ;    //Temp
                         display(0x01,':');
                         display(0x05,0xdf); // 度
    		             display(0x06,'C');
    					 
    					 
    					 display(0x40,'H') ;    //Humi
                         display(0x41,':');
    					 
    					 display(0x44,'%');
    					 display(0x45,'R');
    					 display(0x46,'H');
    					 
    					 display(0x09,' ');
                         display(0x0a,' ');
                         display(0x0b,WenDu_H/10+0x30);  //报警温度上限
    		             display(0x0c,WenDu_H%10+0x30);
    					 display(0x0d,'-');
    				   	 display(0x0e,WenDu_L/10+0x30);  //报警温度下限
    		             display(0x0f,WenDu_L%10+0x30);
    
    
    					 display(0x49,' ');
                         display(0x4a,' ');
    				     display(0x4b,ShiDu_H/10+0x30);  //报警湿度
    		             display(0x4c,ShiDu_H%10+0x30);
    					 display(0x4d,'-');
    					 display(0x4e,ShiDu_L/10+0x30);  //报警湿度
    		             display(0x4f,ShiDu_L%10+0x30);
              
              }
    			
    			 if(flag_300ms == 1)
    	    	 {		
    			     flag_300ms = 0;
                     receive();
    					 
    				 display(0x02,TH/10+0x30);  //温度显示
    		         display(0x03,TH%10+0x30);
    					 
                     display(0x42,RH/10+0x30);  //湿度显示
    		         display(0x43,RH%10+0x30);
    					 
    					
               warn();
    		     }
    			
    	}		
    			
    	//====================yemian==1 温度上限设置===========================
    				if(yemian==1)  //温度
    		    	{
    		         if(flat==2)
    				      {
                                 flat=3;  
    							
    
    							 TempH=1; TempL=1;
                                 HumiH=1; HumiL=1;
    
    
                                 lcd_init(); //初始化
    							 display(0x05,'T');
    							 display(0x06,'e');
    							 display(0x07,'m');
    							 display(0x08,'p');
    							 display(0x09,'_');
    							 display(0x0a,'H');
                          }
    						 
    						shezhi();
    						display(0x47,WenDu_H/10+0x30);  //温度上限
    		                display(0x48,WenDu_H%10+0x30);
    		       }
    			
    		//====================yemian==2温度下限设置==========================	
    				if(yemian==2)   //湿度设置
    			    {
    		              if(flat==3)
    				         {
                                 flat=4;  
    							
                                  lcd_init(); //初始化
    						     display(0x05,'T');
    							 display(0x06,'e');
    							 display(0x07,'m');
    							 display(0x08,'p');
    							 display(0x09,'_');
                                 display(0x0a,'L');
    						 } 
    						 shezhi();
    						 display(0x47,WenDu_L/10+0x30);  //湿度
    		                 display(0x48,WenDu_L%10+0x30);
    		      }
    
    
    			  	//====================yemian==3温度下限设置==========================	
    				if(yemian==3)   //湿度设置
    			    {
    		              if(flat==4)
    				         {
                                 flat=5;  
    							
                                  lcd_init(); //初始化
    							 display(0x05,'H');
    							 display(0x06,'u');
    							 display(0x07,'m');
    							 display(0x08,'i');
    							 display(0x09,'_');
    							 display(0x0a,'H');
    							 
    						 } 
    						 shezhi();
    						
    		      }
    
    
    
    			  	//====================yemian==4温度下限设置==========================	
    				if(yemian==4)   //湿度设置
    			    {
    		              if(flat==5)
    				         {
                                 flat=1;  
    						
                                  lcd_init(); //初始化
    							 display(0x05,'H');
    							 display(0x06,'u');
    							 display(0x07,'m');
    							 display(0x08,'i');
    							 display(0x09,'_');
    							 display(0x0a,'L');
    						 } 
    						 shezhi();
    					
    		      }
    	}
    }
    
    
    
    /*************定时器0中断服务程序***************/
    void time0_int() interrupt 1
    {	
    	static uchar value;
    	TH0 = 0x3c;
    	TL0 = 0xb0;     // 50ms
    	value ++;	 
    	if(value % 6 == 0)
    	{
    		flag_300ms = 1;	   //300ms
    		value = 0;
    	}
    }
    

    4 实现效果


    5 最后

    包含内容

    🧿 项目分享:见文末!

    作者:m0_984093

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32毕设:智能大棚温湿度控制系统(源码、硬件、论文)

    发表评论