通过51单片机控制28byj48步进电机按角度正反转旋转

news2025/1/19 8:17:26

一、前言

本项目基于STC89C52单片机,通过控制28BYJ-48步进电机实现按角度正反转旋转的功能。28BYJ-48步进电机是一种常用的电机,精准定位和高扭矩输出,适用于许多小型的自动化系统和机械装置。

在这个项目中,使用STC89C52单片机作为控制器,这是一款强大而常用的8位单片机芯片,具有丰富的外设和强大的计算能力。通过编写适当的程序,可以通过单片机的IO口来控制步进电机的运动。

28BYJ-48步进电机是一种低成本、低功耗的步进电机,拥有精确的定位能力和较高的转矩输出。将使用单片机与步进电机之间的接口信号来驱动电机旋转,并通过控制电流脉冲的频率和顺序来控制电机前进或后退以及旋转的角度。

本项目的目标是实现根据用户输入的角度值,控制28BYJ-48步进电机按指定角度进行正反转旋转。通过灵活调整步进电机的控制信号,可以实现不同角度范围内的精确旋转。

在接下来的内容将介绍所需的硬件和软件资源,包括STC89C52单片机的基本特性、28BYJ-48步进电机的工作原理,以及编写控制程序的关键步骤。

image-20230810162015524

image-20230810161811275

image-20230810161914757

二、设计流程

【1】硬件准备:

  • 51单片机开发板:选择STC89C52单片机开发板。
  • 28BYJ-48步进电机:一个28BYJ-48步进电机+ULN2003驱动板。
  • 驱动电路:使用ULN2003芯片来驱动步进电机。
  • 连接线和电源:准备连接线和电源供电。

【2】连接电路:

  • 将51单片机与驱动电路和步进电机连接起来。

【3】编写程序:

  • 使用keil集成开发环境(IDE)编写51单片机的控制程序。
  • 初始化引脚和端口设置,配置控制步进电机所需的引脚。
  • 编写函数来控制步进电机的正反转旋转。
  • 编写函数来控制步进电机按照指定的角度进行旋转。

【4】控制步进电机旋转:

  • 在主程序中,调用适当的函数来控制步进电机的旋转。
  • 使用按键输入设备来触发步进电机的旋转。
  • 控制旋转的角度、速度和方向。

【5】调试和测试:

  • 通过编译程序,并将生成的可执行文件下载到51单片机开发板中。

三、代码实现

3.1 电机正反转控制

下面是通过STC89C52单片机控制28BYJ-48步进电机实现正转和反转的实现代码:

#include <reg52.h>
#include <intrins.h>

#define motorPort P1    // 步进电机的控制引脚连接到P1口
#define clockwise 0     // 顺时针方向
#define counterclockwise 1  // 逆时针方向

// 函数声明
void delay(unsigned int time);
void motorRotate(unsigned char direction, unsigned int steps);

void main()
{
    while (1)
    {
        // 正转,执行一定的步数 (这里为512步,可根据需要修改)
        motorRotate(clockwise, 512);
        delay(1000);  // 延时1秒

        // 反转,执行一定的步数
        motorRotate(counterclockwise, 256);
        delay(1000);  // 延时1秒
    }
}

// 延时函数
void delay(unsigned int time)
{
    unsigned int i, j;
    for (i = time; i > 0; i--)
    {
        for (j = 110; j > 0; j--);  // 指令周期延时
    }
}

// 控制步进电机旋转
void motorRotate(unsigned char direction, unsigned int steps)
{
    unsigned int i;
    unsigned char motorSequence[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};  // 步进电机的控制序列

    for (i = 0; i < steps; i++)
    {
        if (direction == clockwise)
        {
            motorPort = motorSequence[i % 8];
        }
        else if (direction == counterclockwise)
        {
            motorPort = motorSequence[7 - (i % 8)];
        }

        delay(2);  // 每步之间的延时,可根据需要调整
    }

    motorPort = 0x00;  // 停止电机
}

代码里使用 STC89C52 单片机的 P1 口连接到28BYJ-48步进电机的控制引脚。在 main 函数中,通过循环实现了正转和反转的功能。motorRotate 函数用于控制步进电机的旋转方向和步数,其中 clockwisecounterclockwise 分别代表顺时针和逆时针方向。

3.2 角度旋转

下面代码使用STC89C52单片机控制28BYJ-48步进电机按指定的角度进行正转和反转,封装子函数进行调用。

