闪乱猫乐咖啡酱 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 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问