魏晓东 发表于 2025-1-7 13:52:07

51单片机——步进电机模块

直流电机没有正负之分,在两端加上直流电就能工作
https://i-blog.csdnimg.cn/direct/2b7e3fe00a1c4421aec06a95b6a74cd4.png
P1.0-P1.3都可以控制电机,例如:利用P1.0,则必要把线接在J47的1(VCC)和2(OUT1)上
1、直流电机实行 

要实现的功能是:直流电机工作约5s后停止 
   #include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
//输入1表示10us
void delay(u16 time){
    while(time--);
}
//毫秒的延时函数,输入1表示1毫秒
void delay_ms(u16 ms){
    u16 i=0,j=0;
    for(i=ms;i>0;i--){
        for(j=110;j>0;j--);
    }
}
//P1.0口控制电机(P1.0-P1.3都可以控制电机)
sbit DC_MOTOR=P1^0;
//界说一个时间,5s
//不分正负极
void main(){
    DC_MOTOR=1;
    delay_ms(5000);
    DC_MOTOR=0;
    while(1){
        
    }
}
2、步进电机实行

要实现的功能是:通过ULN2003驱动模块控制28BYJ48步进电机运行方向及速度,当按下KEY1键可调节电机旋转方向;当按下KEY2键,电机加速;当按下KEY3键,电机减速 
   #include "reg51.h"
typedef unsigned int u16;
typedef unsigned char u8;
void delay_10us(u16 us){
    while(us--);
}
//界说延时函数,ms=1时,大约延时1ms
void delay_ms(u16 ms){
    u16 i=0,j=0;
    for(i=ms;i>0;i--){
        for(j=110;j>0;j--);
    }
}
//界说控制步进电机的管脚
//8个节拍控制:A->AB->B->BC->C->CD->D->DA
sbit IN1_A=P1^0;  //橙线
sbit IN2_B=P1^1;  //黄线
sbit IN3_C=P1^2;  //粉线
sbit IN4_D=P1^3;  //蓝线
//独立按键
//利用宏界说的方法界说独立按键的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0
//界说按键对应的管脚口
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
//封装一个函数,按键返回一个键值
u8 key_scan(u16 mode){  //mode:模式,有0和1操作,假如操作0,单次扫描;假如操作1,连续扫描
    //打一个标志
    static u16 key=1;
    if(mode==1){
        key=1;
    }
    if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)){
        //消抖处理,必要延时5ms-10ms
        delay_10us(1000);
        key=0;
        //假如还是按下,信号稳定
        if(KEY1==0){
            return KEY1_PRESS;
        }else if(KEY2==0){
            return KEY2_PRESS;
        }else if(KEY3==0){
            return KEY3_PRESS;
        }else if(KEY4==0){
            return KEY4_PRESS;
        }
    }else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1){
        key=1;
        return KEY_UNPRESS;
    }
}
//步进电机 step(拍数):0-7;dir(电机方向):0(逆时针),1(顺时针)
void step_motor_28BYJ48C_send_pulse(u8 step,u8 dir){
    u8 temp=step;
    if(dir==1){
        temp=7-step;
    }
    switch(temp){
        case 0:
            IN1_A=1,IN2_B=0,IN3_C=0,IN4_D=0;
            break;
        case 1:
            IN1_A=1,IN2_B=1,IN3_C=0,IN4_D=0;
            break;
        case 2:
            IN1_A=0,IN2_B=1,IN3_C=0,IN4_D=0;
            break;
        case 3:
            IN1_A=0,IN2_B=1,IN3_C=1,IN4_D=0;
            break;
        case 4:
            IN1_A=0,IN2_B=0,IN3_C=1,IN4_D=0;
            break;
        case 5:
            IN1_A=0,IN2_B=0,IN3_C=1,IN4_D=1;
            break;
        case 6:
            IN1_A=0,IN2_B=0,IN3_C=0,IN4_D=1;
            break;
        case 7:
            IN1_A=1,IN2_B=0,IN3_C=0,IN4_D=1;
            break;
    }
}
//界说转速1-5区间(最小不能小于1),步进电机的速度的值越小,速度越快;值越大,速度越慢
#define STEPMOTOR_MAXSPEED 1  //可以改
#define STEPMOTOR_MINSPEED 5
void main(){
    u8 key=0;  //按键的返回值
    u8 dir=0;  //默认逆时针
    u8 step=0;  //拍数
    u8 speed=STEPMOTOR_MAXSPEED;  //默认最大转速
    while(1){
        key=key_scan(0);
        if(key==KEY1_PRESS){
            //换方向
            dir=!dir;   
      }else if(key==KEY2_PRESS){
            //加速
            if(speed>STEPMOTOR_MAXSPEED){
                speed-=1;
            }
        }else if(key==KEY3_PRESS){
            //减速
            if(speed<STEPMOTOR_MINSPEED){
                speed+=1;
            }
        }
        //电机工作
        step_motor_28BYJ48C_send_pulse(step++,dir);
        if(step==8){
            step=0;
        }
        delay_ms(speed);  //脉冲频率
    }
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 51单片机——步进电机模块