#include <reg52.h>

// 定义28BYJ-48步进电机的相序
unsigned char stepSequence[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};

// 定义步进电机当前位置和角度
unsigned char currentPosition = 0;
unsigned int currentAngle = 0;

// 延时函数
void delay(unsigned int time) {
    unsigned int i, j;
    for (i = 0; i < time; i++) {
        for (j = 0; j < 120; j++);
    }
}

// 步进电机正转函数
void stepForward(unsigned int angle) {
    unsigned int steps = angle / 5;  // 每步转动角度为5度
    unsigned int i;
    
    for (i = 0; i < steps; i++) {
        currentPosition++;
        if (currentPosition >= 8) {
            currentPosition = 0;
        }
        
        P1 = stepSequence[currentPosition];
        delay(10);  // 控制步进电机转速,可调整延时时间
    }
    
    currentAngle += angle;
}

// 步进电机反转函数
void stepBackward(unsigned int angle) {
    unsigned int steps = angle / 5;  // 每步转动角度为5度
    unsigned int i;
    
    for (i = 0; i < steps; i++) {
        if (currentPosition == 0) {
            currentPosition = 8;
        }
        
        currentPosition--;
        
        P1 = stepSequence[currentPosition];
        delay(10);  // 控制步进电机转速,可调整延时时间
    }
    
    currentAngle -= angle;
}

// 主函数
void main() {
    while (1) {
        // 正转180度
        stepForward(180);
        delay(1000);  // 停顿1秒钟
        
        // 反转90度
        stepBackward(90);
        delay(1000);  // 停顿1秒钟
    }
}

代码使用STC89C52单片机的P1口作为输出口,通过控制P1口输出的电平来控制步进电机的旋转。步进电机的相序存储在stepSequence数组中,每个元素对应一个相位。stepForward函数用于实现步进电机的正转,stepBackward函数用于实现步进电机的反转。delay函数用于控制步进电机的转速,可以根据需要调整延时时间。

在主函数中,演示了步进电机的正转180度和反转90度的操作。

3.3 按键控制电机

有2个按键,接在P2口3上面的,按下是低电平。下面代码加入2个按键,实现了2个按键的功能。

#include <reg52.h>

#define motorPort P1    // 步进电机的控制引脚连接到P1口
#define clockwise 0     // 顺时针方向
#define counterclockwise 1  // 逆时针方向

sbit startBtn = P2^0;   // 启动按钮连接到P2.0口
sbit stopBtn = P2^1;    // 停止按钮连接到P2.1口
sbit cwBtn = P2^2;      // 顺时针按钮连接到P2.2口
sbit ccwBtn = P2^3;     // 逆时针按钮连接到P2.3口

unsigned char motorSequence[8] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x09};  // 步进电机的控制序列
bit motorRunning = 0;  // 步进电机是否正在运行
unsigned int targetAngle = 0;  // 目标转动角度,初始为0
bit clockwiseDirection = 1; // 电机默认启动方向为顺时针

// 函数声明
void delay(unsigned int time);
void motorRotate(unsigned char direction, unsigned int steps);

void main()
{
    while (1)
    {
        if (startBtn == 0)  // 如果按下了启动按钮
        {
            while (startBtn == 0);  // 等待按钮释放

            if (!motorRunning)
            {
                motorRunning = 1;
                motorRotate(clockwiseDirection, targetAngle);  // 启动电机
            }
        }

        if (stopBtn == 0)  // 如果按下了停止按钮
        {
            while (stopBtn == 0);  // 等待按钮释放

            if (motorRunning)
            {
                motorRunning = 0;
                motorPort = 0x00;  // 停止电机
            }
        }

        if (cwBtn == 0)  // 如果按下了顺时针按钮
        {
            while (cwBtn == 0);  // 等待按钮释放
            clockwiseDirection = 1;  // 设置电机启动方向为顺时针
        }

        if (ccwBtn == 0)  // 如果按下了逆时针按钮
        {
            while (ccwBtn == 0);  // 等待按钮释放
            clockwiseDirection = 0;  // 设置电机启动方向为逆时针
        }
    }
}

// 延时函数
void delay(unsigned int time)
{
    unsigned int i, j;
    for (i = time; i > 0; i--)
    {
        for (j = 110; j > 0; j--);  // 指令周期延时
    }
}

