通过51单片机控制28byj48步进电机按角度正反转旋转
一、前言
本项目基于STC89C52单片机,通过控制28BYJ-48步进电机实现按角度正反转旋转的功能。28BYJ-48步进电机是一种常用的电机,精准定位和高扭矩输出,适用于许多小型的自动化系统和机械装置。
在这个项目中,使用STC89C52单片机作为控制器,这是一款强大而常用的8位单片机芯片,具有丰富的外设和强大的计算能力。通过编写适当的程序,可以通过单片机的IO口来控制步进电机的运动。
28BYJ-48步进电机是一种低成本、低功耗的步进电机,拥有精确的定位能力和较高的转矩输出。将使用单片机与步进电机之间的接口信号来驱动电机旋转,并通过控制电流脉冲的频率和顺序来控制电机前进或后退以及旋转的角度。
本项目的目标是实现根据用户输入的角度值,控制28BYJ-48步进电机按指定角度进行正反转旋转。通过灵活调整步进电机的控制信号,可以实现不同角度范围内的精确旋转。
在接下来的内容将介绍所需的硬件和软件资源,包括STC89C52单片机的基本特性、28BYJ-48步进电机的工作原理,以及编写控制程序的关键步骤。
二、设计流程
【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
函数用于控制步进电机的旋转方向和步数,其中 clockwise
和 counterclockwise
分别代表顺时针和逆时针方向。
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; // 停止电机
}
在以上代码中,增加了 cwBtn
和 ccwBtn
两个按键引脚,并定义为 P2^2
和 P2^3
。按下顺时针按钮时,将 clockwiseDirection
设置为 1,表示启动方向为顺时针;按下逆时针按钮时,将 clockwiseDirection
设置为 0,表示启动方向为逆时针。
相关文章:

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

二十三种设计模式全面解析-装饰器模式的高级应用:打造灵活可扩展的通知系统
在现代软件开发中,通知系统是一个广泛应用的功能,用于实时向用户发送各种类型的通知,如短信、微信、邮件以及系统通知。然而,通知系统的需求通常是多变且动态的,因此需要一种灵活可扩展的设计模式来满足不同类型的通知…...

使用脚本整合指定文件/文件夹,执行定制化 ESLint 命令
背景 最近面对一个庞大的项目,但是只需要修改某个模块,每次都手搓命令太麻烦了,于是就想着能不能写个脚本来辅助处理这些事情。 解决方案 定制化一键 ESLint,执行文件下载地址: https://github.com/mazeyqian/go-g…...

C++ static与类
C static与类 1. 不和对象直接相关的数据,声明为static2. static成员函数没有this指针3.在类的外部定义static成员变量4.static与类的一些小应用 1. 不和对象直接相关的数据,声明为static 想象有一个银行账户的类,每个人都可以开银行账户。存…...

数据结构之堆的实现(图解➕源代码)
一、堆的定义 首先明确堆是一种特殊的完全二叉树,分为大根堆和小根堆,接下来我们就分别介绍一下这两种不同的堆。 1.1 大根堆(简称:大堆) 在大堆里面:父节点的值 ≥ 孩子节点的值 我们的兄弟节点没有限制&…...

持续集成部署-k8s-配置与存储-配置管理:ConfigMap
持续集成部署-k8s-配置与存储-配置管理:ConfigMap 1. ConfigMap 简介2. 创建 ConfigMap3. ConfigMap 环境变量与配置文件加载3.1 环境变量的使用3.2 配置文件加载1. ConfigMap 简介 在Kubernetes (K8s) 中,ConfigMap是一种用于存储配置数据的API对象。它用于将应用程序的配置…...

【漏洞复现】Apache_HTTP_2.4.50_路径穿越漏洞(CVE-2021-42013)
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证方式一 curl方式二 bp抓捕 1.5、修复建议 说明内容漏洞编号CVE-2021-42013漏洞名称…...

【KVM】软件虚拟化和硬件虚拟化类型
前言 大家好,我是秋意零。 今天介绍的内容是虚拟化技术以及软件虚拟化和硬件虚拟化。 👿 简介 🏠 个人主页: 秋意零🔥 账号:全平台同名, 秋意零 账号创作者、 云社区 创建者🧑 个…...

ES-初识ES
文章目录 介绍ElasticSearchElasticSearch的主要功能ElasticSearch的主要特性ElasticSearch的家族成员LogStashKibanaBeats ELK(ElasticSearch LogStash Kibana)的应用场景与数据库集成指标采集/日志分析 安装和配置ElasticSearch一、安装1、下载ES安装…...

foreach、for in和for of的区别?
foreach,for...in和for...of是三种不同的循环结构,它们在JavaScript中用来遍历数组或对象的属性。它们有一些重要的区别,以及各自的优点和适用情况。 1.foreach:这是最普通的循环结构,它遍历数组或对象的每一个元素或属…...

CVE-2023-21839 weblogic rce漏洞复现
文章目录 一、漏洞影响版本二、漏洞验证三、启动反弹shell监听切换路径到jdk1.8 四、启动ldap服务五、使用CVE-2023-21839工具来进行攻击测试六、反弹shell 一、漏洞影响版本 CVE-2023-21839是Weblogic产品中的远程代码执行漏洞,由于Weblogic IIOP/T3协议存在缺陷&…...

MQTT java代码演示
以下是使用Eclipse Paho客户端库的Java代码示例,用于连接到MQTT代理并发布和订阅消息。 首先,需要添加Maven依赖项到项目中: <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId>…...

Windows环境下使用VLC获取到大疆无人机的RTMP直播推流
1.环境准备 1.安装nginx 1.7.11.3 Gryphon 下载地址:http://nginx-win.ecsds.eu/download/ 下载nginx 1.7.11.3 Gryphon.zip,解压后修改文件夹名称为nginx-1.7.11.3-Gryphon; 2.安装nginx-rtmp-module 下载地址:GitHub - arut…...

【SpringBoot笔记42】SpringBoot集成knife4j生成接口文档
这篇文章,主要介绍SpringBoot如何集成knife4j及生成接口文档。 目录 一、knife4j接口文档生成器 1.1、接口文档工具介绍 1.2、引入依赖...

Go类型嵌入介绍和使用类型嵌入模拟实现“继承”
Go类型嵌入介绍和使用类型嵌入模拟实现“继承” 文章目录 Go类型嵌入介绍和使用类型嵌入模拟实现“继承”一、独立的自定义类型二、继承三、类型嵌入3.1 什么是类型嵌入 四、接口类型的类型嵌入4.1 接口类型的类型嵌入介绍4.2 一个小案例 五、结构体类型的类型嵌入5.1 结构体类…...

【深度学习】pytorch——实现CIFAR-10数据集的分类
笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 往期文章: 【深度学习】pytorch——快速入门 CIFAR-10分类 CIFAR-10简介CIFAR-10数据集分类实现步骤一、数据加载及预处理实现数据加载及预处理归一化的理解访问数据集Dataset对象Dataloader对象 二、…...

Datawhale-AIGC实践
Datawhale-AIGC实践 部署ChatGLM3-6B平台 clone 项目,配置环境 git clone https://github.com/THUDM/ChatGLM3.git cd ChatGLM3 pip install -r requirement.txt修改web_demo.py, web_demo2.py 设置加载模型的路径修改启动代码: demo.queue().launch(shareFalse…...

C++对象模型
思考:对于实现平面一个点的参数化。C的class封装看起来比C的struct更加的复杂,是否意味着产生更多的开销呢? 实际上并没有,类的封装不会产生额外的开销,其实,C中在布局以及存取上的额外开销是virtual引起的…...

Linux Framebuffer驱动框架、接口实现和使用
Linux 驱动-Frame Buffer代码分析 Framebufferfbmem.c部分代码分析初始化 Framebuffer 对于驱动开发人员来说,其实只需要针对具体的硬件平台SOC和具体的LCD(通过焊接连接到该SOC引脚上的LCD)来进行第一部分的寄存器编程(红色部分&…...

AI:54-基于深度学习的树木种类识别
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

MVCC详解
什么是MVCC? MVCC,即Multi-Version Concurrency Control (多版本并发控制)。它是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 通俗的讲&am…...
[pytorch]手动构建一个神经网络并且训练
0.写在前面 上一篇博客全都是说明类型的,实际代码能不能跑起来两说,谨慎观看.本文中直接使用fashions数据实现softmax的简单训练并且完成结果输出.实现一个预测并且观测到输出结果. 并且更重要的是,在这里对一些训练的过程,数据的形式,以及我们在softmax中主要做什么以及怎么…...

马斯克的X.AI平台即将发布的大模型Grōk AI有哪些能力?新消息泄露该模型支持2.5万个字符上下文!
本文原文来自DataLearnerAI官方网站: 马斯克的X.AI平台即将发布的大模型Grōk AI有哪些能力?新消息泄露该模型支持2.5万个字符上下文! | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051699114783001 马斯克透露xAI…...

spring-session-core排除某些接口不设置session
这里写自定义目录标题 需求实现 需求 今天先写一下如何实现,之后再更新一篇如何发现这个问题的。 我们的项目使用了spring-session-core来存储共享session,存在redis中,然后在cookie中是设置了key为SESSION的session。但是我们有一些开放接口…...

【ElasticSearch系列-05】SpringBoot整合elasticSearch
ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…...

C/S架构学习之广播
广播:一台主机可以将一个数据包同时发送给同一局域网内所有主机;在IPV4中,广播地址是本网段最大的IP地址或者“255.255.255.255”;注意:广播本质上是UDP通信技术;只有用户数据报套接字才能使用广播的方式&a…...

帧间快速算法论文阅读
Low complexity inter coding scheme for Versatile Video Coding (VVC) 通过分析相邻CU的编码区域,预测当前CU的编码区域,以终止不必要的分割模式。 𝐶𝑈1、𝐶𝑈2、𝐶𝑈3、&#x…...

mooc单元测验第一单元
TCP和OSI参考模型对比 OSI参考模型与TCP/IP参考模型(计算机网络)_osi模型 tcpip模型_李桥桉的博客-CSDN博客 会话层和物理层...

AOC显示器出问题了?别担心,简单重置一下就OK了
你的AOC显示器有问题吗?它是被卡在特定的屏幕上还是根本不显示任何图像?如果你的显示器出现任何问题,只需简单重置即可解决问题。 重置AOC显示器可以帮助解决一系列问题,例如颜色或显示设置问题、输入源检测问题以及其他与软件相…...

ok-解决qt5发布版本,直接运行exe缺少各种库的问题
已实验第二种方法可用。 工具:电脑必备、QT下的windeployqt Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法…...