历史上的今天
今天是:2024年11月06日(星期三)
2019年11月06日 | PIC12F508项目程序
2019-11-06 来源:51hei
#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
史海拾趣
|
跪求高手指点: 在安装凌华采集卡驱动时,系统提示:If your drivers DO NOT perform DMA and INTERUPT Operation , & ...… 查看全部问答> |
|
本人新做一个有关数据采集的项目,问些比较菜的问题~!! 见笑啊 数据采集卡是12位的,用256k的频率进行数据采集,fifo缓冲区是8k*16bit。 我想知道这个缓冲区能存多少个数,缓冲区存满需要多 ...… 查看全部问答> |
|
就拿我们现实中普通的计数器来说吧,当我按下1键后,在它内部会产生什么情况?难道会产生一股电流?这股电流如何把1这个信息存储在内部某个元件上啊?这个元件是如何存储它的啊?我需要详细的了解最最底层的原理啊,硬件是如何识别0和1的?如何存储 ...… 查看全部问答> |
|
各位大师们好 我现在在三星Armv4-2410ep教学开发板上做串口通信的开发。我是在Windows Ce 4.2的平台下作的。台子上的Serial 0,我可以轻松搞定,可是Serial 2我怎么调也调不成功?这是为什么? 答案正确,一定给分 ...… 查看全部问答> |




