轴承排列自动运行 定时器 外中断 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;

}

}

}

//后退

}

相关推荐
Wave8457 小时前
STM32--时间戳,BKB,RTC
stm32·单片机·嵌入式硬件
zm13 小时前
单片机学习笔记
单片机·嵌入式硬件
猫头虎13 小时前
2025最新超详细FreeRTOS入门教程:第十三章 FreeRTOS临界区与原子操作
stm32·单片机·嵌入式硬件·物联网·51单片机·proteus·iot
嵌R式小Z14 小时前
STM32短按,长按,按键双击实现
stm32·单片机·嵌入式硬件
佩佩(@ 。 @)16 小时前
嵌入式:走馬燈-stm32GPIOF_LED9、10; GPIOE_D10、D12 流水綫蜂鸣器
stm32·嵌入式硬件·算法
华普微HOPERF16 小时前
Sub-GHz无线收发单片机,低功耗物联网通信的硬件“基石”
单片机·嵌入式硬件·物联网
大阳12316 小时前
51单片机4(温度传感器DS18B20)
开发语言·单片机·嵌入式硬件·算法·51单片机
应用市场19 小时前
深入理解STM32运行原理:从上电到主程序执行的完整过程
stm32·单片机·嵌入式硬件
空管电小二19 小时前
【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读
经验分享·单片机·嵌入式硬件·社交电子·学习方法
逼子格19 小时前
Altium Designer(AD)原理图更新PCB后所有器件变绿解决方案
单片机·嵌入式硬件·硬件工程·问题解决·ad·pcb·altium designer