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

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

基本任务:

要求“模拟智能灌溉系统”能够实现土壤

湿度测量、土壤湿度和时间显示、湿度阈值设

定及存储

等基本功能。通过电位器

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

#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();

}

}

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: