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