基于51单片机控制步进电机正反转

基于51单片机控制步进电机正反转

此次采用uln2003模块来链接步进电机;
## 步进电机工作原理
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。
步进电动机的结构形式和分类方法较多,一般按励磁方式分为磁阻式、永磁式和混磁式三种;按相数可分为单相、两相、三相和多相等形式。

因此我们可以控制单片机I/O口的电平来控制步进电机,此次设计中采用四相单拍工作方式,在这种工作方式下,A、B、C、D 三相轮流通电,电流切换三次,磁场旋转一周,转子向前转过一个齿距角。因此这种通电方式叫做四相单四拍工作方式。

  1. 电机正转代码 unsigned char code tableZ[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
  2. 电机反转代码 unsigned char code tableF[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};

代码如下

#include <reg52.h>
#define uint unsigned int 
#define uchar unsigned char
unsigned char code tableZ[8]={
    
    0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
unsigned char code tableF[8]={
    
    0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//²½½øµç»úzheng
void delay(unsigned int t);
sbit S3=P3^4; //反转
sbit S4=P3^5; //反停
sbit S5=P3^6; // 正停
//正转写入数据
void  motor_z()
 {
    
     
   unsigned char i,j;
  
      for (i=0; i<8; i++)  
        {
    
    
     if(S5==0){
    
    break;}
     for(j=0;j<8;j++){
    
    
      P1 = tableZ[i]&0x1f;    
          delay(50);
     }
                       
        }
 }
//反转写入数据
void motor_f(){
    
    
 unsigned char i,j;
       for (i=0; i<8; i++)  
        {
    
    
     if(S4==0){
    
    break;}
     for(j=0;j<8;j++){
    
    
      P1 = tableF[i]&0x1f;   
          delay(50);
     }
                    
        }
}
void delay(unsigned int t)//延时函数
{
    
                               
   unsigned int k;
   while(t--)
   {
    
    
     for(k=0; k<60; k++)
     {
    
     }
   }
}

void main()
{
    
    
while(1){
    
    
motor_z();
if(S3 == 0){
    
    
motor_f();
}
}
}

protel仿真图如下

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Lucifer_min/article/details/109248939