目录
一、主要功能
二、硬件资源
三、程序编程
四、实现现象
一、主要功能
基于AT89C51单片机,湿度检测模块通过ADC0832数模转换器,将模拟信号转换为数字信号给单片机,然后通过LCD1602显示屏显示出当前的湿度值,并判断当前湿度值是否大于60%,若大于60%则P2.6输出低电平,电机1启动,若处于60%以下,则P2.7输出低电平,电机2启动,此时电机12同时进行工作,到达用户预设的50%即停机结束工作。
仿真图:

二、硬件资源
基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。
本系统由51单片机最小系统、LCD1602显示模块、继电器电机、YL-69湿度传感器组成。
三、程序编程
  
  - 
    
    
     
     
    
    
    
    
     
     
      
      #include <REGX52.H>
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      #include<intrins.h>
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      #include<stdio.h>
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      #include "Delay.h"
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      #include "LCD1602.h"
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      #define uchar unsigned char
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      #define uint unsigned  int
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      typedef 
      
      unsigned 
      
      char u8;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      typedef 
      
      unsigned 
      
      int  u16;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      typedef 
      
      unsigned 
      
      char uint8;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      typedef 
      
      unsigned 
      
      int uint16;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      typedef 
      
      unsigned 
      
      long uint32;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      /*引脚定义*/
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      sbit CS=P1^
      
      0;        
      
      //51单片机引脚设置
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      sbit CLK=P1^
      
      1;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      sbit DIO=P1^
      
      2;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      sbit motor1 = P2^
      
      6;	      
      
      //电机1口
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      sbit motor2 = P2^
      
      7;       
      
      //电机2口
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      /*变量定义*/
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      static 
      
      int MAXNUMBER = 
      
      60,MINNUMBER = 
      
      50;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      static uchar u,U,R;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      static 
      
      int flag;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      /*函数定义*/
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      void watermotorpd();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      uchar get_AD_Res()          //ADC0832启动读取函数
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      {
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	uchar i, data1=
      
      0, data2=
      
      0;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CS=
      
      0;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CLK=
      
      0;DIO=
      
      1;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CLK=
      
      1;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CLK=
      
      0;DIO=
      
      1;_nop_(); 
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CLK=
      
      1;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CLK=
      
      0;DIO=
      
      0;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CLK=
      
      1;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CLK=
      
      0;DIO=
      
      1;_nop_(); 
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
      
      for(i=
      
      0; i<
      
      8; i++)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	{
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		CLK=
      
      1;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		CLK=
      
      0;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		data1=(data1<<
      
      1)|(uchar)DIO; 
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	}
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
      
      for(i=
      
      0; i<
      
      8; i++)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	{
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		data2=data2|(uchar)DIO<<i;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		CLK=
      
      1;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		CLK=
      
      0;_nop_();
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	}
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	CS=
      
      1;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
      
      return(data1 == data2)?data1:
      
      0;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      }
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      void main()					  //主函数
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      {	
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
      
      LCD_Init();         
      
      //显示屏初始化
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	motor1 = 
      
      1;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
          motor2 = 
      
      1;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
      
      LCD_ShowString(
      
      1,
      
      1,
      
      "HUM:");
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
      
      LCD_ShowString(
      
      1,
      
      8,
      
      "%");
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
      
      LCD_ShowString(
      
      2,
      
      1,
      
      "CURRENT HUM:");
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
         
      
      LCD_ShowString(
      
      2,
      
      16,
      
      "%");
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	
      
      while(
      
      1)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	{
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
           	u=
      
      get_AD_Res();		
      
      //读取ADC0832的值
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		u= u/
      
      2;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     		
      
      if(u <= 
      
      50)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		{
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		 u = 
      
      50;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		}
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     		
      
      LCD_ShowNum(
      
      2,
      
      13,u,
      
      3);
      
      //通过LCD1602显示湿度的值
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	    
      
      LCD_ShowNum(
      
      1,
      
      5,MAXNUMBER,
      
      3);
      
      //通过LCD1602显示湿度的值
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     		
      
      watermotorpd();   
      
      //电机判断
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     		
      
      if(flag == 
      
      1)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		{
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		 motor1 = 
      
      0; 
      
      //电机1转动
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		 motor2 = 
      
      1;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		}
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     		
      
      else 
      
      if(flag == 
      
      2)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		{
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		 motor1 = 
      
      0;
      
      //电机1转动
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		 motor2 = 
      
      0;
      
      //电机2转动
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		}
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     	    
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     		
      
      if(u <= MINNUMBER)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		{  
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		   motor1 =
      
      1;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		   motor2 =
      
      1;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      		}
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      	}
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      }
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
      
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      void watermotorpd()
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      {
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
       
      
      if(u > MAXNUMBER)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
        {
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
        	flag = 
      
      1;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
        }
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
       
      
      else 
      
      if( MINNUMBER < u <= MAXNUMBER)
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
        {
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
         	flag = 
      
      2;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
        }
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
       
      
      else 
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
        {
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
         flag =
      
      3;
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
        }
     
     
    
    
 - 
    
    
     
     
    
    
    
    
     
     
      
      }
     
     
    
    
 
  
  
  
   
 四、实现现象
具体动态效果看B站演示视频:
基于AT89C52单片机的湿度检测及自动电机驱动_哔哩哔哩_bilibili
全部资料(源程序、仿真文件、安装包、演示视频):
链接:https://pan.baidu.com/s/1SUIep4_ZyOQJ_g4lsudL_w 
 提取码:hzze 
 --来自百度网盘超级会员V4的分享




















