塑料产品机械手程序

这是一个使用STC8A4K16S2A12K16S单片机的程序,涉及IAP(在应用编程)功能,用于读写EEPROM存储器,并管理设备的原点归零、速度控制、中断处理以及与上位机的数据交互。程序实现了外部中断响应原点定位,包含了多个中断服务子程序,如X轴和Z轴的原点检测,以及手动和自动运动控制。此外,它还包含了一个串口通信模块,用于与上位机交换数据,显示设备状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/***原点归零,恢复出厂,手动动作    ******/
/********STC8A4K16S2A12K16S*关闭夹具 ***/
/*****L804  CODE5188  2021 2 23*********/
              #include     <REG52.H>  
              #include     <intrins.h>
              #include     <string.h>
              #include     "stdio.h"
              #include     <stdlib.h>
              #define      uchar unsigned char
              #define      uint  unsigned int
              #define      CMD_IDLE    0         //空闲模式
              #define      CMD_READ    1         //IAP字节读命令
              #define      CMD_PROGRAM 2         //IAP字节编程命令
              #define      CMD_ERASE   3         //IAP扇区擦除命令
              #define      ENABLE_IAP  0x82      //if SYSCLK<12MHz    根据频率设置参数
              #define      IAP_ADDRESS_0 0x2200  //EEPROM首地址    parameter参数
              uint         a[10];                //定义数组a 存储串口数据串
              bit          Receive_Flag=0;         //串口数据接收标志
              bit          Up_XData=0;             //原点更新标志,X发生中断置一,回主程序更新XZ轴位置
              bit          Up_ZData=0;             //原点更新标志,Z发生中断置一,回主程序更新XZ轴位置
              sbit         INT0PUT=P3^2;         //外部中断0原点定位
              sbit         INT1PUT=P3^3;         //外部中断1原点定位
              sbit         INTPUT1=P3^4;         //
              sbit         INTPUT2=P3^5;         //
              sbit         ClampingStop=P3^6;     //夹紧  输入
              sbit         ReleaseStop=P3^7;     //释放  输入
              sbit         LED0=P2^1;
              sbit         LED1=P4^2;
              sbit         LED2=P2^0;
              sbit         LED3=P4^1;
              sbit         Turntable=P4^3;         //Y7 转盘输出 发信号给排列控制板
              sbit         PutterForword=P4^0;     //Y0 推杆前进 发信号给排列控制板
              sbit         PutterBack=P5^5;         //Y1 推杆后退 发信号给排列控制板
              sbit         ClampingOut=P2^6;     //夹紧  输出
              sbit         ReleaseOut=P2^7;         //释放  输出
              sbit         X_MTORCP=P2^5;        //CP1 X轴脉冲
              sbit         X_MTORECT=P2^4;       //D1  X轴方向
              sbit         Z_MTORCP=P2^3;        //CP2 Z轴脉冲
              sbit         Z_MTORECT=P2^2;       //D2  Z轴方向
              bit          X_ZEROFLAG;           /*X_零点标志01*/
              bit          Z_ZEROFLAG;           /*Z_零点标志01*/
              bit          MOTORRUN;             //伺服电机 推杆 1启动,0停止
              uint         RETDATA;                 //串口数据校对
              uint         X_Origin;             //X轴原点
              uint         Z_Origin;             //Z轴原点
              uint         X_AxialPostion;       //X轴位置
              uint         Z_AxialPostion;       //Z轴位置
              uint         X_TotalLength;        //X轴总长
              uint         Z_TotalLength;         //Z轴总长
              uint         ProductThickness;     //产品厚度
              uint         LayerNumber;          //装箱层数
              uint         LeftSpeed;             //左移速度
              uint         RightSpeed;             //右移速度
              uint         UpSpeed;                 //上行速度
              uint         DownSpeed;             //下行速度
              uint         X_OriginSpeed;        //X轴原点速度       
              uint         Z_OriginSpeed;         //Z轴原点速度
              uint         X_ScaleFactor;        //X轴比例系数
              uint         Z_ScaleFactor;        //Z轴比例系数
              uint         counter;              //产量计数器
              uchar        kcounter,kstatus;     //按键计数标志 按键状态标志
              uint         Data_val;
              uint         aa=0;
              uchar        StopFlag;          //
              uint         i;                 //定义数组array  存储工位数据
              typedef      uchar BYTE;
              typedef      uint WORD;
              void         IapIdle();
              BYTE         IapReadByte(WORD addr);
