蓝桥杯真题——模拟灌溉系统

                                 尽量每天都自己写一遍模板,记住模板就好写了 

                                                   以下内容直接在模板内进行


基本任务:
要求“模拟智能灌溉系统”能够实现土壤 湿度测量、土壤湿度和时间显示、湿度阈值设
定及存储 等基本功能。通过电位器 Rb2 输出电压信号,模拟湿度传感器输出信号,再通过
AD 采集完成湿度测量功能;通过 DS1302 芯片提供时间信息;通过按键完成灌溉系统控制
和湿度阈值调整功能,通过 LED 完成系统工作状态指示功能。系统硬件电路主要由单片机
控制电路、显示单元、 ADC 采集单元、 RTC 单元、 EEPROM 存储单元、继电器控制电路及
报警输出电路组成.

系统功能:

1.1 自动工作状态,根据湿度数据自动控制打开或关闭灌溉设备( 初始状态),以 L1 点亮指示
1.2 手动工作状态,通过按键控制打开或关闭灌溉设备,以 L2 点亮指示
1.3 系统上电后处于自动工作状态,系统初始湿度阈值为 50% ,此时若湿度低于
50% 灌溉设备自动打开,达到 50% 后,灌溉设备自动关闭
1.4 灌溉设备打开或关闭通过继电器工作状态模拟  

我们现在就要一步步进行下去:

1.我们先来实现DS1302 

“模拟智能灌溉系统”通过读取 DS1302 时钟芯片相关寄存器获得时间, DS1302
芯片时、分、秒寄存器在程序中设定为系统进行初始化设定,时间为 08 30
开始为     ucRtc(0x80,0x30,0x00)

我们通过读取函数来读取这个时间值 Read_Rtc[ucRtc];然后在主函数设置Set_Rtc(ucRtc);

2. 湿度显示:

以电位 Rb2 输出电压信号模拟湿度传感器输出信号,且假定电压信号与湿度成正
比例关系 H 湿度 = KV Rb2 K 为常数), Rb2 电压输出为 5V 时对应湿度为 99%

湿度我们是能够控制的,他就包括了阈值 控制值,以及一个显示值。

Humidity = Ad_Read(0x03) / 2.56;我们让AD读取R3的值给到湿度,之后也可以调试

3.按键功能:

S7为模式切换功能,初始为自动模式,按下后为手动。

自动工作状态下按键 S6 S5 S4 功能设定如下:
S6 功能设定为 湿度阈值调整按键 ,按下 S6 后,进入 湿度阈值调整界面 ( 如图 3
所示 ) ,此时 按下 S5 为湿度阈值加 1 ,按下 S4 湿度阈值减 1, 再次 按下 S6 后,系
统将新的湿度阈值保存到 EEPROM 中,并退出湿度阈值设定界面。

这也就是我们再 Mode 0 状态下,通过按键完成的功能加上条件就可以。

4.Led显示模式:

这个比较简单后续再继续补充纤细内容

/* 和参考的区别最大的在于内容写入的内容不同 */

/* Í·ÎļþÉùÃ÷Çø */
#include <STC15F2K60S2.H>
#include "LED.h"
#include "key.h"
#include "Seg.h"
#include "HC573.h"
#include "init.h"
#include "ds1302.h"
#include "iic.h"
#include "onewire.h"


/* ±äÁ¿ÉùÃ÷Çø */
unsigned char Key_Down,Key_Val,Key_Old,Key_Up;
unsigned char Key_Slow_Down;

unsigned char Seg_Buf[8]={10,10,10,10,10,10,10,10};
unsigned char Seg_Point[8]={0,0,0,0,0,0,0,0};
unsigned char Seg_Pos;
unsigned int Seg_Slow_Down;

unsigned char ucRtc[3]={0x08,0x30,0x00};
unsigned char ucLed[8]={0,0,0,0,0,0,0,0};

unsigned char Seg_Mode = 0;
unsigned char Seg_Mode_set = 0;

bit Work_Mode = 0;
bit Beep_Flag = 0;

unsigned char Humidity;
unsigned char Hum_Disp = 50;
unsigned char Hum_Ctrol = 50;

