机械手排列控制器程序&接线图

 

/***排列控制板外部中断0计数   输出测试***/
/***L449 CODE 2508 2021  2 28         ***/
/***2021 1 12   触摸屏按键控制动作  *****/
/***触摸屏定时器 va0.val值显示动作状态***/
/************ 左 输入顺序 右  ***********/           
/***81.1 1.0 3.7 3.6 3.5 3.4 3.3 3.2 8***/
/*************8左 输出顺序 右************/
/***81.5 1.2 1.3 1.4 1.6 1.7 5.4 5.5*****/
              #include     <REG52.H>  
              #include     <intrins.h>                  //
              #include     <string.h>
              #include     <stdlib.h>
              #include     "stdio.h"
              #define      uint unsigned int
              #define      uchar unsigned char
              typedef      unsigned char BYTE;
              typedef      unsigned int WORD;
              uint         mm=0;
              uint         i,S;
              uint         a[10];                //定义数组a 存储串口数组
              uint         S_Counter=0;
              uint         Counter;
              bit          Counter_Flag;
              bit           Receive_Flag;
              bit           Turntable_Flag;         //转盘运转标志 开启后主程序循环检测转盘开启输入端口电平
              bit           Signauto=0;              //高电平检测循环标志
              sbit         INTPUT0=P1^1;          //主机开转盘
              sbit         INTPUT1=P1^0;         //主机开推杆前进
              sbit         INTPUT2=P3^7;         //主机开推杆后退
              sbit         INTPUT3=P3^6;         //推杆前进停止
              sbit         INTPUT4=P3^5;          //推杆后退停止
              sbit         Auto_Flag=P3^4;         //自动输入引脚
              sbit         Turntable=P1^5;         //Turntable  转盘
              sbit         X_Axial=P1^2;          //排列X轴
              sbit         Y_Axial=P1^3;          //排列Y轴
              sbit         OUT3=P1^4;
              sbit         LED=P1^6;
              sbit         Y_EN=P1^7;             //Putter 推杆使能
              sbit         Y_F=P5^4;             //Putter 推杆前进
              sbit         Y_B=P5^5;              //Putter 推杆后退
              uint         kcounter,kstatus;     //按键计数标志 按键状态标志
/*------------------------------------------*/
              void delay(uint t)
              {
              uint i,j;
              for(i=0;i<t;i++)
              for(j=0;j<100;j++);
              }
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
               void Delay100ms(uint x)              //
               {
               uint i,j;
               for(i=0;i<x;i++)
               for(j=0;j<11000;j++);
               }
/****************按键计数器状态寄存器归零*************/
               void RstKey()
               {
               kcounter=0;                       //按键计数器归零
               kstatus=0;                        //状态寄存器归零
               }
/*****************按键低电平检测函数*****************/
               void   LowVoltKey(void)           //按键计数器状态标志加一
               {
               kcounter++;                       
               kstatus++;     
               }
/*****************按键高电平检测函数*****************/
               void    HighVoltKey(void)         //按键计数器加一 状态标志归零
               {
               kcounter++;                       //按键计数器加一
               kstatus=0;                        //按键状态标志归零
               }
/*********************************************/
              void resrt_io()
              {
              LED=0;
              Y_EN=0;
              Y_F=0;
              Y_B=0;
              Turntable=1;
              X_Axial=1;
              Y_Axial=1;
              OUT3=1;
             }
/*------------初始化串口---------------------*/
              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;                                 //
              }
/*×--------UART 中断服务程序-------------------**/
/**×**把接收到的数据存进数组a[i]**i开机初始化****/
/***×*接收到触摸屏结束码Receive_Flag标志位置1****/
/****×主程序检测到标志码=1判断指令功能***********/
              void Uart() interrupt 4 using 1
              {
               if(RI)
               {
                if(SBUF==0XFA||SBUF==0XFF)       //触摸屏结束码
                {
                Receive_Flag=1;                     //接收数据标志置一
                RI=0;                             //
                i=0;                             //数组计数器归零
                S_Counter++;
                }
                else
                {
                a[i]=SBUF;                        //数组下标位置的数据等于SBUF
                RI=0;                              //
                i++;
                }
               }
              }
/************INT0中断入口************************/
              void exint0() interrupt 0          //INT0中断入口
              {
               RstKey();
               for(;kcounter<5;)                //按键循环5次
               {
                if(!INT0)                        //按键低电平
                {
                LowVoltKey();                    //按键低电平 计数器加一状态标志加一
                }
                else if(~!INT0)                  //按键高电平
                {
                HighVoltKey();                   //按键计数器加一    状态标志归零
                }
               }
               if(kstatus>=3)
               {
                mm=0;                             //
                EX0=0;                              //关闭外部中断0使能
            //    Counter++;                         //接收数据计数器加1
            //    Counter_Flag=1;                     //计数标志为1,发数值到触摸屏
                LED=~LED;
               }
              }
