找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3500|回复: 2
打印 上一主题 下一主题
收起左侧

89c51控制42步进电机转动一定角度,转动角度不对,求指教!!!

[复制链接]
回帖奖励 10 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:255195 发表于 2017-11-29 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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--)
   ;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:74784 发表于 2017-11-29 22:31 | 只看该作者
很想帮你
可惜看不懂C语言
回复

使用道具 举报

板凳
ID:661664 发表于 2019-12-26 10:35 | 只看该作者
楼主怎么解决的啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表