轴承排列自动运行 定时器 外中断 PWM部分程序
//自动运行 INTPUT3
void AutoRun()
{
/***************检测料满停机信号*********************/
//低电平开始计时 到设定值料满停机
do
{ //定时器检测INTPUTD2
// 高电平 允许开摇摆电机
if(Switch_Flag==0)
{
Rst_KeyM(); //
for(;Km_counter<5;) //按键循环5次
{
if(!EXIT_0) //P3.2按键低电平
{
Low_Rst(); //按键低电平 清除计数器
}
else if(~!EXIT_0) //按键高电平
{
High_Set(); //按键计数器加一 状态计数器加一
}
}
if(Km_status>=3) /*按键状态标志大于等于3为有效值*/
{
Time_A=0; // 低电平计数器归零
Switch_Flag=0; //定时器计时标志
OUT1=1; //放料闸门关
if(Photoele_Flag==0) //光电上料允许
{
MOTORA_CW=0; //上料电机开
LoaderMotorOpen(); //“上料电机”显示开
if(On_Flag==1)
{
MOTORB_CW=0; //排列电机开启
ArrangeMotorOpen(); //“排列电机”显示开
}
else
MOTORB_CW=1; //排列电机关
}
}
}
/******外中断0检测到中断信号 置位Switch_Flag=1***/
/***************检测上料信号*计时到电机停止******/
else if(Switch_Flag==1) /*按键状态标志大于等于3为有效值*/
{ //Switch_Flag=1;
LoaderMotorClose(); //“上料电机”显示关
MOTORA_CW=1; //上料电机停止
OUT1=0; //放料闸门开 计时到闸门关闭
Clear_State(); //清除第一行状态显示
//定时器计时开闸时间
}
if(Switch_AgainFlag==1) //上料电机重启标志
{
Switch_AgainFlag=0; //上料电机重启标志清零
LoaderMotorOpen(); //“上料电机”显示开
}
//上料电机重启
if(dis_PassFlag==1) //上料时间显示刷新标志
{
dis_PassFlag=0; //显示刷新标志清零
dis_timea(Time_A); //显示上料时间
}
//定时器计时显示上料时间
if(dis_Flag==1) //定时器2读到一次低电平 刷新显示
{
dis_Flag=0;
dis_timeb(Time_B);
}
//显示光电停机计数时间
/***************光电低电平定时器计数 主程序显示时间******/
// Photoele_Flag=1 检测光电开关信号 高电平开排列电机 上料电机
if(Photoele_Flag==1)//光电 链条传输 运行关闭态 开摇摆电机
{
LoaderMotorClose(); //“上料电机”显示关
ArrangeMotorClose(); //“排列电机”显示关
MOTORA_CW=1; //上料电机关闭
MOTORB_CW=1; //排列电机关闭
MOTORB_CCW=1; //备用
Delay_50ms(50); //
RstKey(); //满料光电检测
for(;kcounter<10;) //按键循环5次
{
if(!INTPUTD2) //按键低电平
{
LowRst(); //
}
else if(~!INTPUTD2) //按键高电平
{
HighSet(); //
}
}
if(kstatus>=8) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
Delay_50ms(10); //
MOTORA_CW=0; //上料电机开
if(On_Flag==1)
MOTORB_CW=0; //排列电机开启
else
MOTORB_CW=1; //排列电机关
LoaderMotorOpen(); //“上料电机”显示开
ArrangeMotorOpen(); //“排列电机”显示开
Photoele_Flag=0; //定时器中断计时标志 计时到电机停止
} //Clearkey
} //
//光电高电平 重启运行
RstKey(); //料仓下料位置检测
for(;kcounter<10;) //按键循环5次
{
if(!INTPUT0) //按键低电平
{
LowVoltKey(); //按键低电平 清除计数器
}
else if(~!INTPUT0) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态计数器加一
}
}
if(kstatus>=8) /*按键状态标志大于等于3为有效值*/
{
MOTORB_CW=1; //排列电机关
ArrangeMotorClose(); //“排列电机”显示关
L_EN=1;
R_EN=1;
OUT2=0;
DisJacking(); //显示顶进
MOTORRUN_L=1; //电机正转标志
MOTORLRUN(); //顶进
L_PWM = 0;
L_EN=1;
R_EN=1;
Delay_50ms(5);
DisRetreat(); //显示顶退
MOTORRUN_R=1; //电机反转标志
MOTORRRUN(); //顶退
R_PWM = 0;
L_EN=0;
R_EN=0;
DisRetreat(); //清除显示
Clear_State(); //清除第一行状态显示 INTPUT3
OUT2=1;
//滑槽料满低电平检测 ArrangeMotorOpen(); //“排列电机”显示开
RstKey(); //排列电机到位
for(;kcounter<10;) //按键循环5次
{
if(!INTPUT3) //按键低电平
{
LowVoltKey(); //按键低电平 清除计数器
}
else if(~!INTPUT3) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态计数器加一
}
}
if(kstatus>=8) /*按键状态标志大于等于3为有效值*/
{
MOTORB_CW=1; //排列电机关闭
ArrangeMotorClose(); //“排列电机”显示关
Delay_50ms(100); //
On_Flag=0; //关闭排列电机启动标志
}
//滑槽料满高电平检测
kstatus=0;
for(;kstatus<5;) //排列高电平检测
{
if(~!INTPUT0) //料仓下料位置回归检测
kstatus++;
else
kstatus=0;
}
Delay_50ms(10); //延时再检测
}
//料仓下料动作
if(On_Flag==0)
{
RstKey(); //
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT3) //接近开关料满检测
{
LowRst(); //按键低电平 清除计数器
}
else if(~!INTPUT3) //按键高电平
{
HighSet(); //按键计数器加一 状态计数器加一
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
MOTORB_CW=0; //排列电机开
ArrangeMotorOpen(); //“排列电机”显示开
On_Flag=1; //开排列电机启动标志
}
}
//料仓下料位置检测 顶进 顶退 料仓高电平循环
RstKey(); //自动开关检测
for(;kcounter<8;) //按键循环5次
{
kcounter++;
if(~!StartD1) //按键高电平
{
kstatus++; //按键低电平 清除计数器
}
else if(!StartD1) //按键低电平
{
kstatus=0; //按键计数器加一 状态计数器加一
}
}
if(kstatus>=6) /*按键状态标志大于等于3为有效值*/
{
Reset_io(); //关闭输出
RunFlag=0; //自动运行循环标志
cleardisp(); //清除显示
Diswait(); //显示待机
}
//退出自动检测 StartD1
}
while(RunFlag); //
}
void Timer_Init(void)
{
AUXR=0X80; //STC系列的1T 设置
TMOD=0X01; //
TL0=0X32;
TH0=0X53;
ET0=1;
TR0=1;
}
/**************定时器2初始化************/
void Timer2_Init()
{
AUXR|=0x40; //定时器2为12T模式 12MHZ
F_Hz = FHz*100; //*100 总分频20000HZ
T2L = (65536-FOSC/2/F_Hz); //初始化计时值
T2H = (65536-FOSC/2/F_Hz) >> 8;
AUXR |= 0x10; //定时器2开始计时
// INT_CLKO = 0x04; //使能定时器2的时钟输出功能
IE2 |= 0x04; //开定时器2中断
EA = 1; //打开总中断
if(F_Hz == 0||F_Hz == 20000) //当频率值为0或200Hz关闭输出
{
IE2 &= ~0x04; //关闭中断
AUXR &= ~0x10; //定时器2停止计时
// PWM1 = 0;
}
}
/****************定时中断**************************/
/*****外部中断0触发置位Switch_Flag=1 开始计时****/
/***计数器计数一次刷新标志置位一次设定时间到关闭***/
void timer0() interrupt 1
{
uchar aa; //定时计数变量
aa++; //定时基数变量
if(aa>=200) //定时周期
{ //
aa=0; //定时基数归零
if(Switch_Flag==1) //开闸放料标志
{
dis_PassFlag=1; //主程序刷新标志
Time_A++; //计数器加一
if(Time_A>=RunTime_A) //到设定时间
{ //
Time_A=0; //定时计时归零
dis_PassFlag=0; //时间显示刷新标志
Switch_Flag=0; //上料信号标志复位
Switch_AgainFlag=1; //上料电机重新启动
OUT1=1; //放料闸门关闭
MOTORA_CW=0; //上料电机开启
}
}
} //
//开闸计时
}
/*************P3.2下降沿中断**链条上料***********/
/*********循环检测8次,大于等于6次有效***********/
/*********上料电机停止定时器计时开闸时间*********/
void exint0() interrupt 0 //INT0中断入口
{
Rst_Key(); //
for(;k_counter<8;) //按键循环5次
{
if(!EXIT_0) //P3.2按键低电平
{
Low_VoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!EXIT_0) //按键高电平
{
High_VoltKey(); //按键计数器加一 状态标志归零
}
}
if(k_status>=6) /*按键状态标志大于等于3为有效值*/
{
OUT1=0; //放料闸门开
MOTORA_CW=1; //上料电机停止
Switch_Flag=1; //定时器计时标志
} //自动运行函数上料电机停止
}
/*定时器2扩展外部普通IO中断****************/
/*P2.2低电平开计数器高电平关计数器*/
/******/
void t2int() interrupt 12 //中断入口
{
uint CT0,CT1,CT2,CT3; // //Delay_50ms
uchar SS; //
SS++; //定时基数变量
if(SS>=200) //定时周期
{
SS=0; //定时基数归零
if(MOTORRUN_R==1)
{
OO++; //顶退超时计数器
dis_BackFlag=1;
if(OO>=RunTime_C) //顶退超设定时间
{
OO=0; //计数器清零
MOTORRUN_R=0; //顶退标志清零
MOTORB_CW=0; //排列电机
} //顶退子程序退出循环
}
//顶退超时计时
if(Photoele_Flag==0) //满料光电检测
{
if(!INTPUTD2) //按键低电平 INTPUTD2 P2.2口
{ //低电平计数 到设定值主程序停排列电机
Time_B++; //计数满加一
dis_Flag=1; //计数器刷新显示标志
if(Time_B>=RunTime_B) //Auto_Run Time_B++
{
Photoele_Flag=1; //定时器中断计时标志 计时到电机停止
Time_B=0; //计数满清零
}
} //高电平计数器归零
else if(~!INTPUTD2) //按键低电平 INTPUTD2 P2.2口
{
Time_B=0; //计数满清零
}
}
}
//光电停机计时
if(MOTORRUN_L==1)
{
CT2++;
if(CT2>=2)
{
CT2 = 0;
CT0++;
if(CT0>=CT)
{
L_PWM = 1; //
}
else
{
L_PWM = 0;
}
if(CT0>=100)
{
CT0 = 0;
}
}
}
//前进
if(MOTORRUN_R==1)
{
CT3++;
if(CT3>=2)
{
CT3 = 0;
CT1++;
if(CT1>=CT) //占空比
{
R_PWM = 1; //
}
else
{
R_PWM = 0;
}
if(CT1>=100)
{
CT1 = 0;
}
}
}
//后退
}