回答

收藏

PIC16F630程序 PICC9.8写

其他 其他 7486 人阅读 | 0 人回复 | 2012-08-22

#include <pic.h>
__CONFIG(0X3F84);        //设置配置位
#define  delay2   100    //上升或者下降后一秒内不不响应按键或者光藕信号延时1秒(100乘10ms)
#define  delay3   500    //按住停止键5秒以上5脚和6脚功能互换(500乘10ms)
unsigned long   number;  //10MS计数器 (timer0的中断周期是10MS)
unsigned long   number44=0; //无人操作延时计数器(用于无人操作后自动停止电机)
unsigned int  numb;     //上电闪烁3次计数器
unsigned int  number_1miao=delay2; //上升或者下降后一秒内不不响应按键或者光藕信号 1秒计数器
unsigned int  sign=0;   //按键起作用后输出起作用标志位
unsigned int  sign2=0;  //停止按键按下5秒起作用标志位
unsigned int  sign3;    //
unsigned int  number1;  //上升按键按下计数器(用于防止抖动)
unsigned int  number2;  //停止按键按下计数器(用于防止抖动)
unsigned int  number3;  //下降按键按下计数器(用于防止抖动)
unsigned int  number11; //光藕上升起作用计数器(用于防止抖动)
unsigned int  number22; //光藕停止起作用计数器(用于防止抖动)
unsigned int  number33; //光藕下降起作用计数器(用于防止抖动)
unsigned int  number00; //上电闪烁频率计数器(闪烁周期计数器)
unsigned int  number55=0; //上升和下降之间切换延时计数器(用于电反转过程缓冲)
unsigned int  direct=0;   //5和6脚切换标准(direct=0的时候5脚是下降;6脚是上升;direct=1的时候6脚是下降;5脚是上升;)
///////////
///////下面是宏定义
#define  TIME   62        //设置时间500ms(62乘10ms)
#define  dou_dong 10      //设置防抖检测次数(10次)
#define  yan_shi 3000     //设置电机停转时间30秒(3000乘10ms)
#define  delay   300      //设置上升和下降之间延时3秒(300乘10ms)

void up_on(void) //I/O配置函数
{
   RAPU=0;       //使能PORTA口弱上拉
   CMCON=0XFF;  //比较器关闭
   PORTA=0;
   PORTC=0;
   IOCA=0;    //禁止电平变化中断
   INTCON=0x00; //关闭所有中断
   TRISA=0XFB;  //设置A2脚(11脚)为输出;设置A3脚(4脚);A4脚(3脚);A5脚(2脚);为输入
   TRISC=0XCE;  //设置C3脚(7脚);C2脚(8脚);C1脚(9脚)为输入;设置C0脚(10脚);C5脚(5脚);C4脚(6脚)为输出
   WPUA4=1;   //PORTA4使能弱上拉
   WPUA5=1;   //PORTA5使能弱上拉
}
///////////////////
////////////
void tmint0(void)  //timer0初始化函数
  {
    T0CS=0; //TMR0工作于定时器方式
    PSA=0;  //TMR0用分频
    PS2=1;  //TMR0输入32分频
    PS1=0;
    PS0=0;
    T0IF=0; //清除TMR0 的中断标志
    T0IE=1; //TMR0中断允许
  }

/////////
//////////
void interrupt AD_timer(void)   //timer中断函数
{
  
    if(T0IF)     //判断timer0是否发生中断
    {
        
         T0IF=0;        //清除中断标志
         if(number<TIME)
          {
           number++;
          }
         else
          {
           number=0;
          }
     }
   
   
  
  
}
///////////////////////
void shan_suo_3(void)   //上电闪烁3次
{
  for(numb=0;numb<3;numb++)
   {
    number=0;
    RC0=1;
    while(number<TIME);
    number=0;
    RC0=0;
    while(number<TIME);
   }
}
///////////////////
////////////////////

void main(void)

