基于单片机的自动浇花器设计

收藏和点赞,您的关注是我创作的动力

概要

  本次自动浇花器设计,系统是用AT89C51单片机作为控制核心,使用YL-69作为土壤湿度传感模块,光敏电阻作为光照量传感模块,LCD1602作为显示数据的模块,按键用来设定数值。本系统有三种模式的功能,一是可以通过YL-69湿度传感器进行土壤湿度的采集,利用单片机AT89C51对信息进行处理,输出控制信号,控制信号通过控制继电器控制水泵电源是否通断,从而完成自动浇水。二是利用单片机精确控制,在设定时间内实施浇水。三是在系统中加入一个光敏电阻,当检测到有光照的时候即白天的时候系统检测到土壤湿度低于设定值时才运行完成浇水,当检测到无光照即黑夜时即使检测到土壤湿度低于设定值系统也不会运行。

关键词:YL-69;湿度;光敏电阻;AT89C51单片机;水泵;LCD1602

一、系统设计总体思路

  此论文是立足于单片机的自动浇花器设计:
(1)完成整体的规划和结构设计
(2)围绕着单片机展开相关工作,并对装置原件展开处理,让它们有机的搭配起来。主要的硬件部分涵盖有:土壤湿度检测电路、光亮度检测电路、电源电路、按键设置电路、LCD1602显示电路与继电器控制水泵电路。以及系统的软件设计及编写,使其与硬件模块互相配合。大体涵盖有以下几类程序:主要程序、湿度检测程序、信息汇总程序、按键触碰程序、运行子程序等。
(3)完成硬件模块和软件模块的调试。

系统方案设计

  

2.1.1 总体方案设计

该方案的系统体系主要由两部分共同搭建,分别是:硬件方面、软件方面。硬件模块方面大体包括了土壤湿度检测模块、光亮度检测模块、按键设置模块、LCD1602显示模块与继电器控制水泵电路模块,设计了一种智能浇灌的系统,这个自动浇花系统可以在没有人的环境下做到对植物进行自动浇灌,在花卉需要浇水的时候,可以根据土壤干湿程度以及光照的强度,对植物的浇水进行自动控制。单片机是此方案的控制中心,通过环境湿度检测仪展开相关信息的传递,继而使用智能系统规定其湿度的最大及最小值,然后再借助单片机将传输来的相关信息展开分析与整理,从而评估外界环境的湿度。一旦反馈的湿度值明显小于规定的湿度最小值,那么单片机将下达指令至控制水泵,让其进行浇水行为,在经过一段时间的浇水过后,当湿度达到规定的最大值时,仪器又将停止运水,这就是整个浇花的工作原理。或在无人的情况下,根据自己的浇灌经验通过设定时间来进行浇灌,当到达设定时间时单片机控制水泵浇水,超过一分钟后水泵停止浇水。本实验主要完成以下的几个功能:
1.借助湿度传感器采集土壤湿度的相关信息;
2.显示测量的数据
3.对最适宜植物成长的土壤进行分析,并规定其湿度的最大值和最小值;
4.使用光敏电阻测量光照量
5.不同模式的选择。

2.1.2 土壤湿度测量方案

检测土壤湿度的相关活动在众多的部门中都得到了广泛的应用,其中主要包括:科研单位、工业制造、气象监测等,然而在一般的情况中,对于土壤水分的检测并不是唯一的数据。因为土壤湿度会受到大气压强、温度或人类甚至无法察觉的因素影响。
如今,对于土壤湿度的测量我们通常有2种方法,分别是干湿球与电子湿度传感器。下面是对两种方法展开的对比研究,旨在选择最佳的检测方法。
对于干湿球方法而言,它属于非直接的检测方法,借助对干球与湿球的两种测量从而了解其湿度。因此对工作环境的温度没有严格的限制,在环境温度比较高的情况下也不会对传感器造成损坏。所以,如果在温度较高或者环境较为恶劣的情况下,我们会优先选择干湿球法。
随着科技的不断进步,电子湿度检测在这些年得到了广泛的推崇,由于其测量数值较为精确,一般可达2%一3%RH,同时在运行的阶段对外界的影响有着较强的抗干扰能力。但使用的时间一长,传感器的精度就会有所下降,因此电子式传感器比较适用于工作在常温、稳定的环境中。

