标题: 89c51控制42步进电机转动一定角度,转动角度不对,求指教!!! [打印本页]

作者: suellasun    时间: 2017-11-29 14:53
标题: 89c51控制42步进电机转动一定角度,转动角度不对,求指教!!!
本帖最后由 suellasun 于 2017-11-29 14:56 编辑

#include<reg51.h>
#define MotorTabNum 5
unsigned char T0_NUM;
unsigned char END_FLAG = 0;

sbit MotorEn = P2^1;     // 使能
sbit FX = P2^0;          // 方向
sbit CLK = P2^2;         // 脉冲
unsigned char g_MotorSt = 0;     // 启停
unsigned char g_MotorDir = 0;    // 正反
unsigned int SET_MotorPulse = 0;  //相应角度对应的脉冲数量
unsigned int CLK_OUT_NUM = 0;  // 脉冲计数
signed int MotorSpedNum = 0;      // 速度档
float CUR_MotorAngle = 0.0;   // 当前角度
int MotorAngle;      
unsigned char MotorTab[6] = {12, 10, 8, 6, 4, 2};

signed char g_MotorNum = 0;
//--------------
void delayms(xms);
void mDelay(unsigned int DelayTime);  //延时函数
void T0_Init();
unsigned char Recive();
void SecondPro();
// 串口接收主程序
void main(void)
{
unsigned char lsData = 0;
T0_Init();      // 定时器0 1 初始化
MotorEn = 0;     // 使能关闭
FX = 0;          // 方向
while(1)
{
  lsData = Recive();
  if(lsData == 'A')      
  {
   MotorAngle=90;
   SET_MotorPulse=(unsigned int)((MotorAngle/0.9)*8.0);
   SecondPro();  
  }
}
}
void SecondPro()
{
if (END_FLAG)   // 角度目标达到
{
  END_FLAG = 0; // 清
  g_MotorSt = 0; // 电机关闭标志
  MotorEn = 0;
}
else
{
  TR0 = 1; //开启定时器
  g_MotorSt = 1;//开电机
  MotorEn = 1;  //电机使能
}
}

/********定时器初始化***********************************************************/

void T0_Init()
{
TMOD = 0x21;   //定时器0 1
SCON |= 0x50;
PCON |= 0x00;
TH0 = (65535-100)/256;  // 1ms
TL0 = (65535-100)%256;
TH1 = 0xf3;    // 12MHZ    2400波特率
TL1 = 0xf3;
EA = 1;
ET0 = 1;
TR1 = 1;
REN = 1;
}  
void Timer0_Init()    ////////
{
TMOD = 0x20;
SCON = 0x50;
PCON = 0x00;
TH1 = 0xf3;    // 12MHZ    2400波特率
TL0 = 0xf3;
TR1 = 1;
REN = 1;
}
unsigned char Recive()   // 串口接收程序
{
unsigned char  date;
while(RI == 0);
  RI = 0;
date = SBUF;
return date;
}
/********定时器中断*****************/
void T0_time() interrupt 1
{
TH0 = (65535-100)/256;   
TL0 = (65535-100)%256;
T0_NUM++;
if(T0_NUM >= MotorTab[g_MotorNum]) // 增加按键g_MotorNum++   减小按键g_MotorNum--
{
  T0_NUM = 0;
  CLK=CLK^0x01;        //   输出脉冲
  CLK_OUT_NUM++;  
  if(CLK_OUT_NUM >= SET_MotorPulse) // 达到角度目标
  {
   CLK_OUT_NUM = 0;       // 脉冲清空
   TR0 = 0;               // 关闭定时器
   END_FLAG = 1;          // 目标达到标志
  }
}
}  
/********延时函数***********************************************************/
void delayms(xms)
{
  unsigned int x,y;
  for(x=xms;x>0;x--)
   for(y=110;y>0;y--)
   ;
}


作者: lxa0    时间: 2017-11-29 22:31
很想帮你
可惜看不懂C语言
作者: 夜鹫    时间: 2019-12-26 10:35
楼主怎么解决的啊





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1