闪乱猫乐咖啡酱 2019-05-16 17:47 采纳率: 0%
浏览 1009

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

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

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned 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[i];
   Delay_xms(15);//转速调节
  }
}
//X逆时针转动
void Motor1CCW(void)
{
 uchar i;
 for(i=0;i<4;i++)
  {
   Motor1Data=phaseccw[i];
   Delay_xms(15);//转速调节
  }
}
//Y顺时针转动
void Motor2CW(void)
{
 uchar i;
 for(i=0;i<4;i++)
  {
   Motor2Data=phasecw[i];
   Delay_xms(15);//转速调节
  }
}
//Y逆时针转动
void Motor2CCW(void)
{
 uchar i;
 for(i=0;i<4;i++)
  {
   Motor2Data=phaseccw[i];
   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条回答

  • weixin_45078358 2019-05-16 17:59
    关注

    这个要看实际的效果,你的硬件是怎么样,你要说清楚。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题