/************INT1中断入口************************/
              void   exint1() interrupt 2        //按下外部中断1后点亮OUTA一秒钟后熄灭     
              {
               RstKey();
               for(;kcounter<5000;)              //按键循环5次
               {
                if(!INT1)                        //按键低电平
                {
                LowVoltKey();                    //按键低电平 计数器加一状态标志加一
                }
                else if(~!INT1)                  //按键高电平
                {
                HighVoltKey();                   //按键计数器加一    状态标志归零
                }
               }
               if(kstatus>=4000)
               {
               
               }
              }
/********************************************/
               void timer0() interrupt 1
               {  
               mm++;
               if(mm==10)                         //定时器抗干扰计数器
                {
                mm=0;
                EX0=1;                              //开外部中断0使能
                LED=~LED;
                }
               }
/************************************/
              void   main( )                      /*主程序开始*/
              {
               resrt_io();
               INT0=1;
               INT1=1;
               IT0=1;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
               EX0=1;                    //使能INT0中断
               INT1=1;
               IT1=1;                    //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
               EX1=1;                    //使能INT1中断
               P_SW1=0x00;                       //RXD/P3.0, TXD/P3.1
               Receive_Flag=0;    
               InitUart();                        //初始化串口
               printf("0XFF,0XFF,0XFF");
               Delay100ms(5);
               i=0;
               S=0;
               TMOD=0X00;                        //设置定时器为模式0(16位自动重装载)
               TL0=0X50;                         //初始化计时值
               TH0=0X50;
               TR0=1;                            //定时器0开始计时
               ET0=1;                            //使能定时器0中断
               delay(50);
               S_Counter=0;
               Counter_Flag=0;                     //计数标志为1,发数值到触摸屏
               Turntable_Flag=0;                 //转盘运转标志
               while(1)
               {

               if(Counter_Flag==1)                 //计数标志为1,发数值到触摸屏
                {
                Counter_Flag=0;                     //关闭计数标志
                printf("n1.val=%d\xff\xff\xff",Counter);  //转盘计数器
                }
//串口数据内容解析
               if(Receive_Flag==1)
               {
                Receive_Flag=0;                     //重新接收      S_Counter
                printf("n0.val=%d\xff\xff\xff",S_Counter);  //串口帧接收计数器
                if(a[0]==0XE2)
                {
                 if(a[1]==0XA1)
                 {
                 Y_EN=1;                         //开电机使能
                 Y_F=1;                             //开推杆向前
                 Y_B=0;
                 }
                 else if(a[1]==0XA2)
                 {
                 Y_EN=1;                         //开电机使能
                 Y_F=0;                             //开推杆向后
                 Y_B=1;
                 }
                 else if(a[1]==0XA3)
                 {
                 Turntable=0;                     //开转盘
                 }
                 else if(a[1]==0XA4)
                 {
                 Turntable=1;                     //关转盘
                 }
                 else if(a[1]==0XA5)
                 {
                  X_Axial=0;                     //X_Axial开
                 }
                 else if(a[1]==0XA6)
                 {
                  X_Axial=1;                     //X_Axial关
                 }
                 else if(a[1]==0XA7)
                 {
                  Y_Axial=0;                     //Y_Axial开
                 }
                 else if(a[1]==0XA8)
                 {
                  Y_Axial=1;                     //Y_Axial关
                 }
                 else if(a[1]==0XA9)
                 {
                 Y_EN=0;                         //关电机使能
                 Y_F=0;                             //关推杆向前
                 Y_B=0;                          //关推杆向后
                 }
                }
               }
               if(Turntable_Flag==1)             //转盘开启标志等于1
                {
//INTPUT0高电平转盘关
                 RstKey();
                 for(;kcounter<5;)                //按键循环5次
                 {
                  if(~!INTPUT0)                   //按键高电平
                  {
                  LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                  }
                  else if(!INTPUT0)              //按键低电平
                  {
                  HighVoltKey();                  //按键计数器加一    状态标志归零
                  }
                 }
                 if(kstatus>=3)                   /*按键状态标志大于等于3为有效值*/
                 {  
                 Turntable_Flag=0;                  //高电平退出循环
                 Turntable=1;                     //关转盘
                 printf("t2.txt=\"转盘关\"");
                 printf("\xff\xff\xff");//
                 }
                }
//INTPUT0低电平转盘开
                RstKey();
                if(Turntable_Flag==0)             //
                {
                 for(;kcounter<5;)               //按键循环5次
                 {
                  if(!INTPUT0)                   //按键低电平
                  {
                  LowVoltKey();                  //按键低电平 计数器加一状态标志加一
                  }
                  else if(~!INTPUT0)             //按键高电平
                  {
                  HighVoltKey();                 //按键计数器加一    状态标志归零
                  }
                 }
                 if(kstatus>=3)                  /*按键状态标志大于等于3为有效值*/
                 {  
                 Turntable=0;                     //开转盘
                 printf("t2.txt=\"转盘开\"");
                 printf("\xff\xff\xff");//
                  Turntable_Flag=1;                 //转盘运转标志=1;                      
                 }
               }
//主机开推杆进
               RstKey();
               for(;kcounter<5;)                 //按键循环5次
               {
                if(!INTPUT1)                     //按键低电平
                {
                LowVoltKey();                    //按键低电平 计数器加一状态标志加一
                }
                else if(~!INTPUT1)               //按键高电平
                {
                HighVoltKey();                   //按键计数器加一    状态标志归零
                }
               }
               if(kstatus>=3)                    /*按键状态标志大于等于3为有效值*/
               {  
                printf("t5.txt=\"推杆进\"");
                printf("\xff\xff\xff");//
                Y_EN=1;                             //开电机使能
                Y_F=1;                             //开推杆向前
                Y_B=0;
//主机关推杆进
                Signauto=1;                      //高电平循环标志
                while(Signauto)
                 {
                  RstKey();
                  for(;kcounter<5;)              //按键循环5次
                  {
                   if(~!INTPUT1)                 //按键高电平
                   {
                   LowVoltKey();                 //按键低电平 计数器加一状态标志加一
                   }
                   else if(!INTPUT1)             //按键低电平
                   {
                   HighVoltKey();                //按键计数器加一    状态标志归零
                   }
                  }
                  if(kstatus>=3)                 /*按键状态标志大于等于3为有效值*/
                  {  
                  Signauto=0;                      //高电平退出循环
                  Y_EN=0;                         //关电机使能
                  Y_F=0;                         //关推杆向前
                  Y_B=0;                          //关推杆向后
                  printf("t5.txt=\"推杆停\"");
                  printf("\xff\xff\xff");//
                  }
//推杆向前限位检测 INTPUT3
                 RstKey();
                 for(;kcounter<5;)                //按键循环5次
                  {
                   if(!INTPUT3)                    //按键低电平
                   {
                   LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                   }
                   else if(~!INTPUT3)              //按键高电平
                   {
                   HighVoltKey();                  //按键计数器加一    状态标志归零
                   }
                  }
                  if(kstatus>=3)                    /*按键状态标志大于等于3为有效值*/
                  {  
                  Signauto=0;                      //高电平退出循环
                  Y_EN=0;                         //关电机使能
                  Y_F=0;                         //关推杆向前
                  Y_B=0;                          //关推杆向后
                  printf("t5.txt=\"推杆停\"");
                  printf("\xff\xff\xff");//
                  }
                 }
                }
//主机开推杆退

               RstKey();
               for(;kcounter<5;)                 //按键循环5次
               {
                if(!INTPUT2)                     //按键低电平
                {
                LowVoltKey();                    //按键低电平 计数器加一状态标志加一
                }
                else if(~!INTPUT2)               //按键高电平
                {
                HighVoltKey();                    //按键计数器加一    状态标志归零
                }
               }
               if(kstatus>=3)                    /*按键状态标志大于等于3为有效值*/
               {  
               printf("t5.txt=\"推杆退\"");
               printf("\xff\xff\xff");//
               Y_EN=1;                             //开电机使能
               Y_F=0;                             //开推杆向后
               Y_B=1;
               //主机关推杆退
               Signauto=1;                          //高电平循环标志
               while(Signauto)
               {
                RstKey();
                for(;kcounter<5;)                //按键循环5次
                {
                  if(~!INTPUT2)                  //按键高电平
                  {
                  LowVoltKey();                  //按键低电平 计数器加一状态标志加一
                  }
                  else if(!INTPUT2)              //按键低电平
                  {
                  HighVoltKey();                 //按键计数器加一    状态标志归零
                  }
                 }
                 if(kstatus>=3)                  /*按键状态标志大于等于3为有效值*/
                 {
                 Signauto=0;                      //高电平退出循环
                 printf("t5.txt=\"推杆停\"");
                 printf("\xff\xff\xff");//
                 Y_EN=0;                         //关电机使能
                 Y_F=0;                             //关推杆向前
                 Y_B=0;                          //关推杆向后
                 }
//推杆向后限位检测
                 RstKey();
                 for(;kcounter<5;)                //按键循环5次
                  {
                   if(!INTPUT4)                    //按键低电平
                   {
                   LowVoltKey();                   //按键低电平 计数器加一状态标志加一
                   }
                   else if(~!INTPUT4)              //按键高电平
                   {
                   HighVoltKey();                  //按键计数器加一    状态标志归零
                   }
                  }
                  if(kstatus>=3)                    /*按键状态标志大于等于3为有效值*/
                  {  
                  Signauto=0;                      //高电平退出循环
                  printf("t5.txt=\"推杆停\"");
                  printf("\xff\xff\xff");//
                  Y_EN=0;                         //关电机使能
                  Y_F=0;                             //关推杆向前
                  Y_B=0;                          //关推杆向后
                  }
                 }
                }
               }  
              }       //L449 CODE 2508 2021  2 28

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值