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

}

}

相关推荐
小叶子来了啊4 分钟前
1Arduino 简介
单片机·嵌入式硬件
渡我白衣1 小时前
计算机组成原理(7):定点数的编码表示
汇编·人工智能·嵌入式硬件·网络协议·机器学习·硬件工程
雾岛听风眠1 小时前
电路板维修
单片机·嵌入式硬件
少一倍的优雅1 小时前
hi3863(WS63) 智能小车 (一) 简单介绍
单片机·嵌入式硬件·harmonyos·hi3863
Vizio<1 小时前
STM32HAL库开发笔记-串口通信(UART)
笔记·stm32·嵌入式硬件
小幽余生不加糖2 小时前
步进电机、有刷直流电机以及无刷直流电机对比
笔记·单片机·嵌入式硬件·学习·能源
加成BUFF2 小时前
树莓派5-TB6612电机驱动模块完整实战教程
嵌入式硬件·pwm·树莓派5·tb6612·pwm波控制电机
DuanPenghao2 小时前
RISCV实战:实现基于Verilator模拟蜂鸟E203的加法器和卷积神经网络仿真
人工智能·嵌入式硬件·神经网络·cnn·risc-v
x976662 小时前
使用 HMAC-SHA256算法对MCU UID进行加密
单片机·嵌入式硬件·算法
小叶子来了啊2 小时前
4Arduino 第一个程序
单片机·嵌入式硬件