/* °´¼ü´¦ÀíÇø */
void Key_Proc()
{
	if(Key_Slow_Down) return;
	Key_Slow_Down =1;
	
	Key_Val = Key_Read();
	Key_Down = Key_Val & (Key_Old ^ Key_Val);
	Key_Up = ~Key_Val & (Key_Old ^ Key_Val);
	Key_Old = Key_Val;
	
	switch(Key_Down)
	{
		
		case 7:
			Work_Mode ^= 1; //	Çл»Ä£Ê½

			break;
		
		case 6:
			if(Work_Mode == 0 && Seg_Mode ==0) //×Ô¶¯Ä£Ê½£¬½øÈëãÐֵ״̬
			{
				Seg_Mode = 2;
			}
			if(Work_Mode == 0 && Seg_Mode ==2 && Seg_Mode_set==1) //Ìø³öÅжÏÌõ¼þ£¬Ð´Èë¿ØÖƲÎÊý
			{
				Hum_Ctrol = Hum_Disp;
				EEPROM_Write(&Hum_Disp,0,1); //±£´æãÐÖµ²ÎÊý
				Seg_Mode_set=0;
				Seg_Mode = 0;
			}
			
			break;
			if(Work_Mode == 1) //ÊÖ¶¯Ä£Ê½
			{
				Beep_Flag ^= 1;
			}
			
			break;
			
		case 5:
			if(Seg_Mode == 2 && Work_Mode ==0)
			{
				 Seg_Mode_set = 1;
				if(++Hum_Disp == 100)
				{EEPROM_Write(&Hum_Disp,0,1);	Hum_Ctrol = Hum_Disp;	Hum_Disp = 99;}
			}
			if(Work_Mode == 1)
			{Relay(1);}
			break;
			
		case 4:
			if(Seg_Mode == 2 && Work_Mode ==0)
			{
				Seg_Mode_set = 1;
				if(--Hum_Disp == 255)
				{EEPROM_Write(&Hum_Disp,0,1);Hum_Ctrol = Hum_Disp;	Hum_Disp = 0;}
						
			}
			if(Work_Mode == 1)
			{Relay(0);}
			
			break;
			
			


	}
	
}

/* Êý¾Ý´¦ÀíÇø */
void Seg_Proc()
{
	if(Seg_Slow_Down) return;
	Seg_Slow_Down =1;
	
	/* Êý¾Ý¶ÁÈ¡ÇøÓò */
   Read_Rtc(ucRtc);
	 Humidity = Ad_Read(0x03) / 2.56;

	
	/* Êý¾ÝÏÔʾÇøÓò */
	switch(Seg_Mode)
	{
		case 0: //ÉϵçÏÔʾʵʱ״̬
		/* ×Ô¶¯Ä£Ê½ */
	  
		Seg_Buf[0] = ucRtc[0] / 16;
		Seg_Buf[1] = ucRtc[0] % 16;
		Seg_Buf[3] = ucRtc[1] / 16;
		Seg_Buf[4] = ucRtc[1] % 16;
		Seg_Buf[2] = 11;
		 // ζÈÏÔʾ
		Seg_Buf[6] = Humidity / 10;
		Seg_Buf[7] = Humidity % 10;
		break;
		
		case 1:
		Seg_Buf[0] = ucRtc[0] / 16;
		Seg_Buf[1] = ucRtc[0] % 16;
		Seg_Buf[3] = ucRtc[1] / 16;
		Seg_Buf[4] = ucRtc[1] % 16;
		Seg_Buf[2] = 11;
		 // ζÈÏÔʾ
		Seg_Buf[6] = Humidity / 10;
		Seg_Buf[7] = Humidity % 10;
		break;
		
		case 2: //ÏÔʾãÐÖµ
		Seg_Mode_set=1;
		Seg_Buf[0] = Seg_Buf[1] = 11;
		Seg_Buf[2] = Seg_Buf[3] = Seg_Buf[4] = 10;
		Seg_Buf[6] = Hum_Disp / 10;
		Seg_Buf[7] = Hum_Disp % 10;
		break;
		
	}
}


void Led_Proc()
{
	if(Work_Mode ==0)
	{
		ucLed[0] = 1;ucLed[1]=0;
		if(Humidity >=50)
			Relay(0);
		else
			Relay(1);
	
	}
	if(Work_Mode ==1)
	{ucLed[0] = 0;ucLed[1]=1;Beep(Beep_Flag);}
	
}


void Timer0Init(void)		//@12.000MHz
{
	AUXR &= 0x7F;		
	TMOD &= 0xF0;		
	TL0 = 0x18;		
	TH0 = 0xFC;		
	TF0 = 0;	
	TR0 = 1;		
	
	ET0 = 1;    
	EA = 1;     
}


void Timer0Server() interrupt 1
{  
 
	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;
	if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;
	if(++Seg_Pos == 8) Seg_Pos = 0;

	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
	Led_Disp(Seg_Pos,ucLed[Seg_Pos]);
}



void main()
{
	Humidity = Ad_Read(0x03) / 2.56; //Ö÷º¯ÊýÔÙ¶ÁÒ»´Î
	Hum_Disp = Hum_Ctrol; //±ãÓÚ¸ÄÕý
	EEPROM_Read(&Hum_Disp,0,1);//¶ÁÈ¡ãÐÖµ²ÎÊý
	System_init();
	Timer0Init();
	Set_Rtc(ucRtc);
	while(1)
	{
		Key_Proc();
		Led_Proc();
		Seg_Proc();
	}
}
	






猜你喜欢

转载自blog.csdn.net/ArtoriaLili/article/details/129760590