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;               //然后再开中断即可
               }
              }

你可能感兴趣的:(单片机,嵌入式硬件)