PIC12F508项目程序

发布者:rnm888最新更新时间:2019-11-06 来源: 51hei关键字: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

[1] [2]
关键字:PIC12F508  配置位  计数器 引用地址:PIC12F508项目程序

上一篇:PIC单片机 读/写 MMC/SD 卡的简单小程序
下一篇:PIC单片机的USB接口的应用 一个简单的USB CDC 测试程序

推荐阅读最新更新时间:2024-11-04 12:10

PIC12F508单片机学习之一—定时器
PIC12F508单片机是没有中断的,定时器只能是查询方式。 编译器用的XC8,编译环境IDE用的是MPLAB X IDE。 //*************************************************** // __________________ // VDD-| 1 8 |-VSS // GP5-| 2 27 |-GP0/DAT // GP4-| 3 26 |-GP1/CLK //GP3/RMCLR--| 4 25 |-GP2 // |________________| //
[单片机]
MCS-51单片机的定时器/计数器概念
一、MCS-51单片机的定时器/计数器概念 单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,而花费的时间恰好是1微秒;只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流逝; 因此,单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机的只有1MHZ的稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的,这个准确的时间间隔是1微秒; MCS-51
[单片机]
MCS-51单片机的定时器/<font color='red'>计数器</font>概念
三位数字显示电容测试表电路介绍
该电容表电路由基准脉冲发生器、待测电容容量时间转换器、闸门控制器、译码器和显示器等部分组成. 图2 中,集成电路IC1B 电阻R7~R9 和电容C3 构成基准脉冲发生器(实质上是一个无稳多谐振荡器),其输出的脉冲信号周期T 与R7~R9 和C3 有关,在C3 固定的情况下通过量程开关K1b 对R7、R8、R9 的不同选择,可得到周期为11μs、1.1ms 和11ms 的三个脉冲信号。 IC1A、IC2、R1~R6、按钮AN 及C1 构成待测电容容量时间转换器(实质上是一个单稳电路)。按动一次AN,IC2B 的10 脚就产生一个负向窄脉冲触发IC1A,其5 脚输出一次单高电平信号。R3~R6 和待测电容CX 为单稳定时元件
[测试测量]
三位数字显示电容测试表电路介绍
单片机看门狗电路的作用
看门狗的作用: 看门狗定时器是一个计数器,基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工作时自动计数,程序流程定期将其复位清零,如果系统在某处卡死或跑飞,该定时器将溢出,并将进入中断。在定时器中断中执行一些复位操作,使系统恢复正常的工作状态,即在程序没有正常运行期间,如期复位看门狗以保证所选择 的定时溢出归零,使处理器重新启动。软件的可靠性一直是一个关键问题。任何使用软件的人都可能会经历计算机死机或程序跑飞的问题,这种情况在嵌入式系统中也同样存在。由于单片机的抗干扰能力有限,在工业现场的仪器仪表中,常会由于电压不稳、电弧干扰等造成死机。在水表、电表等无人看守的情况下,也会因系统遭受干扰而无法重启。为了保证系统
[单片机]
单片机看门狗电路的作用
同步计数器
同步计数器 一、同步二进制计数器 1.同步二进制加法计数器 JK触发器组成的4位同步二进制加法计数器 工作原理简介。 2.同步二进制减法计数器 设计思想: 3.集成同步二进制计数器CT74LS161 逻辑功能示意图。 功能表。 4.利用反馈置数法获得N进制计数器 ⑴ 计数器的置数功能 ⑵ 利用反馈置数法获得N进制计数器 步骤: ① 写出计数器状态的二进制代码。 ② 写出反馈归零函数。 ③ 画连线图。 [例7.3.2] 试用 CT74LS161构成十进制计数器 [例7.3.3]试用CT74LS161构成十二进制计数器。 5.同步二进制加/减计数器 二、同步十进制加法计数器 三、集成同步计数器 1.集成十进制同步加法计数器CT74LS
[模拟电子]
同步<font color='red'>计数器</font>
试验10 ---------100计数器
运行程序数码管显示00--99依次循环下面是他的asm源程序和hex程序(asm程序可以用配套光盘的uvw51e 编辑后得到hex, )该程序运行的照片(数字显示到56了) a_bit equ 20h ;个位数存放处 b_bit equ 21h ;十位数存放处 temp equ 22h ;计数器寄存器 star: mov temp,#0 ;初始化计数器 stlop: acall display inc temp mov a,temp cjne a,#100,next ;=100重来 mov temp,#0 next: ljmp stlop ;显示子程序
[单片机]
试验10 ---------100<font color='red'>位</font><font color='red'>计数器</font>
通过51单片机定时器/计数器实现精确延时
  MCS-51单片机内部共有两个16位可编程定时器,计数器,即TO、Tl。既有定时功能,又有计数的功能。每个定时器都是由两个8位的特殊功能寄存器THi和TLi组成(i=0、1)。TMOD是TO和Tl的工作方式控制寄存器,TCON是TO和Tl的运行状态控制寄存器。在实际应用时,应首先根据需要对这些寄存器进行初始化,即设置TO和Tl的工作方式并对TO和Tl定时器装入初始值以得到精确的定时时间。TO和Tl的工作方式及运行状态是由TMOD和TCON两个特殊功能寄存器控制的,而TMOD和TCON是由用户所编的程序控制的。      定时器的核心是一个加l计数器,加l计数器的脉冲有两个来源:一个是系统时钟振荡器,另一个是外部脉冲,计数器对脉
[单片机]
通过51单片机定时器/<font color='red'>计数器</font>实现精确延时
51单片机定时器的应用
interrupt中断的关键字,n是中断号提供中断程序的入口地址。 0-INT0 1-T0 2-INT1 3-T1 4-串行中断 5-T2 直接访问寄存器和端口 定义 sfr P0 0x80 sfr P1 0x81 sfr ADCON; 0xDE sbit EA 0x9F 操作 ADCON = 0x08 ; P1 = 0xFF ; io_status = P0 ; EA = 1 ; 在使用了interrupt 1 关键字之后,会自动生成中断向量 在 IS
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved