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

单片机自动排列上料控制程序 下

/***************上料时间参数显示******************/
               void dis_timea(uchar s)
               {
               uchar x,y;
               uint i=0;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB2+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X15);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);     //0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB2+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X16);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(0X00);             //2025 4 20
                 }
                }
               }
/***************设置参数显示******************/
               void dis_timeb(uchar s)
               {
               uchar x,y;
               uint i=0;
               A1=s/100;
               A2=(s-A1*100)/10;
               A3=s-A1*100-A2*10;
               for(y=0;y<2;y++)                  //百位显示
               {
               Write_IIC_Command(0XB4+y);        //纵向页
               Write_IIC_Command(00);            //横向离左部边缘开始的距离
               Write_IIC_Command(0X15);          //横向第四个字
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A1*16]);     //0--A字符表
                }
                for(x=0;x<8;x++)                 //横向像素
                {
                Write_IIC_Data(show1[x+y*8+A2*16]);
                }
               }
                for(y=0;y<2;y++)                 //十位显示
                {
                Write_IIC_Command(0XB4+y);       //纵向页
                Write_IIC_Command(00);           //横向离左部边缘开始的距离
                Write_IIC_Command(0X16);         //横向第五个字
                 for(x=0;x<8;x++)                //横向像素
                 {
                 Write_IIC_Data(show1[x+y*8+A3*16]);
                 }
                }
               }
/***************显示参数归零******************/
               void csgl()
               {
               uchar x,y;
               uint  Cnt=32;
//参B0 12    00
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x11);             //横向第三个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show4[x+y*16+Cnt*0]); //字符表第0个字
                }
               }
//数B0 13   01
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x12);             //横向第四个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show4[x+y*16+Cnt*1]);  //字符表第1个字
                }
               }
//归B0 14  02
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x13);             //横向第五个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show4[x+y*16+Cnt*27]); //字符表第2个字
                }
               }
//零B0 15  03
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb0+y);        //竖向第一行    机
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x14);             //横向第六个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show4[x+y*16+Cnt*28]);  //字符表第3个字
                }
               }
              }
/***************显示开关数率******************/
              void DisRunSpeed()
              {
               uchar x,y;
               uint  Cnt=32;
//开B2 10 36
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb2+y);         //竖向第一行    
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x10);           //横向第三个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show4[x+y*16+Cnt*36]); //字符表第0个字
                }
               }
//关B2 11 37
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb2+y);        //竖向第一行
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x11);             //横向第四个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show4[x+y*16+Cnt*37]);  //字符表第1个字
                }
               }
//数B2 12  1
              for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb2+y);        //竖向第一行    
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x12);             //横向第五个字
                for(x=0;x<16;x++)                 //横向像素
                {
                Write_IIC_Data(show4[x+y*16+Cnt*1]); //字符表第2个字
                }
               }
//率B2 13  17
               for(y=0;y<2;y++)
               {
               Write_IIC_Command(0xb2+y);        //竖向第一行    机
               Write_IIC_Command(0x00);
               Write_IIC_Command(0x13);          //横向第六个字
                for(x=0;x<16;x++)                //横向像素
                {
                Write_IIC_Data(show4[x+y*16+Cnt*17]);  //字符表第3个字
                }
               }
              }
/*----------功能判断子程序------------*/
               void   function(uchar FuncData)
               {
                uchar  func;
                func=FuncData;
                Dis_Num(func);    
                display(func);                   //临时测试
                if(func==1)                      //功能设置循环置为1
                {
                Initial_LY096BG30();             //初始化显示屏
                Infrared_delay();                //上料延时
            //    DisNumber(0);                    //功能编号
                distest(RunTime_A);
                }
                if(func==2)                      //功能设置循环置为2
                {
                Initial_LY096BG30();             //初始化显示屏
                photoelectricity_delay();        //光电延时
                distest(RunTime_B);
                }
                if(func==3)                      //功能设置循环置为3
                {
                Initial_LY096BG30();             //初始化显示屏
                DisStopData();                   //显示电机速度
                dishz(FHz);                      //参数显示 分离lmn百十个位数据
                }
                if(func==4)                      //功能设置循环置为4
                {
                Initial_LY096BG30();             //初始化显示屏
                DisMotorSpeed();                 //电机速度
                distest(CT);                     //占空比
                }
                if(func==5)                      //功能设置循环置为4
                {
                Initial_LY096BG30();             //初始化显示屏
                DisRunSpeed();                   //开关数率    计数器
                display(total);                     //
               }
              }  
/*----------参数加-----------------*/
               void   DataOn( )                  /*写数据B子函数*/
               {                                 /*子函数开始*/
               valb=valb+1;                      /**加一**/
               if(valb>999)
               valb=0;                           /*大于999归零*/
               }                                 /*子函数结束*/
/*----------参数减---------------*/
               void   DataDown( )                /*写数据B子函数*/
               {                                 /*子函数开始*/
               valb=valb-1;                      /**加一**/
               if(valb==0)
               valb=999;                         /*大于999归零*/
               }                                                            //                    
