⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 PIC12F629定时器1工作于异步方式,只要32.768KHz晶振误差5ppm,时间误差小于1秒/月.
💻 C
字号:
/*---------------------------------------------------------------

   modify date:     2005-01-03
   modify context:  1. add a input pin to check cover close
                       any timer if cover opened,cut off power
                    2. change key locate
                        run key-->add key
                        add key-->sub key
                        sub key-->run key

----------------------------------------------------------------*/

/*--------------modify note---------------------------------

      modify by  :  lcc
      modify date:  2005-01-24
      modify context: change timer unit from 1 minute to 0.1 minute

-------------------------------------------------------------*/


#include <12f629.h>                   //包含头文件
#use delay(clock=32768)               //使用晶振32.768kHz
#fuses NOWDT,XT, PUT, PROTECT         //不使用看门狗,使用外部晶振,代码保护


#define TIME_LOAD 178    //256-(10000/128) 10mS  定时器装载时间为10mS
/*
#define KEY_CS     PIN_A2
#define DIGIT0     PIN_A0
#define DIGIT1     PIN_A1
#define POWERCTRL     PIN_A3
#define COVER_CLOSE     PIN_A4   */


#define LED             PIN_A0
#define MOTOR_Control   PIN_A1
#define SPRING_SWITCH   PIN_A2
//#define POWERCTRL     PIN_A3
//#define COVER_CLOSE     PIN_A4
/*
#define KEY_STOP    0x02
#define KEY_ADD     0x04
#define KEY_SUB     0x08
#define KEY_RUN     0x01   */
/*
// data address in eeprom
#define FLAG_ADDR    0x01
#define DATA_ADDR    0x02  */

/*
#define IDLE         0
#define RUN          1
#define SET          2

#define poweron      output_low(POWERCTRL)
#define poweroff     output_high(POWERCTRL)
*/

byte  sys10mscnt,sys1scnt,sys1mincnt,last01mincnt,sys01mincnt;
/*
byte  digit,timer_set,worktime;
byte  keycode,lastkey,keyage;
byte  sys_status;
byte  cover_status;
byte const LED_TBL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
                      0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  */



#int_rtcc   //Timer0 溢出

isr(){
  byte keytemp;
  set_timer0(TIME_LOAD);  //重装载Timer0 的值
  if(--sys10mscnt==0){    //sys10mscnt自减后为0吗?为0,则将100送给sys10mscnt
     sys10mscnt=100;      //执行到此,则为1秒
     if(++sys1scnt>=6){   //sys1scnt自动加1后为6吗?为6,则将sys1scnt清0
        sys1scnt=0;       //执行到此,则为1分钟
        if(++sys01mincnt>=6){//sys01mincnt自动加1后为6吗? 为6,则将sys01mincnt清0
          //sys01mincnt++;    //sys01mincnt自动加1,指示当前的分钟值
          sys01mincnt=0;
          output_high(MOTOR_Control);//马达转动;
          }
     }

  }
}



void main()
{

   unsigned char temp;
   unsigned char inpcnt = 0;
   disable_interrupts(GLOBAL);


   digit = 0;
   keycode = 0xff;
   lastkey = 0xff;
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
   sys_status = IDLE;
   set_timer0(TIME_LOAD);
   #use delay(clock=4000000)
   delay_ms(10);
   temp=read_EEPROM(FLAG_ADDR);
   if(temp!=0xaa){
       write_EEPROM(FLAG_ADDR,0xaa);
       write_EEPROM(DATA_ADDR,0x00);

   }
   // READ SET TIMER
   timer_set=read_EEPROM(DATA_ADDR);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   set_tris_a(0x14);
   set_tris_b(0);
   output_a(0x10);
   poweroff;
   sys_status=IDLE;
   cover_status = 0;
   sys10mscnt=100;

   while(1){
      if (keycode!=0xff){
          //have key press,then key handle
          if(keycode&KEY_STOP){
                if(sys_status==SET){
                         disable_interrupts(GLOBAL);
                         write_EEPROM(DATA_ADDR,timer_set);
                         enable_interrupts(GLOBAL);
                    }
                sys_status=IDLE;
                //OFF POWER
                poweroff;
          }
          else if(sys_status!=RUN){
               if (keycode&KEY_RUN){
                    if(sys_status==SET){
                         disable_interrupts(GLOBAL);
                         write_EEPROM(DATA_ADDR,timer_set);
                         enable_interrupts(GLOBAL);
                    }
                    if (cover_status){
                       sys10mscnt = 100;
                       sys1scnt=0;
                       //sys1mincnt=0;
                       sys01mincnt=0;
                     //  sys1mincnt =0;
                       last01mincnt = 0;
                       worktime=0;

                       sys_status=RUN;
                       poweron;
                    }
               }
               else if (keycode&KEY_ADD){
                    if(timer_set<99){
                       timer_set++;
                       sys_status=SET;
                    }
               }
               else if (keycode&KEY_SUB){
                    if(timer_set>0){
                        timer_set--;
                        sys_status=SET ;
                    }
               }
          }
          keycode = 0xff;
      }
      if(sys_status==RUN){
         if(sys01mincnt!=last01mincnt){
             last01mincnt=sys01mincnt;
             if(sys01mincnt>=timer_set){
                sys_status=IDLE;
                //OFF POWER
                poweroff;
             }
         }
         else{poweron;}
      }
      //cover status check
      if (cover_status){
          if(!input(COVER_CLOSE)){
             if(++inpcnt>100){
                cover_status=0;
                if(sys_status==RUN){
                    sys_status=IDLE;
                //OFF POWER
                    poweroff;
                }
                inpcnt=0;
             }
          }
          else
             inpcnt=0;
      }
      else{
          if(input(COVER_CLOSE)){
             if(++inpcnt>100){
                cover_status=1;
                inpcnt=0;
             }
          }
          else
             inpcnt=0;
      }

   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -