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

一、前言

本项目基于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.mzph.cn/news/131921.shtml

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

相关文章

跟着Nature Communications学作图:纹理柱状图+添加显著性标签!

&#x1f4cb;文章目录 复现图片设置工作路径和加载相关R包读取数据集数据可视化计算均值和标准差方差分析组间t-test 图a可视化过程图b可视化过程合并图ab 跟着「Nature Communications」学作图&#xff0c;今天主要通过复刻NC文章中的一张主图来巩固先前分享过的知识点&#…

Git同时配置Gitee和GitHub

Git同时配置Gitee和GitHub 一、删除原先ssh密钥二、生成密钥 这里的同时配置是针对于之前配置过单个gitee或者github而言的&#xff0c;如果需要看git从安装开始的配置&#xff0c;则可以看这一篇文章 git安装配置教程 一、删除原先ssh密钥 在C盘下用户/用户名/.ssh文件下找到…

ESP32S3入手体验测试

ESP32S3入手体验测试 &#x1f516;所入手的型号是YD-ESP32-S3 N16R8,该款和乐鑫官方推出的ESP32-S3-DevKitC-1配置差不多。 &#x1f388;乐鑫官方介绍&#xff1a;ESP32-S3-DevKitC-1 v1.1 &#x1f530;两者采用的模组&#xff1a;ESP32-S3-WROOM-1 和ESP32-S3-WROOM-1U模组…

“Java与Redis的默契舞曲:优雅地连接与存储数据“

文章目录 引言1. Java连接上Redis2. Java对Redis进行存储数据2.1 存储set类型数据2.2 存储hash类型数据2.3 存储list类型数据 总结 引言 在现代软件开发中&#xff0c;数据存储和处理是至关重要的一环。Java作为一门强大的编程语言&#xff0c;与Redis这个高性能的内存数据库相…

2023-11 | 短视频批量下载/爬取某个用户的所有视频 | Python

这里以鞠婧祎的个人主页为demo https://www.douyin.com/user/MS4wLjABAAAACV5Em110SiusElwKlIpUd-MRSi8rBYyg0NfpPrqZmykHY8wLPQ8O4pv3wPL6A-oz 【2023-11-4 23:02:52 星期六】可能后面随着XX的调整, 方法不再适用, 请注意 找到接口 找到https://www.douyin.com/aweme/v1/web/…

C++ map 的使用

下面的是关于 map 的介绍。来自 map - C Reference (cplusplus.com) 的翻译&#xff0c;您可以看也可以不看哈&#xff01; map 是关联容器&#xff0c;它按照特定的次序(按照 key 来比较)存储由键值 key 和值 value组合而成的元素。在 map 中&#xff0c;键值 key 通常用于排序…

P2824 [HEOI2016/TJOI2016] 排序

P2824 [HEOI2016/TJOI2016] 排序 [HEOI2016/TJOI2016] 排序 题目描述 在 2016 2016 2016 年&#xff0c;佳媛姐姐喜欢上了数字序列。因而她经常研究关于序列的一些奇奇怪怪的问题&#xff0c;现在她在研究一个难题&#xff0c;需要你来帮助她。 这个难题是这样子的&#x…

linux 创建git项目并提交到gitee(保姆式教程)

01、git安装与初始化设置 mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ apt install mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ git config --global user.name "用户名" mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ git config --global user.ema…

Python自定义函数练习(持续更新中~)

1.计算矩阵的面积和周长&#xff1a; class Rectangle:def __init__(self, width, height):self.width widthself.height heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width self.height)if __name__ "__main__"…

深入理解JS中的this

1、浅谈this 1.1、调用位置 在学习this的绑定过程之前&#xff0c;首先要理解调用位置&#xff0c;即函数在代码中被调用的位置&#xff0c;因此我们需要分析调用栈&#xff0c;看以下代码 function baz(){// 当前调用栈是baz// 因此调用位置就是全局作用域console。log(&qu…

财务RPA机器人如何使用

随着科技的不断发展&#xff0c;自动化技术在各个领域得到了广泛应用&#xff0c;在财务领域&#xff0c;RPA机器人已经成为一种新兴的技术手段&#xff0c;帮助众多企业实现了财务流程的自动化&#xff0c;大大提高了工作效率&#xff0c;降低人力成本。 本文将详细介绍财务RP…

AtCoder Beginner Contest 327 G. Many Good Tuple Problems(带标号二分图计数+有区别小球放入有区别盒子)

题目 一个长为n(n<30)的原始序列x&#xff0c;x[i]可以取值0或1 一个长为m(m<1e9)的点对序列(s,t)&#xff0c; s序列第i项和t的第i项&#xff0c;均可以取值[1,n]&#xff0c; 如果构造好s和t后&#xff0c;对任意都存在01序列x使得&#xff0c; 则称这个序列是合法…

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…

MySQL5.7小版本升级-In-Place方式

在 Centos7.9上升级二进制方式安装的MySQL 。升级方式有就地升级和逻辑升级2种方法&#xff0c;本实验演示In-Place Upgrade就地升级的方式将mysql-5.7.17升级至5.7.44 In-Place Upgrade就地升级Logical Upgrade逻辑升级 升级方式介绍 In-Place Upgrade就地升级 In-Place U…

perl列表创建、追加、删除

简介 perl 列表追加元素 主要是通过push和unshift函数来实现。其中&#xff0c;push是追加到列表尾&#xff0c;unshift是追加到列表头。 perl列表删除元素 主要是通过pop和shift函数来实现。其中&#xff0c;pop是从列表尾删除一个元素&#xff0c; shift是从列表头删除一…

6大场景,玩转ChatGPT!

文章目录 一、故事叙述提问举例 二、产品描述提问举例 三、报告撰写提问举例 四、邮件和信件撰写提问举例 五、新间稿和公告撰写提问举例 六、学术论文和专业文章撰写提问举例 本文是在GPT3.5版本下演示的 我们知道AI技术不仅能够自动生成文章和内容&#xff0c;还可以根据我们…

【大数据】NiFi 中的重要术语

NiFi 中的重要术语 1.Flow Controller2.Processor3.Connection4.Controller Service5.Process Group6.FlowFile 那些一个个黑匣子称为 Processor&#xff0c;它们通过称为 Connection 的队列交换名为 FlowFile 的信息块。最后&#xff0c;FlowFile Controller 负责管理这些组件…

软考高级系统架构设计师系列之:软考高级系统架构设计师论文专题

软考高级系统架构设计师系列之:软考高级系统架构设计师论文专题 一、论文相关内容二、论文专题大纲三、论文考试方式四、历年真题汇总分析五、论文常见问题六、论文评分标准七、搭建论文万能模版八、论文万能模版公式九、搭建论文万能模版—摘要十、搭建论文万能模版—背景十一…

XSAN数据恢复-存储空间架构迁移时误格式化存储系统的XSAN数据恢复案例

XSAN数据恢复环境&#xff1a; 昆腾存储&#xff0c;MAC OS操作系统&#xff0c;存放视频类数据&#xff08;MXF、MOV等格式文件&#xff09;。 XSAN故障&检测&#xff1a; 将存储空间从XSAN架构迁移到STORNEXT架构后&#xff0c;存储空间中数据全部丢失。 故障存储中一共…

Oracle常用运维SQL-SQL执行性能及锁表等查询分析

oracle相关系列文章: docker–在Anaconda jupyter 容器中使用oracle数据源时,Oracle客户端安装配置及使用示例 Oracle常用运维SQL–用户管理、数据导入、导出的实用脚本 Oracle TEMPORARY TABLE 临时表的使用及删除报ORA-14452错误的解决办法 Oracle常用运维SQL-SQL执行性能及…