// 控制步进电机旋转
void motorRotate(unsigned char direction, unsigned int steps)
{
    unsigned int i;

    for (i = 0; i < steps; i++)
    {
        if (!motorRunning)
            break;

        if (direction == clockwise)
        {
            motorPort = motorSequence[i % 8];
        }
        else if (direction == counterclockwise)
        {
            motorPort = motorSequence[7 - (i % 8)];
        }

        delay(2);  // 每步之间的延时,可根据需要调整
    }

    motorPort = 0x00;  // 停止电机
}

在以上代码中,增加了 cwBtnccwBtn 两个按键引脚,并定义为 P2^2P2^3。按下顺时针按钮时,将 clockwiseDirection 设置为 1,表示启动方向为顺时针;按下逆时针按钮时,将 clockwiseDirection 设置为 0,表示启动方向为逆时针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IP地址证书申请注意事项

IP地址证书申请跟常见的域名证书有所区别&#xff0c;首先确保80端口或者443端口处于开放状态&#xff0c;让CA机构在验签过程中能够正确访问到验证值&#xff0c;其实IP地址证书只能采用服务器文件验证&#xff0c;即把CA机构生成的服务器文件TXT文本上传到服务器根目录&#…

VueJs各个版本— 判断当前是开发、生产环境

VueJs各个版本— 判断当前是开发、生产环境 文章目录 VueJs各个版本— 判断当前是开发、生产环境vue项目分类VueCLI21&#xff0c;判断样例2&#xff0c;判断原理 Vue CLI 3 和 Vue CLI 41&#xff0c;判断样例2, 判断原理手动设置-json文件手动设置- .env 文件单个 .env 文件多…

python 数据挖掘库orange3 介绍

orange3 是一个非常适合初学者的data mining library. 它让使用者通过拖拽内置的组件来形成工作流。让你不需要写任何代码就可以体验到数据挖掘和可视化的魅力。 它的桌面如下&#xff0c;这里我创建了 3 个节点&#xff0c;分别是数据集、小提琴图&#xff0c;散点图 其中 …

数据结构与算法:使用数组模拟队列Java版

