尽量每天都自己写一遍模板,记住模板就好写了
以下内容直接在模板内进行
基本任务:要求“模拟智能灌溉系统”能够实现土壤 湿度测量、土壤湿度和时间显示、湿度阈值设定及存储 等基本功能。通过电位器 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();
}
}