/*------------------延时子程序------------------------*/
             void delay50us(uchar x)        //@12.000MHz    50us
             {
              uint i,j;
              for(i=0;i<x;i++)
              for(j=0;j<2;j++);
             }
/*------------------延时子程序------------------------*/
             void delay(uint t)
             {
              uint i,j;
              for(i=0;i<t;i++)
              for(j=0;j<5;j++);
             }
/*---------------延时子程序----------------*/
              void delay1(uint ms)
              {
              uint i,j;
              for(i=0;i<ms;i++)
              for(j=0;j<10;j++)
              ;
              }
/*----关闭IAP----------------------------*/
              void IapIdle()
              {
              IAP_CONTR = 0;                  //关闭IAP功能
              IAP_CMD = 0;                    //清除命令寄存器
              IAP_TRIG = 0;                   //清除触发寄存器
              IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
              IAP_ADDRL = 0;
              }
/*-从ISP/IAP/EEPROM区域读取一字节-*/
              BYTE IapReadByte(WORD addr)
              {
              BYTE dat;                       //数据缓冲区
              IAP_CONTR = ENABLE_IAP;         //使能IAP
              IAP_CMD = CMD_READ;             //设置IAP命令
              IAP_ADDRL = addr;               //设置IAP低地址
              IAP_ADDRH = addr >> 8;          //设置IAP高地址
              IAP_TRIG = 0x5a;                //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                //写触发命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据
              IapIdle();                      //关闭IAP功能
              return dat;                     //返回
              }
