找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12184|回复: 7
打印 上一主题 下一主题
收起左侧

PIC12F508项目程序(版权所有,谢绝转载)

  [复制链接]
跳转到指定楼层
楼主
ID:73735 发表于 2015-2-18 23:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

版权所有,谢绝转载,此程序仅供学习参考,请勿做商业用途,谢谢!
#include<htc.h>
#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<Sec_Time;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




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

来自 5#
ID:244971 发表于 2017-11-8 22:15 | 只看该作者
PIC12F508只有8pin 楼主又把 watchgog禁止掉,target又是电感性的阀体,
想来硬体保护须作的非常完备,否则一干扰就有可能死机,哈~~
不想microchip先前的cmos otp抗杂讯一级棒,改到这些年头都是flash,抗杂讯能力每下愈况,令人不胜唏嘘...

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

沙发
ID:91774 发表于 2015-10-24 08:07 | 只看该作者
有保护自己劳动成果的意识。程序写的不错,值得学习、借鉴。赞一个!
回复

使用道具 举报

板凳
ID:98168 发表于 2015-12-3 16:05 | 只看该作者
赞一个,不错
回复

使用道具 举报

地板
ID:77498 发表于 2017-5-7 18:53 | 只看该作者

 赞一个
回复

使用道具 举报

6#
ID:379680 发表于 2018-8-24 14:57 | 只看该作者


 赞一个
回复

使用道具 举报

7#
ID:86450 发表于 2018-8-27 08:56 | 只看该作者
赞一个
回复

使用道具 举报

8#
ID:287515 发表于 2018-10-24 22:59 | 只看该作者
赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表