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

}

}

相关推荐
m0_739312872 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
嵌入式小章2 小时前
基于STM32的实时时钟(RTC)教学
stm32·嵌入式硬件·实时音视频
TeYiToKu3 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
基极向上的三极管4 小时前
【AD】3-4 在原理图中放置元件
嵌入式硬件
徐嵌4 小时前
STM32项目---水质水位检测
stm32·单片机·嵌入式硬件
徐嵌4 小时前
STM32项目---畜牧定位器
c语言·stm32·单片机·物联网·iot
lantiandianzi4 小时前
基于单片机的老人生活安全监测系统
单片机·嵌入式硬件·生活
东胜物联4 小时前
探寻5G工业网关市场,5G工业网关品牌解析
人工智能·嵌入式硬件·5g
stm32发烧友4 小时前
基于STM32的智能家居环境监测系统设计
stm32·嵌入式硬件·智能家居
hairenjing112312 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word