/*-----------加减按键处理子程序------*/
               void   addfunt(int funtt,bit adddec) //功能编号 加减标志
               {
                int fun;
                bit adddecb;
                fun=funtt;
                adddecb=adddec;
                switch(fun)
                {                                //
                  case 1:                        //上升结束延时加
                  if(adddecb)
                  {    
                  valb=RunTime_A;                //数据交上升结束延时加函数子程序处理
                  DataOn();                      //加函数  display()函数处理lmn
                  RunTime_A=valb;                //处理数据交上升结束延时 存储器
                  distest(RunTime_A);            //参数显示 分离lmn百十个位数据
                  write_eeprom();
                  }
                  else
                  {                              //减
                  valb=RunTime_A;                //数据交上升结束延时减函数子程序处理
                  DataDown();                    //减函数  display()函数处理lmn
                  RunTime_A=valb;                //处理数据交上升结束延时 存储器
                  distest(RunTime_A);            //参数显示 分离lmn百十个位数据
                  write_eeprom();
                  }break;   
                  case 2:                        //下降时间加
                  if(adddecb)
                  {    
                  valb=RunTime_B;                //数据交下降时间加函数子程序处理
                  DataOn();                      //加函数  display()函数处理lmn
                  RunTime_B=valb;                //处理数据交下降时间 存储器
                  distest(RunTime_B);            //参数显示 分离lmn百十个位数据
                  write_eeprom();
                  }
                  else
                  {                              //下降时间减
                  valb=RunTime_B;                //数据交减函数子程序处理
                  DataDown();                    //减函数  display()函数处理lmn
                  RunTime_B=valb;                //处理数据交下降时间 存储器
                  distest(RunTime_B);            //参数显示 分离lmn百十个位数据
                  write_eeprom();
                  }
                  break;   
                  case 3:                         //
                  if(adddecb)
                  {   
                   FHz = FHz/100;               //
                   FHz=FHz+1;                     //
                   if(FHz>=200)                 //
                   {
                    FHz=0;                         //
                   }     
                   dishz(FHz);                  //参数显示 分离lmn百十个位数据
                   Timer2_Init();
                   write_eeprom();
          //        write3();                    //写EEPROM lmn百十个位数据
                  }
                  else
                  {                             
                   FHz = FHz/100;              //
                   FHz=FHz-1;                     //
                   if(FHz==0)
                    {
                    FHz=200;
                    }
                   dishz(FHz);                  //参数显示 分离lmn百十个位数据
                   Timer2_Init();                 //
                   write_eeprom();                 //
                  }
                  break;   
                  case 4:                        //占空比
                  if(adddecb)
                  {                              //开模时间加
                  CT++;                          //数据交加函数子程序处理
                  if(CT>99)
                  CT=0;                          //处理数据交开模时间存储器
                  Timer2_Init();                 //定时器2初始化
                  distest(CT);                   //参数显示 分离lmn百十个位数据
                  write_eeprom();
                  }
                  else
                  {                              //开模时间减
                  CT--;                          //数据交加函数子程序处理
                  if(CT<1)
                  CT=99;  
                  Timer2_Init();                 //定时器2初始化
                  distest(CT);                   //参数显示 分离lmn百十个位数据
                  write_eeprom();
                  }
                   break;  
                  case 5:                   
                  if(adddecb)
                  {                              //开模时间加
                  RunTime_A=0X10;                //上料延时
                  RunTime_B=0X20;                //光电延时
                  FHz=190;                      //停顿时间
                  CT=85;                         //电机速度
                  total=5;
                  Timer2_Init();                 //定时器2初始化
                  write_eeprom();                 //
                  display(total);                     //
                  csgl();
                  }
                  else
                  {    
                  RunTime_A=0X10;                //上料延时
                  RunTime_B=0X20;                //光电延时
                  FHz=190;                      //停顿时间
                  CT=85;                         //电机速度
                  total=5;
                  Timer2_Init();                 //定时器2初始化
                  write_eeprom();                 //
                  display(total);                     //
                  csgl();
                  }
                 break;   
                 default :break;
                 }
                }
/*************功能设置函数**************/
/*****功能,加减键设定各界面参数*********/
/**************     **************/
              void  funset()
              {
               while(func)                       //进入功能设置流程
               {
                DisSetData();                     //显示参数设置加减设置退出
                if(func==0)                      //功能计数器为0返回主程序
                break;                           //功能标志大于等于6功能计数器归零
                if(!KEY_ADD)                     //检测按键加
                 {                               //数据处理
                  adddecbit=1;                   //加减处理标志置1
                  addfunt(func,adddecbit);       //调用加减处理功能子函数 func界面号adddecbit加减标志
                 }
                 if(!KEY_DEC)                    //检测按键减  
                 {                               //数据处理
                 adddecbit=0;                    //加减处理标志置0
                 addfunt(func,adddecbit);        //调用加减处理功能子函数 func界面号adddecbit加减标志
                 }
                 if(!Funkey)                     //再检测功能键
                 {
                 func++;                         //功能标志加一
                 Delay_50ms(2);                 //延时等待
                 Dis_Num(func);    
                 if(func>=6)                     //功能标志大于等于6归0
                  {
                   func=0;                       //功能计数器归零
                   Initial_LY096BG30();          //初始化显示屏
                  }                                 //
                  function(func);                //刷新功能显示界面
                 }
// 退出检测
                 RstKey();
                 for(;kcounter<5;)               //按键循环5次
                 if(!Quitkey)                   //按键低电平
                  {
                   LowVoltKey();                      //按键低电平 清除计数器
                  }
                  else if(~!Quitkey)             //按键高电平
                  {
                   HighVoltKey();                     //按键计数器加一 状态计数器加一
                  }
                  if(kstatus>=3)                  /*按键状态标志大于等于3为有效值*/
                  {
                   func=0;
                   cleardisp();
                  }
                }     
               cleardisp();
               Diswait();
               Delay_50ms(5);
               }
