潘宁不一般 发表于 2022-4-25 09:13

51单片机的接收上位机指令,并控制步进电机

跪求大神看一下程序解答一下。我的程序是单片机接收上位机发来的数字,后对应不同的数字指令通过两个电机做出上下左右的模拟转动。程序语法都没问题,没有错误和警告,也能正常接收上位机的数据,但是就是不执行命令。能看到上位机发送命令后单片机接收灯闪烁一下,但是单片机接的步进电机不动。程序单独拿出去无限循环都能执行。

[*]#include<reg52.h>


[*]

#define uchar unsigned char


[*]

#define uintunsigned int


[*]

#define Motor1Data P0                  //步进电机控制接口定义


[*]

#define Motor2Data P2                  //步进电机控制接口定义


[*]

void init(void);                  //串口初始化


[*]

unsigned char a;


[*]

uchar phasecw[4] ={0x08,0x04,0x02,0x01};//正转 电机导通相序 D-C-B-A


[*]

uchar phaseccw[4]={0x01,0x02,0x04,0x08};//反转 电机导通相序 A-B-C-D


[*]

//串口初始化,设定传输波特率为9600


[*]

void init(void)


[*]

{


[*]

    TMOD = 0x20;    //定时器1,模式2工作模式   


[*]

    SCON = 0x50;    //串口工作模式1


[*]

    TH1 = 0xfa; //9600


[*]

    TL1 = 0xfa;


[*]

    ES = 1;


[*]

    EA = 1;


[*]

    TR1 = 1;


[*]

}


[*]

//jie shou


[*]

void rece(void)


[*]

{


[*]

q1:if(RI==0) goto q1;


[*]




[*]

      a=SBUF;


[*]

      RI=0;


[*]




[*]

   return;


[*]

}


[*]

//ms延时函数


[*]

void Delay_xms(uint x)


[*]

{


[*]

uint i,j;


[*]

for(i=0;i<x;i++)


[*]

for(j=0;j<112;j++);


[*]

}


[*]

//X顺时针转动


[*]

void Motor1CW(void)


[*]

{


[*]

uchar i;


[*]

for(i=0;i<4;i++)


[*]

{


[*]

   Motor1Data=phasecw;


[*]

   Delay_xms(15);//转速调节


[*]

}


[*]

}


[*]

//X逆时针转动


[*]

void Motor1CCW(void)


[*]

{


[*]

uchar i;


[*]

for(i=0;i<4;i++)


[*]

{


[*]

   Motor1Data=phaseccw;


[*]

   Delay_xms(15);//转速调节


[*]

}


[*]

}


[*]

//Y顺时针转动


[*]

void Motor2CW(void)


[*]

{


[*]

uchar i;


[*]

for(i=0;i<4;i++)


[*]

{


[*]

   Motor2Data=phasecw;


[*]

   Delay_xms(15);//转速调节


[*]

}


[*]

}


[*]

//Y逆时针转动


[*]

void Motor2CCW(void)


[*]

{


[*]

uchar i;


[*]

for(i=0;i<4;i++)


[*]

{


[*]

   Motor2Data=phaseccw;


[*]

   Delay_xms(15);//转速调节


[*]

}


[*]

}


[*]

//停止转动


[*]

void MotorStop(void)


[*]

{


[*]

Motor1Data=0x00;


[*]

Motor2Data=0x00;


[*]

}


[*]

//主函数


[*]

void main(void)


[*]

{


[*]

    uint i;


[*]

    init();


[*]

q2: rece();


[*]

    Delay_xms(50);//等待系统稳定


[*]

switch(a)


[*]

{


[*]

    case 1:


[*]

      for(i=0;i<100;i++)


[*]

      {


[*]

       Motor2CW(); //Y顺时针转动


[*]

      }


[*]

      MotorStop();//停止转动


[*]

      Delay_xms(500);


[*]

    case 2:


[*]

      for(i=0;i<100;i++)


[*]

      {


[*]

       Motor2CCW();//Y逆时针转动


[*]

      }


[*]

      MotorStop();//停止转动


[*]

      Delay_xms(500);


[*]

    case 3:


[*]

      for(i=0;i<100;i++)


[*]

      {


[*]

       Motor1CCW();//X逆时针转动


[*]

      }


[*]

      MotorStop();//停止转动


[*]

      Delay_xms(500);


[*]

    case 4:


[*]

      for(i=0;i<100;i++)


[*]

      {


[*]

       Motor1CW();//X顺时针转动


[*]

      }


[*]

      MotorStop();//停止转动


[*]

      Delay_xms(500);


[*]

      }goto q2;


[*]

}







页: [1]
查看完整版本: 51单片机的接收上位机指令,并控制步进电机