基于STM32的自动晾衣架设计与实现:源码、硬件和论文详解

文章目录

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

  • 0 前言

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

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

    🚩 毕业设计 基于单片机的自动晾衣架设计与实现(源码+硬件+论文)

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

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

    https://gitee.com/sinonfin/sharing

    1 主要功能

    整个系统的工作过程为,单片机通过检测水滴检测传感器和光敏电阻经过LM393所反馈的高低电平来判断当前环境的亮度情况以及是否有下雨的情况来控制微动电机正反装来控制其上的衣物左右移动,将其移动到事先准备好的不在室外的环境,实现收衣物。

    2 硬件设计(原理图)


    PCB图

    3 核心软件设计

    本次设计主要的程序流程无非是:先判断当前处于哪种模式,如果是手动模式就通过按键控制电机实现晾衣服收衣服,如果是自动模式则仅在白天不下雨的情况下晒衣服,其他情况下都是收衣服。同时为了实现远程操控还加有红外遥控部分

    关键代码

    #include <REGX52.H>
    #include "hong_wai.h"
    
    
    
    #define uchar unsigned char 
    #define uint unsigned int
    						 
    
    //定义微动电机管脚
    sbit EN=P2^1;	      	 //使能    
    sbit A1=P2^0;
    sbit B1=P2^2;
    
    //定义限位开关管脚
    sbit switch1=P3^3;		  //控制电机往左边的开关
    sbit switch2=P3^4;		  //控制电机往右边的开关
    
    //定义LM393两个输出管脚
    sbit LM393_A=P1^0;		  //连接的是水滴传感器,水多,输出为0
    sbit LM393_B=P1^1;		  //连接的是光敏电阻,光强为 1 
    
    //定义按键
    sbit key1=P3^5;
    sbit key2=P3^6;
    sbit key3=P3^7;
    
    bit key1_flag=0;
    bit key2_flag=0;
    bit key3_flag=0;
    
    
    //定义指示灯
    sbit led0=P0^0;
    sbit led1=P0^1;
    sbit led2=P0^2;
    sbit led3=P0^3;
    
    bit A_M=1;
    bit R_L=1;
    
    bit Open_Close=1;
     
      
    void delay(uint time)   //误差 0us
    {
        while(time--);
    }
    
    
    void RRM(void)	  //往右边走
    {	
    	EN=1;  
    	A1=1;
    	delay(400);
    	B1=1;
    	delay(400);
    	A1=0;
    	delay(400);
    	B1=0;
    	delay(400);
    	EN=0;
    }
    
    void LLM(void)	 //往左边走
    {	
    	EN=1;
    	B1=0;
    	delay(400);
    	A1=0;
    	delay(400);
    	B1=1;
    	delay(400);
    	A1=1;
    	delay(400);
    	EN=0;
    }
    
    
    void key_dispose()
     {
       if(!key1||ircode[2]==0x0C)
        { 
    	  if(key1_flag) 
    	   { ircode[2]=0;
    	     key1_flag=0;
    		 A_M=~A_M;
    	   }
    	}
    	else key1_flag=1;
    
       if(!key2||ircode[2]==0x18)
        {  
    	  if(key2_flag) 
    	   { ircode[2]=0;
    	     key2_flag=0;
    		 
    		if(A_M) Open_Close=0;
    	   }
    	}
    	else key2_flag=1;
    
       if(!key3||ircode[2]==0x5E)
        {  
    	  if(key3_flag) 
    	   { ircode[2]=0;
    	     key3_flag=0;
    		if(A_M) Open_Close=1;
    	   }
    	}
    	else key3_flag=1;
    
     }
    
    
    void AM_dispose()
     {
       if(A_M==0) 
        {
    		 led0=0;
    		 led1=1;
    		 if(LM393_B) 
    		  {	
    			 if(LM393_A) 
    			  {
    			     Open_Close=0;
    			  } 
    			  else
    			   { 
    			     Open_Close=1;
    			   }
    		  }
    		  else 
    		   {
    		     Open_Close=1;
    		   }
    	}
    	else 
    	 {
    		 led0=1;
    		 led1=0;
    	 }
    
    
    
    	 if(Open_Close==0)
    	  {
    		 led2=0;
    		 led3=1;
    	     if(switch2!=0)  
    		  {
    		    RRM();
    		  }
    	  }
    	  else 
    	   {
    		 led2=1;
    		 led3=0;
    	     if(switch1!=0)  
    		  {
    		    LLM();
    		  }
    	   }
    
    
     }
    
    
    void main()
     {
    
         while(switch1!=0)   //初始化电机位置,默认为关闭
    	  {
    	    LLM();
    	  }
      Init_0_1();
      while(1) 
       {
    	 ir_ok();
    	 
    	 AM_dispose();
       }
     
     
     
     }
    
    void time1() interrupt 3 
     {
      TH1=0x3C;
      TL1=0xb0;
      key_dispose();
     }
    void INT_0() interrupt 0
    {
      if(starflag)
        {
         	if(irtime>32)  //引导码时间除以0.256,是31.多毫秒
    		  {
    			 bitnum=0; //此时确定接收到引导码,清零变量,接收数据
    		  }
    		 irdata[bitnum]=irtime;	//将数据接收送入irdata
    		 irtime=0;		//每接收一位数据,清零一次,使下次接受的数据准确
    		 bitnum++;		//数组变量增加
    		 if(bitnum==33)	//当变量增加到33时,说明一帧数据接收完毕
    		  {
    		    bitnum=0;	//清零数组变量
    			irreceok=1;	//接收完一帧数据标志位
    			
    		  }
        }
      else
        {
    	  starflag=1;	//为接收一帧数据的第一位做准备
    	  irtime=0;		//清零定时变量
    	}
     
     
     
      
    }
    void INT_1() interrupt 1
    {
     irtime++;  //因为是模式2,那么变量每加一一次,就是定时了256um,也就是0.256毫秒
    }
    

    4 实现效果

    5 最后

    包含内容

    🧿 项目分享:

    https://gitee.com/sinonfin/sharing

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于STM32的自动晾衣架设计与实现:源码、硬件和论文详解

    发表回复