/*****************************/
              void  MOTORLRUN()                  //顶进
              {
               do
               {
               RstKey();                        //按键复位
                for(;kcounter<5;)                //按键循环5次
                 {
                  if(!INTPUT1)                   //按键低电平
                  {
                  LowVoltKey();
                  }
                  else if(~!INTPUT1)             //按键高电平
                  {
                  HighVoltKey();
                  }
                 }
                 if(kstatus>=4)                  /*按键状态标志大于等于3为有效值*/
                 {                               /*循环检测 */
                 MOTORRUN_L=0;
                 }
                }                           
                while(MOTORRUN_L);
              }
/*****************************/
              void  MOTORRRUN()                  //顶退
              {
              do
               {
               RstKey();                        //按键复位
                for(;kcounter<5;)                //按键循环5次
                 {
                  if(!INTPUT2)                   //按键低电平
                  {
                  LowVoltKey();
                  }
                  else if(~!INTPUT2)             //按键高电平
                  {
                  HighVoltKey();
                  }
                 }
                 if(kstatus>=4)                  /*按键状态标志大于等于3为有效值*/
                 {                               /*循环检测 */
                 MOTORRUN_R=0;
                 }
                }                           
                while(MOTORRUN_R);
              }

//自动运行      INTPUT3
              void AutoRun()
              {
/***************检测料满停机信号*********************/
//低电平开始计时 到设定值料满停机
               do
                {                                 //定时器检测INTPUTD2
// 高电平 允许开摇摆电机
                 RstKey();                       //
                 for(;kcounter<5;)               //按键循环5次
                  {
                   if(!EXIT_0)                   //P3.2按键低电平
                   {
                   LowRst();                     //按键低电平 清除计数器
                   }
                   else if(~!EXIT_0)             //按键高电平
                   {
                   HighSet();                    //按键计数器加一 状态计数器加一
                   }
                  }
                  if(kstatus>=3)                 /*按键状态标志大于等于3为有效值*/
                  {
                   Time_A=0;
                   Switch_Flag=0;                //定时器计时标志
                   OUT1=1;                       //放料闸门关
                   if(Photoele_Flag==0)             //光电上料允许
                   {
                   MOTORA_CW=0;                  //上料电机开
                   MOTORB_CW=0;                  //排列电机开启
                   }
                  }
/******外中断0检测到中断信号 置位Switch_Flag=1***/
/***************检测上料信号*计时到电机停止******/
                 if(Switch_Flag==1)              /*按键状态标志大于等于3为有效值*/
                 {                                 //Switch_Flag=1;
                  LoaderMotorClose();             //“上料电机”显示关
                  DisWork();                     //显示上料
                  MOTORA_CW=1;                   //上料电机停止
                  OUT1=0;                        //放料闸门开 计时到闸门关闭
                   for(Time_A=0;Time_A<RunTime_A;Time_A++)
                   {                             //循环延时设定时间值
                   dis_timea(Time_A);             //显示上料时间
                   Delay_50ms(5);                 //延时
                  }
                  Clear_State();                 //清除第一行状态显示
                  Switch_Flag=0;                 //上料信号标志复位
                  MOTORA_CW=0;                   //上料电机开启
                  LoaderMotorOpen();             //“上料电机”显示开
                  OUT1=1;      
                 }
                 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;                  //上料电机开
                   MOTORB_CW=0;                  //排列电机开
                   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;                  //排列电机开
                   L_EN=1;
                   R_EN=1;
                   DisJacking();                 //显示顶进
                   MOTORRUN_L=1;                 //电机正转标志
                   MOTORLRUN();                  //顶进
                   L_PWM = 0;
                   OUT2=1;
                   L_EN=1;
                   R_EN=1;
                   Delay_50ms(5);
                   DisRetreat();                 //显示顶退
                   MOTORRUN_R=1;                 //电机反转标志
                   MOTORRRUN();                  //顶退
                   R_PWM = 0;
                   OUT2=1;
                   L_EN=0;
                   R_EN=0;
                   DisRetreat();                 //清除显示
                   Clear_State();                 //清除第一行状态显示     INTPUT3
//滑槽料满低电平检测
                   RstKey();                     //排列电机到位
                   for(;kcounter<10;)              //按键循环5次
                   {
                    if(!INTPUT3)                  //按键低电平
                    {
                    LowVoltKey();                 //按键低电平 清除计数器
                    }
                    else if(~!INTPUT3)            //按键高电平
                    {
                    HighVoltKey();                //按键计数器加一 状态计数器加一
                    }
                   }
                   if(kstatus>=8)                 /*按键状态标志大于等于3为有效值*/
                   {
//滑槽料满高电平检测
                    kstatus=0;
                    for(;kstatus<5;)              //排列高电平检测
                    {
                     if(~!INTPUT3)                 //
                     kstatus++;
                     else
                     kstatus=0;
                    }
                   }
                   MOTORB_CW=0;                  //排列电机开
                   kstatus=0;
                   for(;kstatus<5;)              //排列高电平检测
                   {
                       if(~!INTPUT0)                 //
                    kstatus++;
                    else
                    kstatus=0;
                   }
                   Delay_50ms(10);                 //延时再检测
                  }
//检测直流电机
                 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 timer0() interrupt 1
               {
                uchar aa;
                aa++;                            //定时基数变量
                if(aa>=200)                      //定时周期
                {
                 aa=0;                           //定时基数归零
                }                                //Photoele_Flag=1
//光电停机计时
                if(Switch_Flag==1)               //外中断0 开闸计时标志
                {
                 Time_A++;                       //定时器计时开闸时间
                 if(Time_A>=RunTime_A)           //计数器到开闸设定值
                 {
                 Time_A=0;                       //计数器归零
                 Switch_Flag=0;                  //开闸计时标志归零
                 }
                }
//开闸计时
               }     
/*************P3.2下降沿中断**链条上料***********/
              void exint0() interrupt 0          //INT0中断入口
              {         
               
               RstKey();
               for(;kcounter<5;)                 //按键循环5次
               {
                if(!EXIT_0)                      //P3.2按键低电平
                {
                LowVoltKey();                    //按键低电平 计数器加一状态标志加一
                }
                else if(~!EXIT_0)                //按键高电平
                {
                HighVoltKey();                   //按键计数器加一    状态标志归零
                }
               }
               if(kstatus>=3)                    /*按键状态标志大于等于3为有效值*/
               {  
               Switch_Flag=1;                    //定时器计时标志
               }                                 //自动运行函数上料电机停止
//              
              }
//========================================================================
// 函数: void Timer0_Init(void)
// 描述: 定时器0初始化函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2022-6-2
// 备注:
//========================================================================
              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;
               }
              }
