找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5621|回复: 1
收起左侧

51单片机步进电机代码(带详细的注释)

[复制链接]
ID:409662 发表于 2018-10-14 22:26 | 显示全部楼层 |阅读模式
#include <reg52.h>



sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;


#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电

unsigned char Speed;
bit Flag;
/*------------------------------------------------
uS延时函数,含有输入参数unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{

while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}
/*------------------------------------------------
                   主函数
------------------------------------------------*/
main()
{
unsigned int i=512;//旋转一周时间

EA=1;          //全局中断开
EX0=1;         //外部中断0开
IT0=1;         //1表示边沿触发

Speed=10;
while(1){
Coil_OFF
while((i--)&&Flag)  //正向
  {  Coil_A1      
     DelayMs(Speed);
     Coil_AB1               //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
     DelayMs(Speed);        //改变这个参数可以调整电机转速 ,
                            //数字越小,转速越大,力矩越小
         Coil_B1      
     DelayMs(Speed);
     Coil_BC1
     DelayMs(Speed);
         Coil_C1      
     DelayMs(Speed);
     Coil_CD1
     DelayMs(Speed);
         Coil_D1      
     DelayMs(Speed);
     Coil_DA1
     DelayMs(Speed);
  }
  Coil_OFF
  i=512;
  while((i--)&&(!Flag))//反向
  {  
     Coil_A1      
     DelayMs(Speed);
     Coil_DA1               //遇到Coil_AB1  用{A1=1;B1=1;C1=0;D1=0;}代替
     DelayMs(Speed);        //改变这个参数可以调整电机转速 ,
                            //数字越小,转速越大,力矩越小
         Coil_D1      
     DelayMs(Speed);
     Coil_CD1
     DelayMs(Speed);
         Coil_C1      
     DelayMs(Speed);
     Coil_BC1
     DelayMs(Speed);
         Coil_B1      
     DelayMs(Speed);
     Coil_AB1
     DelayMs(Speed);
  }
}
}

/*------------------------------------------------
                 外部中断程序
------------------------------------------------*/
void ISR_INT0(void) interrupt 0
{

if(!INT0)
   {
   DelayMs(10);//在此处可以添加去抖动程序,防止按键抖动造成错误
   if(!INT0)
   //while(!INT1);//等待按键释放
     {
     Flag=!Flag;   
     }
   }
}

先看步进电机控制电机转动原理,把时序搞清楚,单片机控制驱动按照时序置管脚就OK
1、本程序用于测试4相步进电机常规驱动
2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来
3、速度不可以调节的过快,不然就没有力矩转动了
4、按s4(设置成独立按键模式)可以控制正反转
------------------------------------------------*/

#include<reg52.h>

bitFlag;//定义正反转标志位

unsignedchar code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格
unsignedchar code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格
/******************************************************************/
/* 延时函数 */
/******************************************************************/
voidDelay(unsigned int i)//延时
{
while(--i);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{

unsignedchar i;

EX1=1;//外部中断0开
IT1=1;//边沿触发
EA=1;//全局中断开

while(!Flag)
{
P0=0x71;//显示 F 标示正转
for(i=0;i<4;i++)//4相
{
P1=F_Rotation[ i];//输出对应的相 可以自行换成反转表格
Delay(500);//改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
while(Flag)
{
P0=0x7C;//显示 b 标示反转
for(i=0;i<4;i++)//4相
{
P1=B_Rotation[ i];//输出对应的相
Delay(500);//改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
/******************************************************************/
/* 中断入口函数 */
/******************************************************************/
voidISR_Key(void) interrupt 2 using 1
{
Delay(300);

Flag=!Flag;//s3按下触发一次,标志位取反
}
根据电机相数买个驱动器。然后用单片机产生脉冲来控制电机的转动以及正反转。单片机产生脉冲的方法和单片机控制流水灯是一样的。
回复

使用道具 举报

ID:237239 发表于 2018-10-17 11:28 | 显示全部楼层
好资料,谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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