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

devtools/2025/1/9 12:38:01/

直流电机没有正负之分,在两端加上直流电就能工作

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);  //脉冲频率
    }
}


http://www.ppmy.cn/devtools/148685.html

相关文章

Linux双端口服务器:端口1的文件系统目录挂载到端口2

目录 一、服务器安装NFS服务并配置二、文件挂载三、持久化挂载总结为什么服务器配置多个端口 目前有一台服务器&#xff0c;不过他设置了两个SSH的端口&#xff0c;通过下面方法可以让这两个端口连接的主机能够共享同一个文件系统&#xff0c;原本这两个端口的文件系统是隔离的…

ceph集群配置

4台机器 高度可扩展&#xff0c;分布式的存储文件系统&#xff0c;旨在提供高性能&#xff0c;高可靠性和高可用的对象存储&#xff0c;块存储&#xff0c;文件系统的存储。 使用分布式的算法保证数据的高可用和一致性。 ceph的架构&#xff1a; 1、ceph minitor MON&…

Solidity合约编写(一)

Solidity IDE地址&#xff1a;Remix - Ethereum IDE 点击进入后在contract文件夹下创建合约 合约代码如下&#xff1a; // SPDX-License-Identifier: MIT pragma solidity ^0.8.26;contract SimpleStorage{bool hasFavorNumtrue;uint256 favorNum5;string favorNums"fiv…

小程序组件 —— 27 组件案例 -推荐商品区域

这一节主要实现推荐商品区域功能&#xff0c;这里先分析一下&#xff0c;在微信小程序中如何实现底部的滚动&#xff1b; 在微信小程序中&#xff0c;如果想实现内容滚动&#xff0c;需要使用 scroll-view 组件&#xff0c;scrool-view 用于配置可滚动视图区域&#xff0c;适用…

PON架构(全光网络)

目前组网架构 世界上有一种最快的速度又是光&#xff0c;以前传统以太网络规划满足不了现在的需求。 有线网 无线网 全光网络方案 场景 全光网络分类 以太全光网络 PON&#xff08;Pas-sive-Optical Network 无源光网络&#xff09; 再典型的中大型高校网络中 推荐万兆入…

为什么 Netflix 部分功能放弃React,选择“原生”JavaScript?

在技术圈&#xff0c;Netflix可是妥妥的“顶流”&#xff0c;但你能想象吗&#xff1f;它竟然在2017年悄悄对自家网站动了个“大手术”&#xff1a;部分功能从React切换到了“原味”的Vanilla JavaScript。这不是彻底抛弃React&#xff0c;而是一次深思熟虑的战略选择&#xff…

Vue3实现PDF在线预览功能

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue3现PDF在线预览功能 前言 在开发中&#xff0c;PDF预览和交互功能是一个常见的需求。无论是管理…

Laravel中的app()->make是什么功能?

在Laravel框架中&#xff0c;app()->make&#xff08;或者写成 app(class_name) 这种形式&#xff0c;本质是一样的&#xff0c;后者是前者的一种便捷写法&#xff09;具有以下重要功能&#xff1a; ### 依赖注入容器实例化功能 - **依赖注入基础**&#xff1a;Laravel使用…