/*定时器2扩展外部普通IO中断****************/
/*P2.2低电平开计数器高电平关计数器*/
/******/
              void t2int() interrupt 12          //中断入口
              {
               uint CT0,CT1,CT2,CT3; //
               uchar SS;                         //
               SS++;                             //定时基数变量
               if(SS>=200)                       //定时周期
                {
                SS=0;                            //定时基数归零
//计时标志为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)           //按键低电平 INTPUT3 P3.3口
                  {
                  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;
                 }
                }
               }
//
              }
/******************** 主函数 **************************/
              void main(void)
              {
              // P_SW2 |= 0x80;     //扩展寄存器(XFR)访问使能
              func=0;
              RunFlag=0;                         //自动运行循环标志
              LED=0;
              total=0;
              IT0=1;                            //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
              EX0=1;                            //使能INT0中断
              EA=1;
              Init_io();
              Initial_LY096BG30();
              cleardisp();
              red_eeprom();
              Timer_Init();                      //定时器0初始化
              Timer2_Init();                     //定时器2初始化
              dis_Flag=0;                         //光电显示刷新标志
              Run_Flag=0;                         //自动运行标志
              Photoele_Flag=0;                   //光电低电平计时标志 定时器1读IO口
              Valve_Time=0;
              cleardisp();
              red_eeprom();
              display(total);                     //
              Delay_50ms(10);
              total++;
              write_eeprom();                     //
              Diswait();                         //
              Step=5;                             //步进数
              while(1)
               {
               // OUT2=~OUT2;                    //
                Delay_50ms(5);
                cleardisp();
                Diswait();                       //
                RstKey();    
                for(;kcounter<10;)               //按键循环5次
                 {
                  if(!Funkey)                    //按键低电平
                  {
                  LowVoltKey();
                  delay(50);                     //延时
                  }
                  else if(~!Funkey)              //按键高电平
                  {
                  HighVoltKey();
                  delay(50);                     //延时
                  }
                 }
                 if(kstatus>=8)                  /*按键状态标志大于等于3为有效值*/
                 {                               /*循环检测 */
                 Initial_LY096BG30();            //初始化显示屏
                 func+=1;                        // 功能循环标志
                 cleardisp();
                 DisSetData();
                 function(func);                 // 功能判断子程序 功能设置散转
                 funset();                       //进入功能设置界面
                 }                                 //Clearkey
///
//功能键
                 RstKey();
                 for(;kcounter<5;)               //按键循环5次
                  {
                   if(!StartD1)                  //按键低电平
                   {
                   LowVoltKey();                 //按键低电平 清除计数器
                   }
                   else if(~!StartD1)            //按键高电平
                   {
                   HighVoltKey();                //按键计数器加一 状态计数器加一
                   }
                  }
                  if(kstatus>=3)                 /*按键状态标志大于等于3为有效值*/
                  {
                  cleardisp();
                  DisDoon();                     //显示运行
                  DisLoaderMotor();                 //上料电机
                  Delay_50ms(5);
                  DisArrangeMotor();             //排列电机
                  Delay_50ms(5);
                  dis_Value(Time_A);
                  dis_Val(Time_B);
                  Delay_50ms(10);
                  LoaderMotorOpen();
                  ArrangeMotorOpen();
                  RunFlag=1;                     //自动运行循环标志
                  AutoRun();                     //自动运行子程序
                  }
               }                                 //参数设置 EEPROM储存
              }                                     //L2251 CODE11820 2025 5 68
             

