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

}

}

相关推荐
aqymnkstkw16 分钟前
2024年【电气试验】考试题库及电气试验模拟试题
大数据·c语言·人工智能·嵌入式硬件·安全
xxpro1 小时前
S3C2440开发板点亮LED灯+PWM定时器
单片机·嵌入式硬件
百里与司空1 小时前
学习CubeIDE——定时器开发
stm32·单片机·嵌入式硬件·学习
天蓝蓝235282 小时前
嵌入式硬件基础知识
嵌入式硬件
代码总长两年半2 小时前
STM32+FATFS+SD卡+RTC(生成.CSV格式文件)
stm32·嵌入式硬件·实时音视频
honey ball4 小时前
仪表放大器AD620
运维·单片机·嵌入式硬件·物联网·学习
luckyluckypolar4 小时前
STM32 -中断
stm32·单片机·嵌入式硬件·物联网
启明云端wireless-tag9 小时前
ESP32无线WiFi蓝牙SOC,设备物联网通信方案,启明云端乐鑫代理商
嵌入式硬件·物联网·wifi·esp32·乐鑫·wifi模组
@@庆10 小时前
stm32 PWR电源控制(修改主频&睡眠模式&停机模式&待机模式)
stm32·单片机·嵌入式硬件
JT灬新一10 小时前
STM32巡回研讨会总结(2024)
stm32·单片机·嵌入式硬件