历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

DIALIGHT公司的发展小趣事

DIALIGHT公司一直专注于工业LED照明领域的发展。他们深入了解工业空间照明的需求和挑战,设计了一系列专为工业应用而定制的LED照明产品。这些产品不仅易于安装和维护,而且能在恶劣的环境下持续使用。此外,DIALIGHT还提供集成系统解决方案,帮助客户降低能源成本、维护成本和碳足迹,同时提高设施的安全性和生产力。通过不断创新和优质服务,DIALIGHT在工业LED照明领域赢得了广泛的认可和信赖。

格瑞宝(GP)公司的发展小趣事

格瑞宝公司致力于功率器件的研发与销售,其产品线不断丰富和完善。从最初的MOSFET产品系列,到后来逐渐扩展到DIODE、BJT、IC集成电路等多个领域,格瑞宝始终坚持技术创新,不断推出符合市场需求的新产品。特别是在SGT MOST工艺方面,格瑞宝达到了国内领先水平,这一技术突破不仅提升了产品的性能和质量,也进一步巩固了公司在行业内的地位。

A1 PROS公司的发展小趣事

进入2004年,A1 PROS开始着手研发彩色CCD传感器。经过两年的不懈努力,公司在2005年成功开发出3 IC彩色CCD传感器。这一创新产品不仅色彩还原度更高,而且功耗更低、稳定性更强,迅速受到市场的欢迎。随着彩色CCD传感器的推出,A1 PROS的产品线更加丰富,市场竞争力也进一步提升。

台湾义隆电子(ELAN)公司的发展小趣事

在产品多元化的基础上,义隆电子开始积极拓展国际市场。公司以台湾新竹科学园区为营运总部,在亚洲、美洲等多个国家和地区设立了分支机构和设计中心。通过与全球合作伙伴的紧密合作,义隆电子的产品逐渐进入欧洲、亚洲和美洲等市场,实现了全球布局。

B&K Precision公司的发展小趣事

随着业务的不断发展,科恩和班意识到电子测试和测量领域的巨大潜力。1951年,他们将公司更名为B&K Precision,并开始扩展业务,涉足其他电子测试和测量领域。工程师们凭借在电视测试设备领域的丰富经验,不断研发新产品,获得了多项专利,并推动公司迅速成为全球电子测量领域的领导者。

Apx-Crystal公司的发展小趣事

Apx-Crystal公司起初是一家专注于研发新型晶体振荡器的小型科技公司。在创始人的领导下,团队通过不懈的努力,成功研发出了一款具有高稳定性和长寿命的晶体振荡器,这一技术突破在行业内引起了广泛关注。随着产品性能的不断提升和成本的有效控制,Apx-Crystal开始赢得越来越多客户的青睐,市场份额逐年攀升。公司逐渐扩大生产规模,并在多个国家和地区设立了销售和服务网络,实现了从初创企业到国际知名电子元件供应商的华丽转身。

问答坊 | AI 解惑

梦幻五环如何发光

焰火渐渐熄灭,却在地上聚集出了一个奥运五环的标志。这个标志像是吸引了附近的火星,越来越亮,后来更是缓缓升上了半空——奥运开幕式上的这段表演几乎只能用“梦幻”来形容。像网友们评价的那样,这是一个富有冲击力和想象力的表演项目。那么,这 ...…

查看全部问答>

电子技术视频教程

714电子实验室下载资源整理,提供大量电子技术视频教程,大型EDA软件和教程等下载。…

查看全部问答>

急!安装凌华采集卡、控制卡 出现的问题

跪求高手指点:    在安装凌华采集卡驱动时,系统提示:If your drivers DO NOT perform DMA and INTERUPT Operation ,                         & ...…

查看全部问答>

CORTEX-M3启动文件

昨天参加了MCUDAY 研讨会,得到一个消息是Cortex-M3启动文件可以用C语言编写,不知论坛的朋友们有谁有编写启动文件的经验,给小弟介绍一下。…

查看全部问答>

关于数据采集卡的问题

   本人新做一个有关数据采集的项目,问些比较菜的问题~!!  见笑啊    数据采集卡是12位的,用256k的频率进行数据采集,fifo缓冲区是8k*16bit。    我想知道这个缓冲区能存多少个数,缓冲区存满需要多 ...…

查看全部问答>

如何用LED灯闪烁频率不同表现系统工作状态

现在有一个ARM7系统,想用LED灯闪烁频率不同来表示系统的工作状态。该LED灯通过一个GPIO来控制,谁能给一个思路? 谢谢…

查看全部问答>

计算器如何运算1+1=2

就拿我们现实中普通的计数器来说吧,当我按下1键后,在它内部会产生什么情况?难道会产生一股电流?这股电流如何把1这个信息存储在内部某个元件上啊?这个元件是如何存储它的啊?我需要详细的了解最最底层的原理啊,硬件是如何识别0和1的?如何存储 ...…

查看全部问答>

关于三星Armv4-2410ep教学开发板上串口的问题

各位大师们好     我现在在三星Armv4-2410ep教学开发板上做串口通信的开发。我是在Windows Ce 4.2的平台下作的。台子上的Serial 0,我可以轻松搞定,可是Serial 2我怎么调也调不成功?这是为什么?     答案正确,一定给分 ...…

查看全部问答>

请问evc中如何快速获取一个大文件的总行数?

文件比较大,怎样才能快速获取它的总行数,总不能一行一行的加吧。请各位高手指教!…

查看全部问答>

ARM,FPGA学习群QQ:37392778,有高级工程师指导做项目,想学习者加入

想学习ARM,FPGA,相关开发的,有工程师指导,现有开发项目,可长期指导…

查看全部问答>