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