相关文章:

单片机自动排列上料控制程序 下

/***************上料时间参数显示******************/ void dis_timea(uchar s) { uchar x,y; uint i0; A1s/100; A2(s-A1*100)/10; A3s-A1*100-A2*10; …...

科技成果鉴定测试有哪些内容?又有什么作用?

科技成果鉴定测试是评价科技成果质量和水平的方法之一&#xff0c;通过测试&#xff0c;可以对科技成果的技术优劣进行评估&#xff0c;从而为科技创新提供参考和指导。 一、科技成果鉴定测试的内容   1.技术评审&#xff1a;通过技术专家对项目进行详细的技术分析&#xff…...

【万字长文】深入浅出 LlamaIndex 和 LangChain:从RAG到智能体,轻松驾驭LLM应用开发

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

一文读懂Nginx应用之 HTTP负载均衡(七层负载均衡)

目录 一、HTTP负载均衡简介 (一)、概述 (二)、upstream模块核心参数 1、server指令参数 2、负载均衡策略指令参数 (1)、轮询(Rond Robin) (2)、最少连接(least_conn) (3)、一致性哈希(Consistent Hash) (4)、IP哈希(IP Hash) 3、长连接指令参数 二、环境规划 三、N…...

【LeetCode】删除排序数组中的重复项 II

题目 链接 思路 双指针 我好聪明啊&#xff0c;自己想出了这个双指针的办法&#xff0c;哈哈哈哈哈哈哈&#xff0c;太高兴了 代码 class Solution(object):def removeDuplicates(self, nums):""":type nums: List[int]:rtype: int"""nlen…...

vite 初始化react项目

一. 初始化 npm create vitelatestProject name 项目名&#xff0c;例如&#xff1a;todo-listSelect a framework 选&#xff1a;ReactSelect a variant 选&#xff1a;TypeScript npm install //安装依赖 npm run dev //启动项目这样一个简单的react项目就实现了。 二.…...

LeetCode 216.组合总和 III:回溯算法实现与剪枝优化

目录 问题描述解决思路 回溯法剪枝优化 代码实现复杂度分析示例测试总结与扩展 1. 问题描述 给定两个整数 k 和 n&#xff0c;要求找出所有满足以下条件的组合&#xff1a; 组合包含 k 个不同的数字。组合中数字的和等于 n。组合中的数字范围为 [1, 9]&#xff0c;且每个数字…...

【Bootstrap V4系列】学习入门教程之 组件-下拉菜单(Dropdowns)高级用法

Bootstrap V4系列 学习入门教程之 组件-下拉菜单&#xff08;Dropdowns&#xff09;高级用法 下拉菜单&#xff08;Dropdowns&#xff09;高级用法一、Directions 方向1.1 Dropup1.2 Dropright1.3 Dropleft 二、Menu items 菜单项2.1 Active 活动2.2 Disabled 禁用 三、Menu co…...

xiaopiu原型设计工具笔记

文章目录 有没有行组件是否支持根据图片生成原型呢? 其他官网 做项目要用到原型设计&#xff0c;还是那句话&#xff0c;遇到的必须会用&#xff0c;走起。 支持本地也支持线上。 有没有行组件 是这样&#xff0c;同一行有多个字段&#xff0c;如何弄的准确点呢? 目前只会弄…...

【hadoop】案例:Sqoop迁移仓库数据

1 数据导出&#xff1a;Hive导入MySQL [hadoophadoop1 sqoop]$ bin/sqoop export \ > --connect jdbc:mysql://localhost/weather \ > --username root \ > --password 123456 \ > --table mean_temperature \ > --export-dir /user/hive/warehouse/mydb/mean…...

南邮计科电工电子实验第五次课与非门设计数字锁逻辑电路小测答案

第五次课测试 题量: 16 满分: 100 一. 单选题&#xff08;共10题&#xff0c;62.2分&#xff09; 1. (单选题)下列哪个电路是基本的组合逻辑电路&#xff1f; A. 触发器B. 计数器C. 半加器D. 积分器 我的答案:C:半加器;正确答案:C:半加器; 6.2分 知识点&#xff1a; 组合…...

基于PyQt5的报警器实现说明

基于PyQt5的报警器实现说明 一、概述 本程序是一个基于PyQt5框架实现的报警器控制程序&#xff0c;通过串口与外部设备进行通信&#xff0c;向设备发送特定的十六进制指令来实现报警器的不同功能。PyQt5是Python中用于创建图形用户界面&#xff08;GUI&#xff09;的强大工具…...

pyorch中tensor的理解与操作(一)

tensor 是PyTorch 中一个最基本的数据集合类型&#xff0c; 本文注意针对该结构类型&#xff0c;说明它的存储方式以及主要的操作方法。 tensor其实是一个多维数组&#xff08;元素的数据类型需一致&#xff09;&#xff0c;类似于 NumPy 的 ndarrays&#xff0c;但可以在 GPU …...

用react实现一个简单的三页应用

下面是一个使用 React Router 的简单示例&#xff0c;演示了如何在 React 应用中实现页面之间的导航。 &#x1f6e0;️ 第一步&#xff1a;使用 Vite 创建项目 npm create vitelatest my-router-app -- --template react cd my-router-app npm install&#x1f680; 第二步&a…...

OCCT中的布尔运算

OCCT 中的布尔运算是其几何建模的核心功能之一&#xff0c;主要用于实体的合并、切割和相交操作。以下是详细介绍及经典示例程序&#xff1a; 一、OCCT布尔运算的核心类 OCCT 通过 BRepAlgoAPI 命名空间下的类实现布尔运算&#xff0c;主要包括&#xff1a; BRepAlgoAPI_Fus…...

SpringBoot的自动配置和起步依赖原理

关于Spring Boot的自动配置和起步依赖&#xff0c;我想结合最新的实现机制来展开说明。先说自动配置——这是Spring Boot最核心的"约定优于配置"思想的落地体现。举个例子&#xff0c;当我们创建一个新的Spring Boot项目时&#xff0c;只要在pom.xml里添加了spring-b…...

沃伦森电气高压动态无功补偿装置助力企业电能优化

在工业生产的复杂电能环境中&#xff0c;电能质量直接影响企业的生产效率和运营成本。XX光伏科技有限公司作为一家快速发展的制造企业&#xff0c;随着生产规模的不断扩大&#xff0c;其内部电网面临功率因数过低、电压波动频繁等问题&#xff0c;导致供电部门罚款增加、设备故…...

VUE——自定义指令

Vue自定义指令概述 Vue自定义指令可以封装一些 dom 操作&#xff0c;扩展额外功能。它们允许开发者直接对DOM元素进行低层次操作&#xff0c;自定义指令可以响应Vue的响应式系统&#xff0c;从而在数据变化时触发相应的DOM更新。 自定义指令语法 自定义指令的常用钩子函数&am…...

Redis协议与异步方式

1.redis pipeline 通过一次发送多次请求命令&#xff0c;为了减少网络传输时间。 注意&#xff1a;pipeline 不具备事务性。 2.redis 事务 事务&#xff1a;用户定义一系列数据库操作&#xff0c;这些操作视为一个完整的逻辑处理工作单元&#xff0c;要么全部执行&#xff0c;…...

systemd vs crontab:Linux 自动化运行系统的全面对比

在 Linux 系统运维和开发中&#xff0c;任务调度与服务管理 是不可或缺的一环。无论是定期备份、日志轮转&#xff0c;还是启动后台服务&#xff0c;自动化机制都能极大地提高系统的可靠性与效率。两种最常用的自动化工具是&#xff1a; crontab&#xff1a;传统的基于时间的任…...

Centos离线安装mysql、redis、nginx等工具缺乏层层依赖的解决方案

Centos离线安装mysql、redis、nginx等工具缺乏层层依赖的解决方案 引困境yum-utils破局 引 前段时间&#xff0c;有个项目有边缘部署的需求&#xff0c;一台没有的外网的Centos系统服务器&#xff0c;需要先安装jdk&#xff0c;node&#xff0c;mysql&#xff0c;reids&#xf…...

观测云:安全、可信赖的监控观测云服务

引言 近日&#xff0c;“TikTok 遭欧盟隐私监管机构调查并处以 5.3 亿欧元”一案&#xff0c;再次引发行业内对数据合规等话题的热议。据了解&#xff0c;仅 2023 年一年就产生了超过 20 亿美元的 GDPR 罚单。这凸显了在全球化背景下&#xff0c;企业在数据隐私保护方面所面临…...

el-table计算表头列宽,不换行显示

1、在utils.js中封装renderHeader方法 2、在el-table-column中引入&#xff1a; 3、页面展示&#xff1a;...

多智能体学习CAMEL-调用api

可选模型范围 在ModelScope中的模型库中选择推理 API-Inference &#xff0c;里面的模型都可以选择&#xff0c;我们可以体验到最新的使用DeepSeek-R1数据蒸馏出的Llama-70B模型。 1.2.2 使用API调用模型 这里我们使用CAMEL中的ChatAgent模块来简单调用一下模型&#xff0c;…...

奥威BI:AI+BI深度融合,重塑智能AI数据分析新标杆

在数字化浪潮席卷全球的今天&#xff0c;企业正面临着前所未有的数据挑战与机遇。如何高效、精准地挖掘数据价值&#xff0c;已成为推动业务增长、提升竞争力的核心议题。奥威BI&#xff0c;作为智能AI数据分析领域的领军者&#xff0c;凭借其创新的AIBI融合模式&#xff0c;正…...

SM2Utils NoSuchMethodError: org.bouncycastle.math.ec.ECFieldElement$Fp.<init

1&#xff0c;报错图示 2&#xff0c;报错原因&#xff1a; NoSuchMethodError 表示运行时找不到某个方法&#xff0c;通常是编译时依赖的库版本与运行时使用的库版本不一致。 错误中的 ECFieldElement$Fp. 构造函数参数为 (BigInteger, BigInteger)&#xff0c;说明代码期望使…...

Spring Boot 中 MongoDB @DBRef注解适用什么场景?

在 Spring Boot 中使用 MongoDB 时&#xff0c;DBRef 注解提供了一种在不同集合&#xff08;collections&#xff09;的文档之间建立引用关系&#xff08;类似于关系型数据库中的外键&#xff09;的方式。它允许你将一个文档的引用存储在另一个文档中&#xff0c;并在查询时自动…...

PDF生成模块开发经验分享

在日常的项目开发中&#xff0c;PDF文档的生成是一个常见的需求。无论是用于申报单、审批结果通知书还是其他业务相关的文档输出&#xff0c;一个高效且灵活的PDF生成功能都是不可或缺的。本文将基于我使用Java&#xff08;Spring Boot&#xff09;和iText库开发PDF生成模块的经…...

Music AI Sandbox:打开你的创作新世界

AI 和音乐人的碰撞 其实&#xff0c;Google 早在 2016 年就启动了一个叫 Magenta 的项目&#xff0c;目标是探索 AI 在音乐和艺术创作上的可能性。一路走来&#xff0c;他们和各种音乐人合作&#xff0c;终于在 2023 年整出了这个 Music AI Sandbox&#xff0c;并且通过 YouTub…...

RISC-V入门资料

以下是获取 RISC-V 相关资料的权威渠道和推荐资源&#xff0c;涵盖技术文档、开发工具、社区支持等&#xff1a; 1. 官方资料 RISC-V 国际基金会官网 https://riscv.org 核心文档&#xff1a;ISA 规范&#xff08;包括基础指令集&#xff08;RV32I/RV64I&#xff09;、扩展指令…...

私服与外挂:刑事法律风险的深度剖析

首席数据官高鹏律师团队编著 在当今数字化时代&#xff0c;网络游戏产业蓬勃发展&#xff0c;然而与之相伴的私服与外挂现象却屡禁不止&#xff0c;且其背后隐藏着严重的刑事法律风险。作为一名律师&#xff0c;有必要在此对私服与外挂相关的刑事问题进行深入解读&#xff0c;以…...

sherpa-ncnn:Endpointing(断句规则)

更多内容&#xff1a;XiaoJ的知识星球 目录 1. Endpointing (端点)1.1 规则11.2 规则21.3 规则3 1. Endpointing (端点) 我们有三条端点检测规则。如果激活了其中任何一个&#xff0c;我们假设检测到终端节点。 . 1.1 规则1 规则 1 计算尾随静默的持续时间。如果大于用户指…...

谷云科技iPaaS技术实践:集成平台如何解决库存不准等问题

在当今竞争激烈的商业环境中&#xff0c;电商平台、仓库系统以及门店系统之间的数据不同步问题&#xff0c;如同一颗隐形的 “定时炸弹”&#xff0c;严重威胁着企业的生存与发展。尤其是在库存管理方面&#xff0c;订单系统显示商品已售出&#xff0c;但仓库却无货可发&#x…...

负载均衡算法解析(一)NGINX

文章目录 1. 核心数据结构&#xff1a;算法的基石1.1 负载均衡节点结构&#xff1a;定义服务器实体1.2 关键概念阐述&#xff1a;权重 (Weight) 2. NGINX加权轮询算法旨在解决的具体问题深度分析2.1 应对后端服务器间的负载不均衡问题2.2 后端服务健康状态的动态感知与自适应调…...

计算机网络笔记(十六)——3.3使用广播信道的数据链路层

3.3.1局域网的数据链路层 一、核心逻辑架构&#xff08;拓扑结构演变&#xff09; 二、MAC层核心机制 MAC地址结构 以太网帧格式 CSMA/CD工作机制流程 三、关键功能对比表 功能集线器(Hub)交换机(Switch)网桥(Bridge)工作层级物理层数据链路层数据链路层冲突域处理全广播&…...

STM32-模电

目录 一、MOS管 二、二极管 三、IGBT 四、运算放大器 五、推挽、开漏、上拉电阻 一、MOS管 1. MOS简介 这里以nmos管为例&#xff0c;注意箭头方向。G门极/栅极&#xff0c;D漏极&#xff0c;S源极。 当给G通高电平时&#xff0c;灯泡点亮&#xff0c;给G通低电平时&a…...

单片机 + 图像处理芯片 + TFT彩屏 指示灯控件

指示灯控件使用说明 简介 这是一个基于单片机 RA8889/RA6809图形处理芯片的指示灯的控件库&#xff0c;用于在TFT显示屏上显示各种状态的指示灯。该控件支持多种状态显示&#xff0c;包括正常、警告、错误和停止等状态&#xff0c;并支持自定义标签显示。 功能特点 支持多…...

73页最佳实践PPT《DeepSeek自学手册-从理论模型训练到实践模型应用》

这份文档是一份关于 DeepSeek 自学手册的详细指南&#xff0c;涵盖了 DeepSeek V3 和 R1 模型的架构、训练方法、性能表现以及使用技巧等内容。它介绍了 DeepSeek V3 作为强大的 MoE 语言模型在数学、代码等任务上的出色表现以及其训练过程中的创新架构如多头潜在注意力和多 To…...

Python自动化-python基础(上)

一.魔法方法 在 Python 中&#xff0c;魔法方法&#xff08;Magic Methods&#xff09;是一类特殊的方法&#xff0c;以双下划线 __ 开头和结尾 &#xff0c;它们在特定的场景下会被 Python 解释器自动调用&#xff0c;用于实现一些内置的操作行为。 1. 初始化与构造相关 __…...

mysql数据库体验

目录 数据库简介 使用数据库 数据库的基本概念 数据 数据库和数据库表 数据库管理系统和数据库系统 数据库系统发展史 经典数据库 网状模型 层次模型 关系模型 当今主流数据库介绍 关系数据库 非关系型库的基本概念 关系数据库的基本结构 主键与外键 主键 外…...

Python开发系统

以下是一个基于Python和OpenCV的简单图像检测系统开发示例&#xff0c;包含目标检测、颜色检测和边缘检测功能&#xff1a; 一、环境搭建 1. 安装依赖 pip install opencv-python numpy matplotlib 2. 准备测试图片 下载示例图片或使用本地图片&#xff08;如 test.jpg &…...

架空输电线巡检机器人轨迹优化设计

架空输电线巡检机器人轨迹优化 摘要 本论文针对架空输电线巡检机器人的轨迹优化问题展开研究,综合考虑输电线复杂环境、机器人运动特性及巡检任务需求,结合路径规划算法、智能优化算法与机器人动力学约束,构建了多目标轨迹优化模型。通过改进遗传算法与模拟退火算法,有效…...

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明 以下是关于在 C++ 和 Qt 中使用共享内存(QSharedMemory)和 Windows 消息机制(SendMessage / PostMessage)进行跨线程或跨进程通信的详细示例。 🧩 使用 QSharedMemory 进行进程间通信(Qt 示例…...

cursor平替,试试 vscode+cline+openrouter 的方案,还能自定义 mcp-server 教程大纲

一、引言 cursor 工具使用成本高的现状 编程agent好用&#xff0c;解放劳动力&#xff0c;但费用贵 vscodeclineopenrouter Cline 是一款可集成在 IDE 中的 AI 编程助手&#xff0c;支持 OpenAI 和 Ollama 等多种模型&#xff0c;能在 IDE 里自主完成复杂编程任务&#xff0c;…...

Qt实现车载多媒体项目,包含天气、音乐、视频、地图、五子棋功能模块,免费下载源文件!

本文主要介绍项目&#xff0c;项目的结构&#xff0c;项目如何配置&#xff0c;项目如何打包。这篇文章如果对你有帮助请点赞和收藏&#xff0c;谢谢&#xff01;源代码仅供学习使用&#xff0c;如果转载文章请标明出处&#xff01;&#xff08;免费下载源代码&#xff09;&…...

C++ set替换vector进行优化

文章目录 demo代码解释&#xff1a; 底层原理1. 二叉搜索树基础2. 红黑树的特性3. std::set 基于红黑树的实现优势4. 插入操作5. 删除操作6. 查找操作 demo #include <iostream> #include <set>int main() {// 创建一个存储整数的std::setstd::set<int> myS…...

Android学习总结之算法篇八(二叉树和数组)

路径总和 import java.util.ArrayList; import java.util.List;// 定义二叉树节点类 class TreeNode {int val;TreeNode left;TreeNode right;// 构造函数&#xff0c;用于初始化节点值TreeNode(int x) {val x;} }public class PathSumProblems {// 路径总和 I&#xff1a;判…...

正点原子IMX6U开发板移植Qt时出现乱码

移植Qt时出现乱码 1、前言2、问题3、总结 1、前言 记录一下正点原子IMX6U开发板移植Qt时出现乱码的解决方法&#xff0c;方便自己日后回顾&#xff0c;也可以给有需要的人提供帮助。 2、问题 用正点原子IMX6U开发板移植Qt时移植Qt后&#xff0c;sd卡里已经存储了Qt的各种库&…...

算法解密:轮转数组问题全解析

算法解密:轮转数组问题全解析 一、引言 在算法的世界里,数组的操作问题常常考验着我们对数据结构和算法技巧的掌握程度。“轮转数组”问题就是其中一个经典且有趣的题目。它看似简单,却蕴含着多种巧妙的解法。通过深入研究这个问题,我们能更好地理解数组的特性,提升算法思…...

正则化和L1/L2范式

1. 背景与引入 历史与位置 正则化&#xff08;Regularization&#xff09;是机器学习中控制模型复杂度、提升泛化能力的核心手段之一。 L2范式&#xff08;Ridge正则化&#xff09;最早可追溯至20世纪70年代的Tikhonov正则化&#xff0c;用于解决病态线性方程组问题&#xf…...