|
版權(quán)所有,謝絕轉(zhuǎn)載,此程序僅供學(xué)習(xí)參考,請勿做商業(yè)用途,謝謝!
#include<htc.h>
#include "main.h"
__CONFIG(MCLRDIS&WDTDIS&PROTECT&INTRC); //設(shè)置配置位(MCLR腳復(fù)位禁止,看門狗關(guān),無代碼保護(hù),內(nèi)部RC振蕩)
volatile unsigned char Key_Flag=0; /*****用于識別按鍵是否按下的標(biāo)志*****/
volatile unsigned char Fluid_Flag=0; //流量標(biāo)志
volatile unsigned char Press_Flag=0; //壓力標(biāo)志
volatile unsigned char Test_Count=0; //轉(zhuǎn)存計數(shù)器計數(shù)值
volatile unsigned char Time_Flag=0; //時間次數(shù)標(biāo)志
/*****延時毫秒級函數(shù)*****/
void Delay_Ms(unsigned char Ms_Time)
{
unsigned char t;
while(Ms_Time--)
{
for(t=0;t<165;t++);
}
}
/*****延時秒級函數(shù)*****/
void Delay_Sec(unsigned char Sec_Time)
{
unsigned char m;
for(m=0;m<Sec_Time;m++)
{
Delay_Ms(251);
Delay_Ms(251);
Delay_Ms(251);
Delay_Ms(252);
}
}
/*********按鍵掃描函數(shù)**********/
void Key_Scan(void)
{
Key_Flag=0; //掃描鍵盤之前先將按鍵標(biāo)志清零
if(Key==0)
{
Delay_Ms(10); //延時去抖
if(Key==0)
{
while(!Key); //等待K1鍵釋放
Key_Flag=1;
}
}
}
/*********流量壓力監(jiān)測函數(shù)**********/
void DetectWater(void)
{
unsigned char Num=30; //壓力檢測次數(shù)
unsigned char Press_Count=0; //壓力計數(shù)器
Press_Flag=0;
Fluid_Flag=0;
TMR0=0x00;
do
{
if(Press_In==1) //有壓力,則壓力計數(shù)器加1
{
Press_Count++;
}
Delay_Ms(100); //延時
Num--; //壓力檢測次數(shù)減1
}while(Num); //壓力檢測完成
if(Press_Count>=20) //壓力數(shù)據(jù)處理
{
Press_Flag=1;
}
else
{
Press_Flag=0;
}
Test_Count=TMR0; //讀取計數(shù)器的計數(shù)值,存入Test_Count
if(Test_Count>=3) //流量數(shù)據(jù)處理
{
Fluid_Flag=1;
}
else
{
Fluid_Flag=0;
}
}
/*********主函數(shù)***********/
void main(void)
{
Delay_Ms(20); //上電延時100毫秒,以保證電源可靠供電
OPTION=0xE0; //計數(shù)器初始化
TRIS = 0xFC; //繼電器和LED_RED設(shè)為輸出 壓力設(shè)為輸入,流量使用T0CKI輸入計數(shù)
TMR0= 0x00;
Red_Led=0; //紅燈熄滅
Relay_Out=1; //水泵強(qiáng)制啟動8秒
Delay_Sec(7);
DetectWater(); //流量壓力檢測
while(1)
{
/**************正常供水開始*********************/
if(Fluid_Flag==1) //只要有流量,則水泵一直啟動正常供水
{
Time_Flag=1; //進(jìn)入正常供水標(biāo)志
Red_Led=0; //紅燈熄滅
Relay_Out=1;
do
{
DetectWater();
}
while(Fluid_Flag); //沒有流量,則終止循環(huán)
}
/**************正常供水完成*********************/
/**************保壓停機(jī)開始*********************/
if((Fluid_Flag==0)&&(Press_Flag==1)) //沒有流量,有壓力則進(jìn)入保壓停機(jī)
{
unsigned char Detect_Num=30;
Time_Flag=1; //進(jìn)入保壓停機(jī)標(biāo)志
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;
}
}
/**************保壓停機(jī)完成*********************/
/**************缺水保護(hù)開始*********************/
if((Fluid_Flag==0)&&(Press_Flag==0)) //沒有流量,沒有壓力則進(jìn)入缺水循環(huán)
{
unsigned char Check_Num=7;
unsigned int Number=0;
Red_Led=1;
if(Time_Flag==1) //識別是從開始就缺水還是從正常供水轉(zhuǎn)入到缺水狀態(tài)
{
Check_Num=10;
}
do //繼續(xù)運(yùn)行20秒后水泵停機(jī),同時紅燈亮
{
DetectWater();
Check_Num--;
}
while((!Fluid_Flag)&&(Check_Num));
if(Fluid_Flag==1)
{
break;
}
/************缺水停30秒,若有按鍵按下,則重新啟動******************/
Relay_Out=0;
Check_Num=60;
do //缺水停30秒,期間進(jìn)行按鍵掃描,并且紅燈閃爍
{
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)); //時間到或者有按鍵按下,跳出循環(huán)
if(Key_Flag==1) //有按鍵按下,則重新啟動并檢測
{
break;
}
/************30秒停止時間到,進(jìn)入啟動4分鐘檢測水流和水壓流量和壓力*************/
Relay_Out=1;
Red_Led=1;
Delay_Sec(8);
Check_Num=78;
do
{
DetectWater();
Check_Num--;
}
while((!Fluid_Flag)&&(Check_Num)); //有流量或者啟動4分鐘時間到,則跳出循環(huán)
if(Fluid_Flag==1) //有流量則跳出循環(huán)返回到while循環(huán)
{
break;
}
/************時間到,則進(jìn)入停止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;
}
/**************缺水保護(hù)完成*********************/
}
}
#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
|
|