×
单片机 > 单片机程序设计 > 详情

PIC12F508项目程序

发布时间:2020-06-18 发布时间:
|

#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;



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