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

}

}

}

//后退

}

相关推荐
is081528 分钟前
STM32的 syscalls.c 和 sysmem.c
c语言·stm32·嵌入式硬件
szxinmai主板定制专家2 小时前
【精密测量】基于ARM+FPGA的多路光栅信号采集方案
服务器·arm开发·人工智能·嵌入式硬件·fpga开发
工业互联网专业5 小时前
汇编与接口技术:8259中断实验
汇编·单片机·嵌入式硬件·8259中断实验
desssq8 小时前
SPI通信协议
单片机·嵌入式硬件
星辰pid10 小时前
STM32实现四自由度机械臂(SG90舵机)多功能控制(软件篇freertos)
stm32·单片机·嵌入式硬件·机械臂
TESmart碲视19 小时前
HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器
单片机·嵌入式硬件·物联网·游戏·计算机外设·电脑·智能硬件
small_wh1te_coder20 小时前
硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
linux·c语言·汇编·嵌入式硬件·算法·c
花落已飘20 小时前
STM32中实现shell控制台(shell窗口输入实现)
stm32·单片机·嵌入式硬件
宇钶宇夕1 天前
针对工业触摸屏维修的系统指南和资源获取途径
单片机·嵌入式硬件·自动化
和风化雨1 天前
stm32的三种开发方式
stm32·单片机·嵌入式硬件