• STC单片机定时器0手动状态脉冲定时器2自动状态脉冲加减速控制


    /***定时器0中断运行函数 判断电机运行为一启动输出***/
    //ManuMTARUN_FLAG手动定时器电机A运行标志   M_Speed
    //ManuMTBRUN_FLAG手动定时器电机B运行标志
    //a1=XAddSpeed;    //X加速系数送缓冲器   2018 4 5
    //b1=YAddSpeed;    //Y加速系数送缓冲器   2018 4 5
                   void timer0() interrupt 1
                   {
                    if(ManuMTARUN_FLAG==1)            //电机A为1启动X电机
                    {
             T_Speed++;              //手动和编辑状态速度计数器
             if(T_Speed>=M_Speed)
             {
              T_Speed=0;             //
                      aa++;
                      if(aa>=a1)                      //aa大于等于a1
                      {
                      aa=0;                           //aa复位
                      if(a1<1)                        //加速系数缓冲器小于零,加速完成
                      a1=0;                           //当前设置值等于0
              else
              a1--;                           //加速系数缓冲器减一
                      CP1=!CP1;                       //输出脉冲
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              CP1=!CP1;                       //输出脉冲
                      if(X_AddDecFlag==1)             //手动左移右移加减标志等于1 右移
                      X_Data+=1;                      //加1
                      else
                      X_Data-=1;                      //减1    
                      }
             }
                    }
            if(ManuMTBRUN_FLAG==1)           //电机B为1启动Y电机
                    {
            T_Speed++;             //手动和编辑状态速度计数器
            if(T_Speed>=M_Speed)
            {
             T_Speed=0;             //
                     bb++;
                     if(bb>=b1)
                     {
                     bb=0;                           //bb复位
                     if(b1<1)             //加速系数小于0
                     b1=0;                 //加速系数置零 加速过程结束
             else
             b1--;                           //加速系数减一
                     CP2=!CP2;                       //端口取反
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             CP2=!CP2;                       //端口取反
                     if(Y_AddDecFlag==1)             //手动前进后退加减标志等于1 前进
                     Y_Data+=1;                      //加1
                     else
                     Y_Data-=1;                      //减1                
                     }
             }
                    }
               }  
    /***定时器2中断运行函数 判断电机运行为一启动输出***/
    /***自动控制状态************************/
                  void t2int() interrupt 12           //中断入口
                  {
              if(AUTO_STOPFLAG==1)           //如果自动运行停止标志为一,执行脉冲输出指令,INT0中断控制
               {                                   ///自动运行标志位,定时器2关闭电机输出
                   if(MOTARUN_FLAG==1)                 //X电机输出信号
                   {
                    aa+=5;                             //加速计数器加一
                    if(X_RunData>=150)                 //如果 X运行值大于0
                    {
                     if(aa>=a1)                        //加速计数器大于等于当前设置值
                     {
                     aa=0;                             //加速计数器归零,开始下一次计数
                     if(a1<1)                          //加速系数缓冲器小于1,加速完成
                     a1=0;                             //当前设置值等于0
             else
             a1--;                             //当前加速系数缓冲器设置值减一
                     CP1=!CP1;                         //取反输出口
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             CP1=!CP1;                         //取反输出口
                     X_RunData=X_RunData-1;            //X运行值减一
                     }
                    }
                    else  if(X_RunData<150)            //如果X运行值小于50启动减速
                    {
            if(aa>=a2)                        //加速计数器大于等于当前设置值
            {
            aa=0;                             //加速计数器归零,开始下一次计数
            CP1=!CP1;                         //取反输出口
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            CP1=!CP1;                         //取反输出口
                    X_RunData=X_RunData-1;            //X运行值减一
            a2++;
            }
            if(X_RunData<1)
            {
                     MOTARUN_FLAG=0;                    //X电机输出信号等于0 复位加速计数器 加速系数缓冲器
                     aa=0;                              //加速计数器归零
                     a1=XAddSpeed;                       //赋值X加速系数缓冲器
             a2=0;
            }
                   }
                  }
              if(MOTBRUN_FLAG==1)                   //Y电机运行标志
                   {
                    YSpeed++;                           //Y电机中断计数器加一
                    if(YSpeed>=5)                       //中断五次进入脉冲
                    {
                    YSpeed=0;
                    bb++;
                    if(Y_RunData>0)                       //如果Y运行值大于0
                     {
                      if(bb>=b1)                       //加速计数器大于等于设置值
                      {
                      bb=0;                               //加速计数器置零
                      if(b1<1)                           //加速系数小于0
                      b1=0;                               //加速系数置零 加速过程结束
              else
              b1--;                            //加速系数减一
                      CP2=!CP2;                           //脉冲取反
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              _nop_();
              CP2=!CP2;                           //脉冲取反
                      Y_RunData=Y_RunData-1;           //运行值减一
                      }
                     }
                    else                               //如果 Y运行值不大于0 运行结束
                    {
                    MOTBRUN_FLAG=0;                       //电机B运行结束 复位加速计数器 加速系数缓冲器
                    bb=0;                               //加速计数器置零
                    b1=YAddSpeed;                       //Y加速系数
                    }
                    }
                   }
                   if(Down_Flag==1)      //每运行一次取料放料赋值一次
                   {                     //Z电机和XY电机联动,下降一段距离避开工件
                   CP3=~CP3;
                   DownData--;          //下降缓冲存储器
                   if(DownData<1)        //下降缓冲存储器小于0
                   Down_Flag=0;            //下降标志置零,Z电机联动结束
                   }
               }
              }
    /*************************************/
              void exint0() interrupt 0         //INT0中断入口P3^2;  PIN29
                  {
              RstKey();                          //按键计数器状态寄存器归零
              if(!EX_INT0)                       //STOP检测    
                  {                                     //
                   for(;kcounter<3;)                 //按键循环3次
                   {                                 //
                    if(!EX_INT0)                     //按键低电平
                    {                                 //
                    LowVoltKey();                    //按键计数器状态标志加一
                    }                                 //
                    else if(~!EX_INT0)               //按键高电平
                    {                                 //
                    HighVoltKey();                   //按键计数器加一 状态标志归零
                    }                                 //
                   }                                 //
                   if(kstatus>=3)                     //
                   {                                 //
                    INT1_Flag=1;
            AUTO_STOPFLAG=0;                 //自动运行标志位,定时器2关闭电机输出
                   }
                   RstKey();                         //按键计数器状态寄存器归零
                  }                         
    //  INT_CLKO &= 0xEF;               //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
    //  INT_CLKO |= 0x10;               //然后再开中断即可
                  }
    /****************外部中断2高电平检测****************/
                   void   TestK2()                     //P3^6; PIN35 外中断2
               {
                if(~!EX_INT2)                    //*****高电平检测     压脚释放
                    {                                 //*****
                     for(;kcounter<5;)               //*****循环3次
                     {                                 //*****
                      if(~!EX_INT2)                  //*****高电平检测     压脚释放
                      {                                 //*****
                      LowVoltKey();                  //*****计数器状态标志加一
                      }                                 //*****
                      else if(!EX_INT2)              //*****低电平
                      {                                 //*****
                      HighVoltKey();                 //*****按键计数器加一 状态标志归零
                      }                                 //*****
                     }                                 //*****
                     if(kstatus>=3)                  //*****3
                     {                                 //*****
                     AUTO_STOPFLAG=1;                 //*****
                 }                                 //*****
                     RstKey();                       //*****按键计数器状态寄存器归零
                 }
                }
    /****INT2产生中断信号自动状态定时器2关闭XY轴电机输出****/
    /***(返回主程序循环检测引脚,高电平开XY轴电机输出)******/
                  void exint2() interrupt 10         //INT2中断入口     P3^6;  35
                  {
              RstKey();                          //按键计数器状态寄存器归零
              if(!EX_INT2)                       //手动上升检测
                  {                                     //
                   for(;kcounter<3;)                 //按键循环3次
                   {                                 //
                    if(!EX_INT2)                     //按键低电平
                    {                                 //
                    LowVoltKey();                    //按键计数器状态标志加一
                    }                                 //
                    else if(~!EX_INT2)               //按键高电平
                    {                                 //
                    HighVoltKey();                   //按键计数器加一 状态标志归零
                    }                                 //
                   }                                 //
                   if(kstatus>=3)                     //
                   {                                 //
                    AUTO_STOPFLAG=0;                 //自动运行停止标志置零,自动运行XY轴停止运行
                    PressFoot_Flag=1;                 //压脚中断使能置一
                   }
                   RstKey();                         //按键计数器状态寄存器归零
                  }                         
    //  INT_CLKO &= 0xEF;               //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
    //  INT_CLKO |= 0x10;               //然后再开中断即可
                  }
    /*************INT3中断打靶信号检测*********************/
    /***开机初始化打靶信号置零压脚中断使能,检测INT3中断****/
    /***主程序检测到打靶标志置一信号结束寻点程序转下一工位*/
    /*并复位打靶标志PastShooting_Flag=0等待下下一工位中断**/
                  void exint3() interrupt 11         //INT3中断入口     P3^7;PIN36
                  {                                     //
              if(PressFoot_Flag==1)            //如果压脚中断使能为一
              {                                 //
              if(!EX_INT3)                      //打靶信号低电平检测
                   {                                 //
                    for(;kcounter<3;)                //按键循环3次
                    {                                 //
                     if(!EX_INT3)                    //打靶信号低电平检测
                     {                                 //
                     LowVoltKey();                   //按键计数器状态标志加一
                     }                                 //
                     else if(~!EX_INT3)              //打靶信号高电平检测
                     {                                 //
                     HighVoltKey();                  //按键计数器加一 状态标志归零
                     }                                 //
                    }                                 //
                    if(kstatus>=3)                     //
                    {                                 //
                    PastShooting_Flag=1;             //打靶标志置1
                PressFoot_Flag=0;         //压脚中断使能关闭
                    }                                 //
                    RstKey();                        //按键计数器状态寄存器归零
                   }                         
    //  INT_CLKO &= 0xDF;               //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
    //  INT_CLKO |= 0x20;               //然后再开中断即可
                   }
                  }

  • 相关阅读:
    C++-Cmake指令:set
    mysql之搭建MMM架构实现高可用
    【Spring Cloud】新闻头条微服务项目:使用Reids延迟队列实现文章定时发布(下)
    14:00面试,14:08就出来了,问的问题有点变态
    【python与数据分析】Numpy数值计算基础——补充
    OpenCV 人脸检测(易上手版)
    MySQL创建表的时候建立联合索引的方法
    [PAT练级笔记] 22 Basic Level 1022 D进制的A+B
    禾观科技采用亚马逊云科技的数据湖,实现数据化驱动运营的核心
    服务器中了elbie勒索病毒解决办法,elbie勒索病毒解密数据恢复
  • 原文地址:https://blog.csdn.net/czhaii/article/details/132914143