逻辑分析 代码实现 package com.haimeng.queue;import java.util.Scanner;public class ArrayQueueDemo {public static void main(String[] args) {//测试一把//创建一个队列ArrayQueue queue new ArrayQueue(3);char key ; //接收用户输入Scanner scanner new Scanner(S…

使用 Appilot 部署 Llama2,会聊天就行!

Walrus 是一款基于平台工程理念的应用管理平台&#xff0c;致力于解决应用交付领域的深切痛点。借助 Walrus 将云原生的能力和最佳实践扩展到非容器化环境&#xff0c;并支持任意应用形态统一编排部署&#xff0c;降低使用基础设施的复杂度&#xff0c;为研发和运维团队提供易用…

最常见的激活函数

文章目录 1. 激活函数2. Sigmoid函数3. RelU函数4. Softmax函数 1. 激活函数 1. 神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值&#xff0c;并将输入值传递给下一层&#xff0c;输入层神经元节点会将输入属性值直接传递给下一层&#xff08;隐层或输…

软件开发项目文档系列之九如何撰写测试用例

目录 1 概述1.1 编写目的1.2 定义1.3 使用范围1.4 参考资料1.5 术语定义 2 测试用例2.1 功能测试2.1.1 用户登录功能2.1.2 商品搜索功能 2.2 性能测试2.2.1 网站响应时间2.2.2 并发用户测试 附件&#xff1a; 测试用例撰写的要素和注意事项附件1 测试用例要素附件2 测试用例的注…

全志XR806实现简单的家用环境监测传感器

XR806是一款支持WiFi和BLE的高集成度无线MCU芯片, 以其集成度高、硬件设计简单、BOM成本低、安全可靠等优点, 成为极客们进行小开发创作的首选. 恰好最近获得了XR806开发板的试用资格,因此决定基于此开发板制作一个简单的家用环境监测传感器. 1.功能介绍 作为一个环境监测传感…

在一个循环链队中只有尾指针(记为rear,结点结构为数据域data,指针域next),请给出这种队列的入队和出队操作实现过程

在一个循环链队中只有尾指针&#xff08;记为rear&#xff0c;结点结构为数据域data&#xff0c;指针域next&#xff09;&#xff0c;请给出这种队列的入队和出队操作实现过程 入队过程如下图&#xff1a; 先创一个结点&#xff0c;用于存储要插入的结点数据 然后就是老套路了…

开槌在即:陈可之油画|《我的星辰》

《我的星辰》 尺寸&#xff1a;46x46cm 陈可之2020年绘 “星辰大海&#xff0c;梦想自有梦想的力量&#xff0c;仰望在银河的想象&#xff0c;我们启航。”读着画名&#xff0c;凝视着画&#xff0c;脑海里回荡着《星辰大海》的旋律。油画《我的星辰》是陈可之先生“心宇宙”系…

React 项目结构小结

React 项目结构小结 简单的记录一下目前 React 项目用的依赖和实现 摸索了大半年了大概构建一套用起来还算轻松的体系……&#xff1f;基本上应该是说可以应对大部分的项目了 使用的依赖 目前项目还在 refactoring 的阶段&#xff0c;所以乱得很&#xff0c;这里是新建一个…

如何理解API?API 是如何工作的呢?

大家可能最近经常听到 API 这个概念&#xff0c;那什么是API&#xff0c;它又有什么特点和好处呢&#xff1f; wiki 百科镇楼 APIs are] a set of subroutine definitions, protocols, and tools for building application software. In general terms, it’s a set of clear…

ZKP10.2 Efficient Recursion via Statement Folding (Nova)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 10: Recursive SNARKs, Aggregation and Accumulation (Dan Boneh) 10.3 Efficient Recursion via Statement Folding: Nova, Supernova, and generalizations The difficulty with full recursion Prover P needs to build a…

严重的软件漏洞,你都知道和修复了吗?

有一些漏洞,影响深远而且影响重大。以下的严重软件漏洞,你都知道和修复了吗? 1. Log4Shell Log4Shell软件漏洞存在于Apache Log4j中,这种流行的Java日志框架被全球数千万人使用。 2021年11月,阿里云安全团队成员陈兆军发现了一个严重的代码漏洞。陈兆军最先注意到了Mi…

怎样提取视频提取的人声或伴奏?

有些小伙伴们进行音视频创作时&#xff0c;可能会需要提取音频的人声或者是伴奏。这里给大家推荐一个音分轨人声分离软件&#xff0c;支持一键提取音频人声和一键提取伴奏功能&#xff0c;可批量导入文件同步提取&#xff0c;简单高效&#xff0c;是音视频创作者的不二选择&…

分体式离子风刀和整体式离子风刀分别有哪些优缺点

离子风刀是一种利用高速旋转的离子风扇产生的离子风来清洁和干燥物体表面的设备。根据离子风扇的安装方式&#xff0c;离子风刀可以分为分体式离子风刀和整体式离子风刀。下面是它们各自的优缺点&#xff1a; 分体式离子风刀的优点&#xff1a; 安装方便&#xff1a;分体式离子…

首发scitb包,一个为制作统计表格而生的R包

目前&#xff0c;本人写的第3个R包scitb包已经正式在R语言官方CRAN上线&#xff0c;scitb包是一个为生成专业化统计表格而生的R包。 可以使用以下代码安装 install.packages("scitb")scitb包对我而言是个很重要的R包&#xff0c;我的很多想法需要靠它做平台来实现&a…

bean product not found within scope之解决方法

错误原因&#xff1a; 获取bean中的商品信息时报错 解决方法&#xff1a; 修改为下面代码即可&#xff1a; <jsp:useBean id"product" class"com.model.Product" scope"session"></jsp:useBean>

TP858 3BSE018138R1 具有高性能CPU的工业PC技术

TP858 3BSE018138R1 具有高性能CPU的工业PC技术 为了充分利用新电脑的扩展图形功能&#xff0c;如DirectX&#xff0c;Beckhoff Automation重新设计了TwinCAT automation软件套件中的Scope工具。这为TwinCAT用户在灵活的软件环境中提供了一系列令人印象深刻的测量技术。改进的…

泊车功能专题介绍 ————智能泊车辅助系统性能要求及试验方法(GB/T 41630-2022)

文章目录 术语系统状态转换及信息提示系统非激活状态停车位搜索状态泊车辅助状态系统退出条件系统故障响应 性能要求避撞要求挡位调整次数要求平行停车位&#xff08;空间车位&#xff09;结束位置垂直停车位&#xff08;空间车位&#xff09;结束位置平行停车位&#xff08;线…