查看: 6317|回复: 0

PIC16F630程序 PICC9.8写

[复制链接]
  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-8-22 14:04:11 | 显示全部楼层 |阅读模式
    分享到:
    #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
               }
             
             }
           ////////////////////////////
        }
    }
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 03:20 , Processed in 0.112919 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.