#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
上一篇:PIC单片机 读/写 MMC/SD 卡的简单小程序
下一篇:PIC单片机的USB接口的应用 一个简单的USB CDC 测试程序
推荐阅读最新更新时间:2024-11-04 12:10
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LTC6905CS5-100 的参考设计
- 使用 Diodes Incorporated 的 ZR78L052 的参考设计
- STC8H8K64U开发板———天问Block
- 带有 DRP w/Try.SRC 和 Type-C 插座的 PTN5110 USB PD 的典型应用
- HV9931DB1v2、120VAC 输入、350mA/40V (14W) 输出 LED 驱动器演示板
- EVAL-AD1938AZ,评估板 评估 AD1938 具有 PLL 192 kHz、24 位编解码器的四个 ADC/八个 DAC
- AM1G-4815DH30Z ±15V 1 瓦 DC/DC 转换器的典型应用
- #第八届立创电赛#数码管时钟
- NCP4304B 次级侧同步整流驱动器的典型应用,用于 LLC 转换器的高效 SMPS 拓扑
- 使用 Analog Devices 的 LTC2369 的参考设计