当前位置: 首页 > news >正文

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

相关文章:

  • 2024国产PLM应用案例:河南携路机械
  • JavaScript中判断两个对象是否相同(所有属性的值是否都相同)
  • Spring BeanPostProcessor
  • 《小明的一站式套餐服务平台》
  • 猎板硬金镀层厚度:高频通信领域的性能分水岭
  • Java面试高频核心内容
  • JAVASE:面向对象
  • Pendulum:优雅处理 Python 中的日期与时间
  • CET6 仔细阅读 24年12月第三套-C1 恐惧这一块
  • SAFe/LeSS/DAD等框架的核心适用场景如何选择?
  • 学习笔记(24): 机器学习之数据预处理Pandas和转换成张量格式[2]
  • 开发源码搭建一码双端应用分发平台教程:逐步分析注意事项
  • 激活函数和归一化、正则化
  • return this;返回的是谁
  • Odoo 18 定期发送电子邮件报告(如KPI)配置指南
  • vivo y300pro 无法连接adb
  • C++语法系列之IO流
  • Linux网络协议栈:从Socket到网卡的星辰大海
  • python实现合并多个dot文件
  • 【AI系列】DPO 与 PPO 的比较与分析
  • 天津网站建设服务电话/保温杯软文营销300字
  • c2c网站怎么做/最新军事消息
  • 一个空间可以做多少个网站/百度竞价推广方案范文
  • 速效成交型网站/宁波seo
  • 做漫画网站 漫画哪找/专门做推广的公司
  • 微信网站开发简单/竞价排名服务