/*-写一字节数据到ISP/IAP/EEPROM区域-*/
              void IapProgramByte(WORD addr, BYTE dat)
              {
              IAP_CONTR = ENABLE_IAP;         //使能IAP
              IAP_CMD = CMD_PROGRAM;          //设置IAP命令
              IAP_ADDRL = addr;               //设置IAP低地址
              IAP_ADDRH = addr >> 8;          //设置IAP高地址
              IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
              IAP_TRIG = 0x5a;                //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                //写触发命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }
/*---扇区擦除---------------*/
              void IapEraseSector(WORD addr)
              {
              IAP_CONTR = ENABLE_IAP;         //使能IAP val=IapReadByte(IAP_ADDRESS+1);
              IAP_CMD = CMD_ERASE;            //设置IAP命令
              IAP_ADDRL = addr;               //设置IAP低地址
              IAP_ADDRH = addr >> 8;          //设置IAP高地址
              IAP_TRIG = 0x5a;                //写触发命令(0x5a)
              IAP_TRIG = 0xa5;                //写触发命令(0xa5)
              _nop_();                        //等待ISP/IAP/EEPROM操作完成
              IapIdle();
              }    
/*-----------------------------------------*/
              void red_eeprom(void)
              {
              uint m,n;
              LeftSpeed=IapReadByte(IAP_ADDRESS_0);             //左移速度
              RightSpeed=IapReadByte(IAP_ADDRESS_0+1);          //右移速度
              UpSpeed=IapReadByte(IAP_ADDRESS_0+2);                //上行速度
              DownSpeed=IapReadByte(IAP_ADDRESS_0+3);           //下行速度
              ProductThickness=IapReadByte(IAP_ADDRESS_0+4);    //产品厚度
              LayerNumber=IapReadByte(IAP_ADDRESS_0+5);            //装箱层数
              m=IapReadByte(IAP_ADDRESS_0+6);                   //X轴原点位置高八位
              n=IapReadByte(IAP_ADDRESS_0+7);                   //X轴原点位置低八位
              X_Origin=m*256+n;                     
              m=IapReadByte(IAP_ADDRESS_0+8);                   //X轴总长高八位
              n=IapReadByte(IAP_ADDRESS_0+9);                   //X轴总长低八位
              X_TotalLength=m*256+n;    
              m=IapReadByte(IAP_ADDRESS_0+10);                  //Z轴原点位置高八位
              n=IapReadByte(IAP_ADDRESS_0+11);                  //Z轴原点位置低八位
              Z_Origin=m*256+n;    
              m=IapReadByte(IAP_ADDRESS_0+12);                  //Z轴总长高八位
              n=IapReadByte(IAP_ADDRESS_0+13);                  //Z轴总长低八位
              Z_TotalLength=m*256+n;
              X_ScaleFactor=IapReadByte(IAP_ADDRESS_0+14);        //X轴比例系数
              Z_ScaleFactor=IapReadByte(IAP_ADDRESS_0+15);        //Z轴比例系数
              X_OriginSpeed=IapReadByte(IAP_ADDRESS_0+16);      //X轴原点速度
              Z_OriginSpeed=IapReadByte(IAP_ADDRESS_0+17);        //Z轴原点速度
              }
/*-----------------------------------------*/
              void write_eeproma()
              {
              IapEraseSector(IAP_ADDRESS_0); //扇区擦除
              IapProgramByte(IAP_ADDRESS_0,LeftSpeed);           /*写入左移速度*/
              IapProgramByte(IAP_ADDRESS_0+1,RightSpeed);        /*写入右移速度*/
              IapProgramByte(IAP_ADDRESS_0+2,UpSpeed);           /*写入上行速度*/
              IapProgramByte(IAP_ADDRESS_0+3,DownSpeed);         /*写入下行速度*/
              IapProgramByte(IAP_ADDRESS_0+4,ProductThickness);  /*写入产品厚度*/
              IapProgramByte(IAP_ADDRESS_0+5,LayerNumber);       /*写入装箱层数*/
              IapProgramByte(IAP_ADDRESS_0+6,X_Origin/256);      /*写入X轴原点位置高八位*/
              IapProgramByte(IAP_ADDRESS_0+7,X_Origin%256);      /*写入X轴原点位置低八位*/
              IapProgramByte(IAP_ADDRESS_0+8,X_TotalLength/256); /*写入X轴总长高八位*/
              IapProgramByte(IAP_ADDRESS_0+9,X_TotalLength%256); /*写入X轴总长低八位*/
              IapProgramByte(IAP_ADDRESS_0+10,Z_Origin/256);     /*写入Z轴原点位置高八位*/
              IapProgramByte(IAP_ADDRESS_0+11,Z_Origin%256);     /*写入Z轴原点位置八位*/
              IapProgramByte(IAP_ADDRESS_0+12,Z_TotalLength/256);/*写入Z轴总长高八位*/
              IapProgramByte(IAP_ADDRESS_0+13,Z_TotalLength%256);/*写入Z轴总长低八位*/    
              IapProgramByte(IAP_ADDRESS_0+14,X_ScaleFactor);    /*写入X轴比例系数*/
              IapProgramByte(IAP_ADDRESS_0+15,Z_ScaleFactor);    /*写入Z轴比例系数*/
              IapProgramByte(IAP_ADDRESS_0+16,X_OriginSpeed);    /*写入X轴原点速度*/
              IapProgramByte(IAP_ADDRESS_0+17,Z_OriginSpeed);    /*写入Z轴原点速度*/
              }
/****************按键计数器状态寄存器归零*************/
               void RstKey()
               {
               kcounter=0;                       //按键计数器归零
               kstatus=0;                        //状态寄存器归零
               }
/*****************按键低电平检测函数*****************/
               void   LowVoltKey(void)           //按键计数器状态标志加一
               {
               kcounter++;                       
               kstatus++;     
               delay(5);                         //延时                  
               }
/*****************按键高电平检测函数*****************/
               void    HighVoltKey(void)         //按键计数器加一 状态标志归零
               {
               kcounter++;                       //按键计数器加一
               kstatus=0;                        //按键状态标志归零
               delay(5);                         //延时
               }
/*------------发送数据到界面0-----------------------------*/
              void DisPlayData0()
              {
               printf("0XFF,0XFF,0XFF");
               Data_val=9999;
               printf("n0.val=%d\xff\xff\xff",Data_val);           //X轴位置
               printf("n0.val=%d\xff\xff\xff",Data_val);           //X轴位置
               printf("n7.val=%d\xff\xff\xff",Data_val);           //Z轴位置
               printf("n8.val=%d\xff\xff\xff",X_OriginSpeed);      //X轴原点速度
               printf("n9.val=%d\xff\xff\xff",Z_OriginSpeed);       //Z轴原点速度
              }
/*------------发送数据到界面1-----------------------------*/
              void DisPlayData1()
              {
               printf("0XFF,0XFF,0XFF");                           //,X_AxialPostion
               printf("n8.val=%d\xff\xff\xff",ProductThickness);   //产品厚度
               printf("n8.val=%d\xff\xff\xff",ProductThickness);   //产品厚度
               printf("n9.val=%d\xff\xff\xff",LayerNumber);           //装箱层数
               printf("n0.val=%d\xff\xff\xff",X_AxialPostion);       // X轴位置
               printf("n7.val=%d\xff\xff\xff",Z_AxialPostion);       // Z轴位置
              }
/*------------发送数据到界面2-----------------------------*/
              void DisPlayData2()
              {
               printf("0XFF,0XFF,0XFF");
               printf("n0.val=%d\xff\xff\xff",LeftSpeed);          //左移速度
               printf("n0.val=%d\xff\xff\xff",LeftSpeed);          //左移速度
               printf("n1.val=%d\xff\xff\xff",RightSpeed);           //右移速度
               printf("n2.val=%d\xff\xff\xff",UpSpeed);               //上行速度
               printf("n3.val=%d\xff\xff\xff",DownSpeed);           //下行速度
               printf("n4.val=%d\xff\xff\xff",ProductThickness);   //产品厚度
               printf("n5.val=%d\xff\xff\xff",LayerNumber);           //装箱层数
               printf("n6.val=%d\xff\xff\xff",X_Origin);           //X轴原点位置
               printf("n7.val=%d\xff\xff\xff",X_TotalLength);       //X轴总长
               printf("n8.val=%d\xff\xff\xff",Z_Origin);           //Z轴原点位置
               printf("n9.val=%d\xff\xff\xff",Z_TotalLength);       //Z轴总长
               printf("n10.val=%d\xff\xff\xff",X_ScaleFactor);       //X轴比例系数
               printf("n11.val=%d\xff\xff\xff",Z_ScaleFactor);       //Z轴比例系数
               delay(100);
              }
/*************关所有输出*******************************/             
               void reset_io()
               {
               LED0=1;
               LED1=1;
               LED2=1;
               LED3=11;
               Turntable=1;                         //Y7 转盘 输出 发信号给排列控制板
               PutterForword=1;                     //Y0 推杆前进 发信号给排列控制板
               PutterBack=1;                     //Y1 推杆后退 发信号给排列控制板
               X_MTORCP=1;                       //CP1 X轴脉冲
               X_MTORECT=1;                      //D1  X轴方向
               Z_MTORCP=1;                       //CP2 Z轴脉冲
                Z_MTORECT=1;                     //D2  Z轴方向
               }
/*************原点X轴左移****/
              void    LeftRun()      
              {
               X_MTORECT=1;
               MOTORRUN=1;
               while(X_ZEROFLAG&&MOTORRUN)                 //X轴原点标志未归零循环
               {
                LED1=~LED1;
                X_MTORCP=0;    
                delay1(X_OriginSpeed);
                X_MTORCP=1;
                delay1(X_OriginSpeed);
               }
              }
/**************原点X轴右移***/
              void    RightRun()
              {
               X_MTORECT=0;
               MOTORRUN=1;
               while(X_ZEROFLAG&&MOTORRUN)                 //X轴原点标志未归零循环
               {
                LED1=~LED1;
                X_MTORCP=0;    
                delay1(X_OriginSpeed);
                X_MTORCP=1;
                delay1(X_OriginSpeed);
               }
              }
/*************手动X轴左移****/
              void    Left_Run()       //X_MTORECT=P2^4;             //X轴方向
              {
               X_MTORECT=1;
               MOTORRUN=1;
               while(MOTORRUN)
               {
                X_MTORCP=0;    
                delay1(LeftSpeed);
                X_MTORCP=1;
                delay1(LeftSpeed);
                X_AxialPostion=X_AxialPostion+1;
                printf("n0.val=%d\xff\xff\xff",X_AxialPostion);       // X轴位置
               }
              }
/**************手动X轴右移***/
              void    Right_Run()
              {
               X_MTORECT=0;
               MOTORRUN=1;
               while(MOTORRUN)
               {
                X_MTORCP=0;    
                delay1(RightSpeed);
                X_MTORCP=1;
                delay1(RightSpeed);
                X_AxialPostion=X_AxialPostion-1;
                printf("n0.val=%d\xff\xff\xff",X_AxialPostion);       // X轴位置
               }
              }
/**************原点Z轴上升***/
              void  UpRun()
              {
               Z_MTORECT=1;
               MOTORRUN=1;
               while(Z_ZEROFLAG&&MOTORRUN)                 //Z轴原点标志未归零循环
               {
                LED1=~LED1;
                Z_MTORCP=0;    
                delay1(Z_OriginSpeed);
                Z_MTORCP=1;
                delay1(Z_OriginSpeed);
               }
              }
/**************原点Z轴下降***/
              void    DownRun()
              {
               Z_MTORECT=0;
               MOTORRUN=1;
               while(Z_ZEROFLAG&&MOTORRUN)                 //Z轴原点标志未归零循环
               {
                LED1=~LED1;
                Z_MTORCP=0;    
                delay1(Z_OriginSpeed);
                Z_MTORCP=1;
                delay1(Z_OriginSpeed);
               }
              }
/**************手动Z轴上升***/
              void  Up_Run()
              {
               Z_MTORECT=1;
               MOTORRUN=1;
               while(MOTORRUN)
               {
                Z_MTORCP=0;    
                delay1(UpSpeed);
                Z_MTORCP=1;
                delay1(UpSpeed);
                Z_AxialPostion=Z_AxialPostion-1;
                printf("n7.val=%d\xff\xff\xff",Z_AxialPostion);       // Z轴位置
               }
              }
/**************手动Z轴下降***/
              void    Down_Run()
              {
               Z_MTORECT=0;
               MOTORRUN=1;
               while(MOTORRUN)
               {
                Z_MTORCP=0;    
                delay1(DownSpeed);
                Z_MTORCP=1;
                delay1(DownSpeed);
                Z_AxialPostion=Z_AxialPostion+1;
                printf("n7.val=%d\xff\xff\xff",Z_AxialPostion);       // Z轴位置
               }
              }
/*------------初始化串口---------------------*/
              void InitUart()
              {
              SCON=0X50;                         //8位数据,可变波特率
              AUXR|=0x01;                        //串口1选择定时器2为波特率发生器
              AUXR|=0X04;                        //定时器2时钟为Fosc,即1T
              T2L=0XE0;                          //设置定时器处置  110592》9600
              T2H=0XFE;                          //设置定时器处置  110592》9600
              AUXR|=0X10;                        //启动定时器2
              TI=1;
              ES=1;                                 //
              EA=1;
              }
/*************串口中断数据接收****B0 03暂停******/
/******Receive_Flag 更新数据标志*****************/
/******a[i] 数据接收缓存数组 i 数组下标**********/
              void Uart() interrupt 4 using 1
              {
              if(RI)
               {
                if(SBUF==0XFA||SBUF==0XFF)         //触摸屏结束码
                {
                Receive_Flag=1;                     //接收数据标志置一
                RI=0;                             //
                i=0;                             //数组计数器归零
                }
                else
                {
                a[i]=SBUF;                       //数组下标位置的数据等于SBUF
                RI=0;                             //
                i++;
                }
                if(Receive_Flag==1)                  //设备停止 退出循环
                {
                 if(a[0]==0XA0)                     //写时间代码
                 {
                  if(a[1]==0X00)                     //写时间代码
                   {
                  Receive_Flag=0;                 //串口中断接收标志置零
                  i=0;                             //数组计数器归零
                  MOTORRUN=0;                     //关伺服电机 推杆进退
                  LED3=1;            
                  }
                 }
                }
               }
              }
/**************定时器0中断*************************/
               void timer0() interrupt 1
               {
               TH0=0X53;
               TL0=0X32;
               aa++;
               if(aa>=300)
                   {
                LED0=~LED0;
                aa=0;
                   }
               }
/**************X原点归零**************************/
              void exint0() interrupt 0          //INT0中断入口
              {
               RstKey();                         //按键复位                 
               if(X_ZEROFLAG==1)                 //
               {
                if(!INT0PUT)                     //中断入口
                {    
                 for(;kcounter<5;)               //按键循环5次
                 {
                  if(!INT0PUT)                   //中断入口低电平
                  {
                   LowVoltKey();                 //按键低电平 计数器加一状态标志加一
                  }
                  else if(~!INT0PUT)             //中断入口高电平
                  {
                   HighVoltKey();                 //高电平检测
                  }
                 }
                 if(kstatus>=3)                  /*按键状态标志大于等于3为有效值*/
                 {     
                 EX0=0;                          //关外部中断0
                 X_ZEROFLAG=0;                     //X轴原点标志
                 X_AxialPostion=X_Origin;        //X轴赋值    
                 delay(2000);
                 Up_XData=1;                     //原点更新标志
                 }
                }
                RstKey();                         //按键复位
               }
              }
/*************Z原点归零**************************/
             void exint1() interrupt 2
             {
               RstKey();                         //按键复位                 
               if(Z_ZEROFLAG==1)
               {
                if(!INT1PUT)                     //中断入口
                {    
                 for(;kcounter<5;)               //按键循环5次
                 {
                  if(!INT1PUT)                   //中断入口低电平
                  {
                   LowVoltKey();                 //按键低电平 计数器加一状态标志加一
                  }
                  else if(~!INT1PUT)             //中断入口高电平
                  {
                   HighVoltKey();                 //高电平检测
                  }
                 }
                 if(kstatus>=3)                  /*按键状态标志大于等于3为有效值*/
                 {     
                 EX1=0;                          //关外部中断1
                 Z_ZEROFLAG=0;                     //Z轴原点标志
                 Z_AxialPostion=Z_Origin;        //Z轴赋值    
                 Up_ZData=1;                     //原点更新标志
                 }
                }                                
                RstKey();                         //按键复位
               }
              }
/*************************************************/
              void   main( )                     /*主程序开始*/
              {
               reset_io();                         //reset_io
               AUXR=0X80;                        //STC系列的1T 设置
               TMOD=0X01;
               TH0=0X53;
               TL0=0X32;
               ET0=1;
               TR0=1;
               IT0=1;                            //使能INT0下降沿中断
               EX0=1;                            //使能INT0中断
               IT1=1;                            //使能INT1下降沿中断
               EX1=1;                            //使能INT1中断
               P_SW1=0x00;                       //RXD/P3.0, TXD/P3.1
               Receive_Flag=0;    
               i=0;                              //数据接收计数器等于0
               InitUart();                       //初始化串口
               delay50us(20);                     //    
               red_eeprom();                     //
               delay(100);                         //
               printf("0XFF,0XFF,0XFF");
               DisPlayData0();                     //X轴     Z轴原点速度
               X_AxialPostion=0;                 //X轴位置
               Z_AxialPostion=0;                 //Z轴位置
               counter=0;                        //产量归零
               StopFlag=0;                         //
               MOTORRUN=0;                         //
               X_ZEROFLAG=1;                     //X原点标志等于1 未回原点状态
               Z_ZEROFLAG=1;                     //Z原点标志等于1 未回原点状态
               while(1)
               {
/*******原点更新标志查询***************/
/***X轴更新标志为1,显示X轴原点位置*****/
/******XZ轴都回原点 跳转主页面*********/
                 if(Up_XData==1)                 //X轴原点更新标志为1,刷新X轴位置
                 {
                  Up_XData=0;
                  printf("n0.val=%d\xff\xff\xff",X_AxialPostion); //X轴位置
                  printf("n0.val=%d\xff\xff\xff",X_AxialPostion); //X轴位置
                  if(X_ZEROFLAG==0&&Z_ZEROFLAG==0)       //XZ轴都回原点 跳转主页面
                  {
                  delay(100);                           //
                  printf("page 1\XFF\XFF\XFF");     
                  }
                 }
/***Z轴更新标志为1,显示Z轴原点位置*****/
/******XZ轴都回原点 跳转主页面*********/
                 else if(Up_ZData==1)                  //Z轴原点更新标志为1,刷新Z轴位置
                 {
                  Up_ZData=0;
                  printf("n7.val=%d\xff\xff\xff",Z_AxialPostion); //Z轴位置
                  printf("n7.val=%d\xff\xff\xff",Z_AxialPostion); //Z轴位置
                  if(X_ZEROFLAG==0&&Z_ZEROFLAG==0)                  //XZ轴都回原点 跳转主页面
                  {
                   delay(100);                                    //
                   printf("page 1\XFF\XFF\XFF");     
                  }
                 }

               if(Receive_Flag==1)                                //串口接收标志
               {
                Receive_Flag=0;                                    //串口接收标志复位
                if(a[0]==0XEF)                                    //请求单片机写EEPROM
                {
                 printf("n12.val=%d\xff\xff\xff",i);            //数组计数器归零
                 printf("n13.val=%d\xff\xff\xff",RETDATA);      //返回数据      命令
                 RETDATA=a[0];
                 printf("n13.val=%d\xff\xff\xff",RETDATA);      //返回数据      命令
                 RETDATA=a[1];
                 printf("n14.val=%d\xff\xff\xff",RETDATA);      //返回数据      参数
                 RETDATA=a[2];
                 printf("n15.val=%d\xff\xff\xff",RETDATA);      //返回数据      数字高位
                 RETDATA=a[3];
                 printf("n16.val=%d\xff\xff\xff",RETDATA);      //返回数据      数字低位
                 if(a[1]==0X00)                     
                 {
                  X_OriginSpeed=a[2];             //X轴原点速度
                 }
                 else if(a[1]==0X01)                     
                 {
                  Z_OriginSpeed=a[2];             //Z轴原点速度
                 }
                 else if(a[1]==0X02)             //左移速度
                 {
                 LeftSpeed=a[2];    
                 }
                 else if(a[1]==0X03)             //右移速度
                 {
                 RightSpeed=a[2];
                 }
                 else if(a[1]==0X04)             //上行速度
                 {
                 UpSpeed=a[2];         ///
                 }
                 else if(a[1]==0X05)             //下行速度
                 {
                 DownSpeed=a[2];
                 }
                 else if(a[1]==0X06)             //产品厚度
                 {
                  ProductThickness=a[2];
                 }
                 else if(a[1]==0X07)             //装箱层数
                 {
                  LayerNumber=a[2];
                 }
                 else if(a[1]==0X08)             //X轴原点位置
                 {
                  X_Origin=a[3]*256+a[2];
                 }
                 else if(a[1]==0X09)             //X轴总长
                 {
                  X_TotalLength=a[3]*256+a[2];
                 }
                 else if(a[1]==0X0A)             //Z轴原点位置
                 {
                  Z_Origin=a[3]*256+a[2];
                 }
                 else if(a[1]==0X0B)             //Z轴总长
                 {
                  Z_TotalLength=a[3]*256+a[2];     //
                 }
                 else if(a[1]==0X0C)                     
                 {
                  X_ScaleFactor=a[2];             //X轴比例系数r
                 }
                 else if(a[1]==0X0D)                     
                 {
                  Z_ScaleFactor=a[2];             //Z轴比例系数r
                 }
                 Data_val=a[3]*256+a[2];         //
                 write_eeproma();
                }
                else if(a[0]==0XA0)                 //主画面后初始化事件
                {        
                 if(a[1]==0X55)
                 {
                  LED0=0;
                  Turntable=0;                     //转盘开
                 }
                 else if(a[1]==0XAA)
                 {
                  LED0=1;
                  Turntable=1;                     //转盘关
                 }
                 else if(a[1]==0X01)             //左移
                 {
                 MOTORRUN=1;
                 LeftRun();                      //原点状态左移
                 }
                 else if(a[1]==0X02)             //右移
                 {
                 MOTORRUN=1;
                 RightRun();                      //原点状态右移
                 }
                 else if(a[1]==0X03)             //原点状态上行
                 {
                 MOTORRUN=1;
                 UpRun();
                 }
                 else if(a[1]==0X04)             //原点状态下行
                 {
                 MOTORRUN=1;
                 DownRun();
                 }
                 else if(a[1]==0X05)             //推杆前进
                 {
                 PutterForword=0;
                 PutterBack=1;
                 }
                 else if(a[1]==0X06)             //推杆后退
                 {
                 PutterBack=0;
                 PutterForword=1;
                 }
                 else if(a[1]==0X08)             //关推杆前进后退
                 {
                 PutterBack=1;
                 PutterForword=1;
                 }
                }
               else if(a[0]==0XA2)                 //主画面后初始化事件
                {
                 if(a[1]==0X01)                  //左移
                 {
                  MOTORRUN=1;
                  Left_Run();                      //Left_Run
                 }
                 else if(a[1]==0X02)             //右移
                 {
                  MOTORRUN=1;
                  Right_Run();
                 }
                 else if(a[1]==0X03)             //上行
                 {
                  MOTORRUN=1;
                  Up_Run();
                 }
                 else if(a[1]==0X04)             //下行
                 {
                  MOTORRUN=1;
                  Down_Run();
                 }
                 else if(a[1]==0X05)             
                 {
                  ClampingOut=0;                  //涨紧  输出
                  ReleaseOut=1;
                  RstKey();                         //按键复位
                   for(;kcounter<5;)             //按键循环5次
                   {
                    if(!ClampingStop)            //中断入口低电平
                    {
                    LowVoltKey();                //按键低电平 计数器加一状态标志加一
                    }
                    else if(~!ClampingStop)      //中断入口高电平
                    {
                    HighVoltKey();                 //高电平检测
                    }
                   }
                   if(kstatus>=3)                /*按键状态标志大于等于3为有效值*/
                   {     
                   ClampingOut=1;                  //关涨紧输出
                   }
                  }
                 else if(a[1]==0X06)             
                 {
                  ReleaseOut=0;                     //释放  输出
                  ClampingOut=1;
                  RstKey();                         //按键复位
                   for(;kcounter<5;)             //按键循环5次
                   {
                    if(!ClampingStop)            //中断入口低电平
                    {
                    LowVoltKey();                //按键低电平 计数器加一状态标志加一
                    }
                    else if(~!ClampingStop)      //中断入口高电平
                    {
                    HighVoltKey();                 //高电平检测
                    }
                   }
                   if(kstatus>=3)                /*按键状态标志大于等于3为有效值*/
                   {    
                   ReleaseOut=1;                 //释放  输出  
                   }
                 }
               }
                else if(a[0]==0XE1)                 //请求单片机发送数据到界面1
                {
                 RETDATA=a[0];
                 printf("n13.val=%d\xff\xff\xff",RETDATA);          //返回数据      命令
                 RETDATA=a[1];
                 printf("n14.val=%d\xff\xff\xff",RETDATA);          //返回数据      参数
                 RETDATA=a[2];
                 printf("n15.val=%d\xff\xff\xff",RETDATA);          //返回数据      数字高位
                 RETDATA=a[3];
                 printf("n16.val=%d\xff\xff\xff",RETDATA);          //返回数据      数字低位
                 if(a[1]==0X00)                     //
                 {
                  if(X_ZEROFLAG==0&&Z_ZEROFLAG==0)
                  {
                   printf("n0.val=%d\xff\xff\xff",X_AxialPostion); //X轴位置
                   printf("n7.val=%d\xff\xff\xff",Z_AxialPostion); //Z轴位置
                  }
                  else
                  {
                  DisPlayData0();
                  }
                 }
                 if(a[1]==0X01)                     //
                 {
                  DisPlayData1();
                 }
                 if(a[1]==0X11)                     //请求单片机发送数据到界面2
                 {
                  DisPlayData2();
                 }
                 if(a[1]==0XE1)                     //出厂数据恢复
                 {
                  X_OriginSpeed=12;              //X轴原点速度       
                  Z_OriginSpeed=12;                 //Z轴原点速度
                  LeftSpeed=10;                  //左移速度
                  RightSpeed=10;                 //右移速度
                  UpSpeed=10;                     //上行速度
                  DownSpeed=10;                     //下行速度
                  ProductThickness=20;           //产品厚度
                  LayerNumber=30;                 //装箱层数
                  X_Origin=20;                     //X轴原点位置
                  X_TotalLength=320;             //X轴总长
                  Z_Origin=60;                   //Z轴原点位置
                  Z_TotalLength=600;             //Z轴总长
                  X_ScaleFactor=10;                 //X轴比例系数
                  Z_ScaleFactor=10;                 //Z轴比例系数
                  write_eeproma();
                  delay50us(20);                 //    
                  red_eeprom();                     //
                  DisPlayData2();
                 }                        
                }
                i=0;                             //数组计数器归零
               }
              }    
             }                                     //L804  CODE5188  2021 2 23           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值