#include
#include "main.h"
__CONFIG(MCLRDIS&WDTDIS&PROTECT&INTRC); //设置配置位(MCLR脚复位禁止,看门狗关,无代码保护,内部RC振荡)
volatile unsigned char Key_Flag=0; /*****用于识别按键是否按下的标志*****/
volatile unsigned char Fluid_Flag=0; //流量标志
volatile unsigned char Press_Flag=0; //压力标志
volatile unsigned char Test_Count=0; //转存计数器计数值
volatile unsigned char Time_Flag=0; //时间次数标志
/*****延时毫秒级函数*****/
void Delay_Ms(unsigned char Ms_Time)
{
unsigned char t;
while(Ms_Time--)
{
for(t=0;t<165;t++);
}
}
/*****延时秒级函数*****/
void Delay_Sec(unsigned char Sec_Time)
{
unsigned char m;
for(m=0;m
{
Delay_Ms(251);
Delay_Ms(251);
Delay_Ms(251);
Delay_Ms(252);
}
}
/*********按键扫描函数**********/
void Key_Scan(void)
{
Key_Flag=0; //扫描键盘之前先将按键标志清零
IF(Key==0)
{
Delay_Ms(10); //延时去抖
if(Key==0)
{
while(!Key); //等待K1键释放
Key_Flag=1;
}
}
}
/*********流量压力监测函数**********/
void DetectWater(void)
{
unsigned char Num=30; //压力检测次数
unsigned char Press_Count=0; //压力计数器
Press_Flag=0;
Fluid_Flag=0;
TMR0=0x00;
do
{
if(Press_In==1) //有压力,则压力计数器加1
{
Press_Count++;
}
Delay_Ms(100); //延时
Num--; //压力检测次数减1
}while(Num); //压力检测完成
if(Press_Count>=20) //压力数据处理
{
Press_Flag=1;
}
else
{
Press_Flag=0;
}
Test_Count=TMR0; //读取计数器的计数值,存入Test_Count
if(Test_Count>=3) //流量数据处理
{
Fluid_Flag=1;
}
else
{
Fluid_Flag=0;
}
}
/*********主函数***********/
void main(void)
{
Delay_Ms(20); //上电延时100毫秒,以保证电源可靠供电
OPTION=0xE0; //计数器初始化
TRIS = 0xFC; //继电器和LED_RED设为输出 压力设为输入,流量使用T0CKI输入计数
TMR0= 0x00;
Red_Led=0; //红灯熄灭
Relay_Out=1; //水泵强制启动8秒
Delay_Sec(7);
DetectWater(); //流量压力检测
while(1)
{
/**************正常供水开始*********************/
if(Fluid_Flag==1) //只要有流量,则水泵一直启动正常供水
{
Time_Flag=1; //进入正常供水标志
Red_Led=0; //红灯熄灭
Relay_Out=1;
do
{
DetectWater();
}
while(Fluid_Flag); //没有流量,则终止循环
}
/**************正常供水完成*********************/
/**************保压停机开始*********************/
if((Fluid_Flag==0)&&(Press_Flag==1)) //没有流量,有压力则进入保压停机
{
unsigned char Detect_Num=30;
Time_Flag=1; //进入保压停机标志
TMR0=0;
do
{
Delay_Ms(100);
Detect_Num--;
}
while(Detect_Num);
Test_Count=TMR0;
if(Test_Count>=3)
{
break;
}
else
{
Relay_Out=0;
while(1)
{
TMR0=0;
Detect_Num=30;
do
{
Delay_Ms(90);
Key_Scan();
Detect_Num--;
}
while((Detect_Num)&&(!Key_Flag)&&(Press_In));
Test_Count=TMR0;
if((Test_Count>=3) || (Key_Flag) || (Press_In==0))
{
break;
}
}
break;
}
}
/**************保压停机完成*********************/
/**************缺水保护开始*********************/
if((Fluid_Flag==0)&&(Press_Flag==0)) //没有流量,没有压力则进入缺水循环
{
unsigned char Check_Num=7;
unsigned int Number=0;
Red_Led=1;
if(Time_Flag==1) //识别是从开始就缺水还是从正常供水转入到缺水状态
{
Check_Num=10;
}
do //继续运行20秒后水泵停机,同时红灯亮
{
DetectWater();
Check_Num--;
}
while((!Fluid_Flag)&&(Check_Num));
if(Fluid_Flag==1)
{
break;
}
/************缺水停30秒,若有按键按下,则重新启动******************/
Relay_Out=0;
Check_Num=60;
do //缺水停30秒,期间进行按键扫描,并且红灯闪烁
{
Red_Led=0;
Delay_Ms(240);
Key_Scan(); //扫描按键
if(!Key_Flag)
{
Red_Led=1;
Delay_Ms(240);
Key_Scan();
Check_Num--;
}
}
while((!Key_Flag)&&(Check_Num)); //时间到或者有按键按下,跳出循环
if(Key_Flag==1) //有按键按下,则重新启动并检测
{
break;
}
/************30秒停止时间到,进入启动4分钟检测水流和水压流量和压力*************/
Relay_Out=1;
Red_Led=1;
Delay_Sec(8);
Check_Num=78;
do
{
DetectWater();
Check_Num--;
}
while((!Fluid_Flag)&&(Check_Num)); //有流量或者启动4分钟时间到,则跳出循环
if(Fluid_Flag==1) //有流量则跳出循环返回到while循环
{
break;
}
/************时间到,则进入停止3小时**************/
Relay_Out=0;
Number=22587;
do
{
Red_Led=0;
Delay_Ms(240);
Key_Scan(); //扫描按键
if(!Key_Flag)
{
Red_Led=1;
Delay_Ms(240);
Key_Scan();
Number--;
}
}
while((!Key_Flag)&&(Number));
break;
}
/**************缺水保护完成*********************/
}
}
#ifndef __MAIN_H__
#define __MAIN_H__
#define Relay_Out GP0
#define Red_Led GP1
#define Fluid_In GP2
#define Press_In GP3
#define Key GP4
void Delay_Ms(unsigned char Ms_Time);
void Delay_Sec(unsigned char Sec_Time);
void GPIO_Port_Init(void);
void Start_Count_Fluid(void);
void Stop_Count_Fluid(void);
void Detect_Water(void);
void Key_Scan(void);
#endif