二、系统软件设计

1 系统流程图

系统软件设计包括对土壤湿度检测程序、对采集到的数据进行处理的程序、设置湿度上下限的程序、按键程序、显示程序等。主程序流程如图13所示。
在这里插入图片描述

图14 程序流程图

三、系统软件设计

1 仿真软件选择

  系统仿真软件使用大学期间所学的 Protel DXP 软件,是 Altium 公司研发的软件, 具有十分完备的功能包括了丰富的元件库,而且可以自行制作添加,拥有很强的设计功能。该软件应用广泛,它可以完成设计、调试、仿真等一系列工作。
完整的回路模拟功能有以下特点:
(1)模拟设备:模拟设备选择开发商设计的仿真电路模拟器文件来实现。
(2)充足的设备选择:该软件拥有着大量的虚拟设备可供选择。
(3)形象的显示:不同的设备拥有不同的标准。

2 主要模块子程序

#include<reg52.h>
#include<LCD1602.h>
#include<ADC0832.h>
#include<INTERRUPT.h>
#include<math.h>
#include<stdio.h>
#include<EEPROM.h>
#include<DS1302.h>
sbit jidainqi  = P1^4;//自动浇花开关
sbit jidainqi_led  = P1^3;//自动浇花开关指示灯
sbit key_mode  = P3^2;//模式切换按键
sbit key_set  = P3^3;//设置
sbit key_jia  = P3^4;//加
sbit key_jian  = P2^0;//减
sbit guang  = P2^2;//光
uchar temp_ad[6];  
double temp;
uchar f=0;
uchar wei;
uchar mode;
uchar set_time=0;
uchar jiaohua_num;//浇花湿度值
uchar set_shidu=0;//按键设置标志位
uchar T0_num;
uchar ad;
char naozhong1[]={0x00,0x00,0x00};
/********************************************************
函数名称:void delayms(uint ms)
函数作用:毫秒延时函数
参数说明:
********************************************************/ 
void Delay_ms(uint ms)
{
	unsigned char i=100,j;
	for(;ms;ms--)
	{
		while(--i)
		{
			j=10;
			while(--j);
		}
	}
}
void display(void)//选择页面
{
	lcd1602_write_character(0,1,"Watering System ");	   //初始化显示的文字
	lcd1602_write_character(0,2,"  Choice mode");	   //初始化显示的文字		
}
void display1(void)//白天自动检测浇花
{   
		ad=ADC0832_read(0);
		Delay_ms(25);
		temp=(1-(double)ad/255)*100;
		if(temp<=jiaohua_num)
		{	
			if(f==0)//清屏标志位
			{
				LCD_write_command(0x01);
				delay_n40us(100);
				f=1;
			}	
			lcd1602_write_character(0,1,"Flower is Dying!");
			lcd1602_write_character(0,2," Auto Watering!");
			jidainqi=0;jidainqi_led=0;//自动浇花
		}
		else
		{	
//			if(temp<1.5)
//				wei=sprintf(temp_ad,"%0.2f",0);
//			else
			wei=sprintf(temp_ad,"%0.2f",temp);
			if(f==1)
			{
				LCD_write_command(0x01);
				delay_n40us(100);
				f=0;
			}		
			lcd1602_write_character(0,1,"  The mode one:");	   //初始化显示的文字	
			lcd1602_write_character(3,2,"         ");
			lcd1602_write_character(9-wei,2,temp_ad);
			lcd1602_write_character(9,2,"%RH");
			jidainqi=1;jidainqi_led=1;//停止浇花
		}	
}
void display4(void)//浇花湿度设置
{   
	T0_num++;
	if(T0_num==254)
		 T0_num=0;
    lcd1602_write_character(0,1," Set water num");	   //初始化显示的文字	
	if(T0_num%2==0)	//偶数次显示
	{		
		LCD_disp_char(9,2,ASCII[jiaohua_num/10]);	   //
		LCD_disp_char(10,2,ASCII[jiaohua_num%10]); 		
//	  Delay_ms(1);
	}
	else
	{
		LCD_disp_char(9,2,ASCII[jiaohua_num/10]);	   
		LCD_disp_char(10,2,ASCII[jiaohua_num%10]); 
	
	}	
}
void display2(void)//自动浇花加光照
{   
    //lcd1602_write_character(0,1,"mode two:");	   //初始化显示的文字	
		ad=ADC0832_read(0);
		Delay_ms(25);
		temp=(1-(double)ad/255)*100;
		if(temp<=jiaohua_num&&guang==1)
		{	
			if(f==0)//清屏标志位
			{
				LCD_write_command(0x01);
				delay_n40us(100);
				f=1;
			}	
			lcd1602_write_character(0,1,"Flower is Dying!");
			lcd1602_write_character(0,2," Auto Watering!");
			jidainqi=0;jidainqi_led=0;//自动浇花
		}
		else
		{	
//			if(temp<1.5)
//				wei=sprintf(temp_ad,"%0.2f",0);
//			else
				wei=sprintf(temp_ad,"%0.2f",temp);
			if(f==1)
			{
				LCD_write_command(0x01);
				delay_n40us(100);
				f=0;
			}
				if(guang==0)
					{ 
						  lcd1602_write_character(0,2,"Night");
					}
					else
					{
							lcd1602_write_character(0,2,"Day! ");
					}
			lcd1602_write_character(0,1,"  The mode two:");		   //初始化显示的文字	
			lcd1602_write_character(6,2,"      ");
			lcd1602_write_character(12-wei,2,temp_ad);
			lcd1602_write_character(12,2,"%RH");
			jidainqi=1;jidainqi_led=1;//停止浇花
		}	
}
void display3(void)//定时模式
{   
   Read_time();		       //读取时间
	 lcd1602_write_character(0,1,"The mode three:");	   //初始化显示的文字	
	LCD_disp_char(1,2,ASCII[time[4]/10]);//月	   
	LCD_disp_char(2,2,ASCII[time[4]%10]);	   
	LCD_disp_char(3,2,ASCII[11]);
	LCD_disp_char(4,2,ASCII[time[3]/10]);//日
	LCD_disp_char(5,2,ASCII[time[3]%10]);

	LCD_disp_char(7,2,ASCII[time[2]/10]);//	时   
	LCD_disp_char(8,2,ASCII[time[2]%10]);	   
	//LCD_disp_char(9,1,ASCII[11]);
	lcd1602_write_character(9,2,":");
	LCD_disp_char(10,2,ASCII[time[1]/10]);//分
	LCD_disp_char(11,2,ASCII[time[1]%10]);
	//LCD_disp_char(12,1,ASCII[11]);
	lcd1602_write_character(12,2,":");
	LCD_disp_char(13,2,ASCII[time[0]/10]);//秒
	LCD_disp_char(14,2,ASCII[time[0]%10]);	
	
  if(time[2]==naozhong1[2]&&time[1]==naozhong1[1]&&time[0]==naozhong1[0])
	{
		  jidainqi=0;jidainqi_led=0;//自动浇花	
	}	
  if(time[2]==naozhong1[2]&&(time[1]==(naozhong1[1])+1)&&time[0]==naozhong1[0])
	{
		  jidainqi=1;jidainqi_led=1;
	}	
}
void display5(void)
{
	T0_num++;
	if(T0_num==254)
		T0_num=0;

	LCD_disp_char(3,1,ASCII[11]);
	lcd1602_write_character(9,1,":");
	lcd1602_write_character(12,1,":");
	lcd1602_write_character(7,2,":");
	lcd1602_write_character(10,2,":");	

	if(T0_num%2==0)	//偶数次显示
	{		
		LCD_disp_char(1,1,ASCII[time[4]/10]);//月	   
		LCD_disp_char(2,1,ASCII[time[4]%10]);	   
		LCD_disp_char(4,1,ASCII[time[3]/10]);//日
		LCD_disp_char(5,1,ASCII[time[3]%10]);
	
		LCD_disp_char(7,1,ASCII[time[2]/10]);//	时   
		LCD_disp_char(8,1,ASCII[time[2]%10]);	   
		LCD_disp_char(10,1,ASCII[time[1]/10]);//分
		LCD_disp_char(11,1,ASCII[time[1]%10]);
		LCD_disp_char(13,1,ASCII[time[0]/10]);//秒
		LCD_disp_char(14,1,ASCII[time[0]%10]);
		
		LCD_disp_char(5,2,ASCII[naozhong1[2]/10]);//	时   
		LCD_disp_char(6,2,ASCII[naozhong1[2]%10]);	   
		LCD_disp_char(8,2,ASCII[naozhong1[1]/10]);//分
		LCD_disp_char(9,2,ASCII[naozhong1[1]%10]);
		LCD_disp_char(11,2,ASCII[naozhong1[0]/10]);//秒
		LCD_disp_char(12,2,ASCII[naozhong1[0]%10]);
		Delay_ms(1);
	}
	else			//奇数次时候设置那个量的时候那个量不显示,以达到闪烁的效果
	{
		if(set_time==1)
		{
			LCD_disp_char(1,1,ASCII[13]);	   
			LCD_disp_char(2,1,ASCII[13]);
		}
		else
		{
			LCD_disp_char(1,1,ASCII[time[4]/10]);
			LCD_disp_char(2,1,ASCII[time[4]%10]);
		}
		if(set_time==2)
		{
			LCD_disp_char(4,1,ASCII[13]);	
			LCD_disp_char(5,1,ASCII[13]);
		}
		else
		{
			LCD_disp_char(4,1,ASCII[time[3]/10]);  
			LCD_disp_char(5,1,ASCII[time[3]%10]);
		}	
		if(set_time==3)
		{
			LCD_disp_char(7,1,ASCII[13]);
			LCD_disp_char(8,1,ASCII[13]);
		}
		else
		{
			LCD_disp_char(7,1,ASCII[time[2]/10]);
			LCD_disp_char(8,1,ASCII[time[2]%10]);
		}
		if(set_time==4)
		{
			LCD_disp_char(10,1,ASCII[13]);
			LCD_disp_char(11,1,ASCII[13]);
		}
		else
		{
			LCD_disp_char(10,1,ASCII[time[1]/10]);
			LCD_disp_char(11,1,ASCII[time[1]%10]);
		}
		if(set_time==5)
		{
			LCD_disp_char(13,1,ASCII[13]);
			LCD_disp_char(14,1,ASCII[13]);
		}
		else
		{
			LCD_disp_char(13,1,ASCII[time[0]/10]);
			LCD_disp_char(14,1,ASCII[time[0]%10]);
		}
		if(set_time==6)
		{
			LCD_disp_char(5,2,ASCII[13]);
			LCD_disp_char(6,2,ASCII[13]);
		}
		else
		{
			LCD_disp_char(5,2,ASCII[naozhong1[2]/10]);
			LCD_disp_char(6,2,ASCII[naozhong1[2]%10]);
		}
		if(set_time==7)
		{
			LCD_disp_char(8,2,ASCII[13]);
			LCD_disp_char(9,2,ASCII[13]);
		}
		else
		{
			LCD_disp_char(8,2,ASCII[naozhong1[1]/10]);
			LCD_disp_char(9,2,ASCII[naozhong1[1]%10]);
		}		
		if(set_time==8)
		{
			LCD_disp_char(11,2,ASCII[13]);
			LCD_disp_char(12,2,ASCII[13]);
		}
		else
		{
			LCD_disp_char(11,2,ASCII[naozhong1[0]/10]);
			LCD_disp_char(12,2,ASCII[naozhong1[0]%10]);
		}	

	}
}
/********************************************************
函数名称:void scan(void)
函数作用:按键检测函数
参数说明:
********************************************************/ 
void scan(void)
{	
	//模式按键
	if(key_mode==0)
	{
		Delay_ms(7);
		if(key_mode==0)
		{		
      jidainqi=1;jidainqi_led=1;//浇花			
			LCD_write_command(0x01);//清除屏幕显示
			delay_n40us(100);		//实践证明,我的 LCD1602 上,用 for 循环 200 次就能可靠完成清屏指令。				
			mode++;set_shidu=0;set_time=0;	
			jidainqi=1;jidainqi_led=1;//停止浇花
			if(mode==4)
			{
				mode=0;
				EEPROM_delete(0x2202);				//擦除扇区
				EEPROM_write(0x2202,naozhong1[2]);//	
				EEPROM_delete(0x2402);				//擦除扇区
				EEPROM_write(0x2402,naozhong1[1]);//		
				EEPROM_delete(0x2602);				//擦除扇区
				EEPROM_write(0x2602,naozhong1[0]);//						
			  display();
			}
			if(mode==2)
			{
				 EEPROM_delete(0x2002);				//擦除扇区
				 EEPROM_write(0x2002,jiaohua_num);//	
			}			
		}
		while(!key_mode);//检测按键松开
	 }
	//设置键,不支持连按
	if(key_set==0)
	{
		Delay_ms(7);
		if(key_set==0&&mode==1)
		{			
			LCD_write_command(0x01);//清除屏幕显示
			delay_n40us(100);		//实践证明,我的 LCD1602 上,用 for 循环 200 次就能可靠完成清屏指令。			
      set_shidu++;
			jidainqi=1;jidainqi_led=1;//停止浇花
      if(set_shidu==2)	
      {
				 set_shidu=0;
				 EEPROM_delete(0x2002);				//擦除扇区
				 EEPROM_write(0x2002,jiaohua_num);//				
				 display1();
			}				
		}
		if(key_set==0&&mode==3)
		{		
      set_time++;
      if(set_time==1)	
			{
				 LCD_write_command(0x01);//清除屏幕显示
			   delay_n40us(100);		//实践证明,我的 LCD1602 上,用 for 循环 200 次就能可靠完成清屏指令?
			}				
      if(set_time>8)	
      {
				 set_time=0;
					EEPROM_delete(0x2202);				//擦除扇区
					EEPROM_write(0x2202,naozhong1[2]);//	
					EEPROM_delete(0x2402);				//擦除扇区
					EEPROM_write(0x2402,naozhong1[1]);//		
					EEPROM_delete(0x2602);				//擦除扇区
					EEPROM_write(0x2602,naozhong1[0]);//					
				 LCD_write_command(0x01);//清除屏幕显示
			   delay_n40us(100);		//实践证明,我的 LCD1602 上,用 for 循环 200 次就能可靠完成清屏指令。	
			   display3();
			}				
		}		
		while(!key_set);//检测按键松开
	 }	
	 //加
	if(key_jia==0&&mode==1)
	{
		Delay_ms(5);
		if(key_jia==0&&mode==1&&set_shidu==1)//设置上限值
		{
			jiaohua_num++;	   //上限自加
			if(jiaohua_num==91)
				jiaohua_num=90;						
			display4();//显示
		}	
	}
	//减
	if(key_jian==0&&mode==1)
	{
		Delay_ms(5);
		if(key_jian==0&&mode==1&&set_shidu==1)//设置下限
		{
			jiaohua_num--;	   //
			if(jiaohua_num<6)
				jiaohua_num=5;						
			display4();//显示
		}	
	}
	//加值键,支持连按
	if(key_jia==0&&mode==3)
	{
		Delay_ms(7);
		if(key_jia==0&&set_time==1)//设置月
		{
			time[4]++;
			if(time[4]>12)
				time[4]=1;
			time1[4]=(time[4]/10)*16+time[4]%10;
			if(time1[4]>0x12)
				time1[4]=0x01;
			Writeds1302 (WRITE_MONTH,time1[4]);				
		}
		if(key_jia==0&&set_time==2)//设置日
		{
			time[3]++;
			if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)
			{
				if(time[3]>31)
				time[3]=1;
			}
			else
			{
				if(time[4]==2)
				{
					if(time[6]%4==0)
					{
						if(time[3]>28)
						time[3]=1;
					}
					else
					{
						if(time[3]>29)
						time[3]=1;
					}
				}
				else
				{
					if(time[3]>30)
					time[3]=1;
				}
			}
			time1[3]=(time[3]/10)*16+time[3]%10;
			if(time1[4]==0x01||time1[4]==0x03||time1[4]==0x05||time1[4]==0x07||time1[4]==0x08||time1[4]==0x10||time1[4]==0x12)
			{
				if(time1[3]>0x31)
				time1[3]=0x01;
			}
			else
			{
				if(time1[4]==0x02)
				{
					if(time1[6]%4==0)
					{
						if(time1[3]>0x28)
						time1[3]=0x01;
					}
					else
					{
						if(time1[3]>0x29)
						time1[3]=0x01;
					}
				}
				else
				{
					if(time1[3]>0x30)
					time1[3]=0x01;
				}
			}	
			Writeds1302 (WRITE_DAY,time1[3]);			
		}
		if(key_jia==0&&set_time==3)//设置时
		{
			time[2]++;
			if(time[2]>23)
				time[2]=0;
			time1[2]=(time[2]/10)*16+time[2]%10;
			if(time1[2]>0x23)
				time1[2]=0x00;
			Writeds1302 (WRITE_HOUR,time1[2]);			
		}
		if(key_jia==0&&set_time==4)//设置分
		{
			time[1]++;
			if(time[1]>59)
				time[1]=0;
			time1[1]=(time[1]/10)*16+time[1]%10;
			if(time1[1]>0x59)
				time1[1]=0x00;
			Writeds1302 (WRITE_MINUTE,time1[1]);				
		}
		if(key_jia==0&&set_time==5)//设置秒
		{
			time[0]++;
			if(time[0]>59)
				time[0]=0;
			time1[0]=(time[0]/10)*16+time[0]%10;
			if(time1[0]>0x59)
				time1[0]=0x00;
			Writeds1302 (WRITE_SECOND,time1[0]);				
		}
		if(key_jia==0&&set_time==6)
		{
			naozhong1[2]++;
			if(naozhong1[2]>23)
				naozhong1[2]=00;
		}
		if(key_jia==0&&set_time==7)
		{
			naozhong1[1]++;
			if(naozhong1[1]>59)
				naozhong1[1]=00;	
		}
		if(key_jia==0&&set_time==8)
		{
			naozhong1[0]++;
			if(naozhong1[0]>59)
				naozhong1[0]=00;
		}		
  }		
	//减值键,支持连按
	if(key_jian==0&&mode==3)
	{
			Delay_ms(7);	
    if(key_jian==0&&set_time==1)//设置月
		{
			time[4]--;
			if(time[4]<1)
				time[4]=12;
			time1[4]=(time[4]/10)*16+time[4]%10;
			if(time1[4]<0x01)
				time1[4]=0x12;
			Writeds1302 (WRITE_MONTH,time1[4]);		
		}
	  if(key_jian==0&&set_time==2)//设置日
		{
			time[3]--;
			if(time[4]==1||time[4]==3||time[4]==5||time[4]==7||time[4]==8||time[4]==10||time[4]==12)
			{
				if(time[3]<1)
				time[3]=31;
			}
			else
			{
				if(time[4]==2)
				{
					if(time[6]%4==0)
					{
						if(time[3]<1)
						time[3]=28;
					}
					else
					{
						if(time[3]<1)
						time[3]=29;
					}
				}
				else
				{
					if(time[3]<1)
					time[3]=30;
				}
			}	
			time1[3]=(time[3]/10)*16+time[3]%10;
			if(time1[4]==0x01||time1[4]==0x03||time1[4]==0x05||time1[4]==0x07||time1[4]==0x08||time1[4]==0x10||time1[4]==0x12)
			{
				if(time1[3]<0x01)
				time1[3]=0x31;
			}
			else
			{
				if(time1[4]==0x02)
				{
					if(time1[6]%4==0)
					{
						if(time1[3]<0x01)
						time1[3]=0x28;
					}
					else
					{
						if(time1[3]<0x01)
						time1[3]=0x29;
					}
				}
				else
				{
					if(time1[3]<0x01)
					time1[3]=0x30;
				}
			}	
			Writeds1302 (WRITE_DAY,time1[3]);	
		}
	  if(key_jian==0&&set_time==3)//设置时
		{
			time[2]--;
			if(time[2]<00)
				time[2]=23;
			time1[2]=(time[2]/10)*16+time[2]%10;
			if(time1[2]<0x00)
				time1[2]=0x23;
			Writeds1302 (WRITE_HOUR,time1[2]);
		}
		if(key_jian==0&&set_time==4)//设置分
		{
			time[1]--;
			if(time[1]<00)
				time[1]=59;
			time1[1]=(time[1]/10)*16+time[1]%10;
			if(time1[1]<0x00)
				time1[1]=0x59;
			Writeds1302 (WRITE_MINUTE,time1[1]);		
		}
		if(key_jian==0&&set_time==5)//设置秒
		{
			time[0]--;
			if(time[0]<00)
				time[0]=59;
			time1[0]=(time[0]/10)*16+time[0]%10;
			if(time1[0]==0x00)
				time1[0]=0x59;
			Writeds1302 (WRITE_SECOND,time1[0]);
		}
		if(key_jian==0&&set_time==6)
		{
			naozhong1[2]--;
			if(naozhong1[2]<0)
				naozhong1[2]=23;
		}
		if(key_jian==0&&set_time==7)
		{
			naozhong1[1]--;
			if(naozhong1[1]<0)
				naozhong1[1]=59;
		}
		if(key_jian==0&&set_time==8)
		{
			naozhong1[0]--;
			if(naozhong1[0]<0)
				naozhong1[0]=59;
		}	
   //while(!key_jian);//检测按键松开		
	}		
}
void main()
{
	LCD_init();
	jiaohua_num=EEPROM_read(0x2002);	  //
  naozhong1[2]=EEPROM_read(0x2202);
	naozhong1[1]=EEPROM_read(0x2402);
	naozhong1[0]=EEPROM_read(0x2602);
	//DS1302_init();
//	T0_init();
	while(1)
	{ 
		scan();
		if(mode==0)   //没有按键按下去去时候
		{		
			display();     
		}
		if(mode==1&&set_shidu==0)   //湿度控制
		{
			display1();	
		}
		if(mode==1&&set_shidu!=0) //设置浇花数值
		{		
			display4();	
		}				
		if(mode==2)//湿度结合光控制
		{
		  display2();
		}
		if(mode==3&&set_time==0)  //定时模式
		{		 
			display3();	
		}	
		if(mode==3&&set_time!=0)  //定时模式设置
		{		 
			display5();	
		}			
	}
}

实物图

在这里插入图片描述

五、 文章目录

目 录
摘 要 I
Abstract II
1 引言 1
1.1 系统开发的背景与意义 1
1.2 国内外研究的现状 2
1.3 设计内容与实现目标 4
2 系统总体设计框架 5
2.1 系统设计需求分析 5
2.2 系统方案设计 5
2.3 器件选型 6
2.3.1 超声波模块选型 6
2.3.2 单片机选型 6
2.3.3 数码管选型 6
3 系统硬件设计 7
3.1 单片机电路 7
3.2 超声波检测电路 10
3.3 显示电路 11
4 系统软件设计 12
4.1 软件开发和环境介绍 12
4.2 仿真软件选择 14
4.3 主要模块子程序 14
5 系统焊接调试与性能验证 18
5.1 电路焊接 18
5.2 系统软硬件调试 19
5.3 系统调试及结果 20
6 结束语 23
参考文献 24
致 谢 25
附 录 26
附录1 原理图 26
附录2 元件清单 27
附录3 源程序 28

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值