{
   
    up_on(); //I/O配置函数
    tmint0();  //timer0初始化函数
    ei();     //打开所有中断
    shan_suo_3();  //上电闪烁3次
    number=0;
    while(1)
    {
      while(number<1);  //等待10MS延时
      if(number_1miao<delay2) number_1miao++;
      number00++;
      number=0;
      if((number00>=30)&&(RC4||RC5))
       {
        RC0=!RC0;      //LED闪烁(10脚取反)
        number00=0;
       }
      
      
      if(!sign&&!RA3&&RA4&&RA5&&RC1&&RC2&&RC3&&!number55&&(number_1miao>=delay2))  //上升按键按下
         {  
            RC0=1;      //LED亮   
            if(number1<dou_dong) number1++;
            number2=0;
            number3=0;
            number11=0;
            number22=0;
            number33=0;
            number44=0;
         }
      else if(!sign&&RA3&&!RA4&&RA5&&RC1&&RC2&&RC3&&!number55)  //停止按键按下
         {
            RC0=1;      //LED亮   
            number1=0;
            if(number2<delay3) number2++;
            number3=0;
            number11=0;
            number22=0;
            number33=0;
            number44=0;
         }
       else if(!sign&&RA3&&RA4&&!RA5&&RC1&&RC2&&RC3&&!number55&&(number_1miao>=delay2))  //下降按键按下
         {
            RC0=1;      //LED亮   
            number1=0;
            number2=0;
            if(number3<dou_dong) number3++;
            number11=0;
            number22=0;
            number33=0;
            number44=0;
         }
      else if(!sign&&RA3&&RA4&&RA5&&!RC1&&RC2&&RC3&&!number55&&(number_1miao>=delay2))  //光藕上升按键按下
         {
            RC0=1;      //LED亮   
            number1=0;
            number2=0;
            number3=0;
            if(number11<dou_dong) number11++;
            number22=0;
            number33=0;
            number44=0;
         }
      else if(!sign&&RA3&&RA4&&RA5&&RC1&&!RC2&&RC3&&!number55)  //光藕停止按键按下
         {
            RC0=1;      //LED亮   
            number1=0;
            number2=0;
            number3=0;
            number11=0;
            if(number22<delay3) number22++;
            number33=0;
            number44=0;
         }
      else if(!sign&&RA3&&RA4&&RA5&&RC1&&RC2&&!RC3&&!number55&&(number_1miao>=delay2))  //光藕下降按键按下
         {
            RC0=1;      //LED亮   
            number1=0;
            number2=0;
            number3=0;
            number11=0;
            number22=0;
            if(number33<dou_dong) number33++;
            number44=0;
         }
      else if(RA3&&RA4&&RA5&&RC1&&RC2&&RC3)
         {   
            if(!RC4&&!RC5) RC0=0;      //LED熄灭   
            if(!number55)
             {
              number1=0;
              number2=0;
              number3=0;
              number11=0;
              number22=0;
              number33=0;
             }
              sign=0;
              sign2=0;
         }
      else;
/////////////////////////////////////////////////
//下面是停止按键起作用后5秒计数
       if((number2>=dou_dong)&&(number2<delay3)&&(RA3&&!RA4&&RA5&&RC1&&RC2&&RC3))
            number2++;
////////////////////////////////////////////////停止起作用后
       if((number2>=delay3)&&!sign2)
          {
            direct=!direct; //5和6脚切换标志
            sign2=1;
          }
              
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
       if(((number1>=dou_dong)||(number11>=dou_dong))&&!sign) //上升按键或者光藕上升起作用
          {
            if(!direct) sign3=!RC5;
            else sign3=!RC4;
            ///////////////////////////
            if(sign3&&!number55)
               {
                     if(!direct)
                         {
                           RC4=!RC4;  //6脚输出取反
                           RC5=0;     //5脚输出0
                         }
                     else
                         {
                           RC5=!RC5;  //5脚输出取反
                           RC4=0;     //6脚输出0
                         }
                sign=1;
                number55=0;
                number_1miao=0;
               }
            else if(number55>=delay)
              {
                   if(!direct)
                         {
                           RC4=!RC4;  //6脚输出取反
                           RC5=0;     //5脚输出0
                         }
                   else
                         {
                           RC5=!RC5;  //5脚输出取反
                           RC4=0;     //6脚输出0
                         }
               sign=1;
               number55=0;  
               number_1miao=0;
              }
            else
              {
               RC4=0;  //6脚输出0
               RC5=0;   //5脚输出0
               if(number55<delay)  number55++;
              }
           
            
          }
       else if(((number2>=dou_dong)||(number22>=dou_dong))&&!sign) //停止按键或者光藕停止起作用
         {
           
           RC4=0;     //6脚输出0
           RC5=0;     //5脚输出0
           sign=1;
           number55=0;
         }
       else if(((number3>=dou_dong)||(number33>=dou_dong))&&!sign) //下降按键或者光藕下降起作用
         {
            if(!direct) sign3=!RC4;
            else sign3=!RC5;
            ///////////////////////////
            if(sign3&&!number55)
              {
                     if(!direct)
                         {   
                          RC5=!RC5;  //5脚输出取反
                          RC4=0;     //6脚输出0
                         }
                      else
                         {
                          RC4=!RC4;  //6脚输出取反
                          RC5=0;     //5脚输出0
                         }  
                sign=1;
                number55=0;
                number_1miao=0;
              }
            else if(number55>=delay)
              {
                 if(!direct)
                         {   
                          RC5=!RC5;  //5脚输出取反
                          RC4=0;     //6脚输出0
                         }
                      else
                         {
                          RC4=!RC4;  //6脚输出取反
                          RC5=0;     //5脚输出0
                         }  
                sign=1;
                number55=0;
                number_1miao=0;
              }
            else
              {
                 RC4=0;  //6脚输出0
                 RC5=0;   //5脚输出0
                 if(number55<delay)  number55++;
              }
           
           
         }
       else;
       ////////////////////////////30秒没人动作电机停止
       if(RA3&&RC1&&RA5&&RC3)
         {
           number44++;
           if(number44>=yan_shi)
           {
            number44=yan_shi;
            RC5=0;     //5脚输出0
            RC4=0;     //6脚输出0
           }
         
         }
       ////////////////////////////
    }
}
爱板  爱板  爱板     https://www.cirmall.com
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条