pic12f508 c 语言教程,PIC12F508项目程序

#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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值