基于51单片机的步进电机调速系统设计
基于51单片机的步进电机调速系统
(仿真+程序+原理图+设计报告)
功能介绍
具体功能:
1.按键可以控制电机正、反转,加、减速,停止;
2.一位7段数码管实时显示档位(共9档);
3.两个LED分别来表示正转、反转;
4.四个LED流水闪烁来表示电机转速;
演示视频:
基于51单片机的步进电机调速系统设计
#include "reg52.h"
/*
按键控制步进电机:正转、反转、加1档、减1档、停止
数码管显示步进电机档位,总共有9档
LED灯显示正转、反转、转速
*//*宏定义*/
#define SpeedShow P0 //数码管显示接口
#define MotorDriver P2 //步进电机驱动接口typedef unsigned char uchar; // 8位有符号整数
typedef unsigned int uint; //16位有符号整数
typedef unsigned long ulong; //32位有符号整数#define KEY_TIME_SHORT 20 //短按的按键去抖动延时的时间
//---加入全局变量--//
extern uchar KeyCode;
extern uint KeyTimeCnt[5]; //按键去抖动延时计数器,分别对应KEY1/2/3/4/5
extern uchar KeyLock[5]; //按键触发后自锁的变量标志,分别对应KEY1/2/3/4/5//-----------------------------------------------------------------
// 相关函数声明
//-----------------------------------------------------------------
void KeyScan(); //按键扫描函数 放在定时中断里
void Delay10ms(); //延时函数//0~9 的共阳数码管段码,最后一个是黑屏
const uchar SEG_CODE[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};//输出励磁序列的频率参数{TH1,TL1}
const uchar Timer[9][2]={{0xDE,0xE4},{0xE1,0xEC},{0xE5,0xD4},{0xE9,0xBC}, //8.476 ~ 1ms{0xEd,0xA4},{0xF1,0x8C},{0xF5,0x74},{0xF9,0x5C},{0xFC,0x18}};//步进电机正转的励磁序列
const uchar FFW[] = {0x1F,0x3F,0x2F,0x6F,0x4F,0xCF,0x8F,0x9F}; //DCBAXXXX//步进电机反转的励磁序列
const uchar REV[] = {0x9F,0x8F,0xCF,0x4F,0x6F,0x2F,0x3F,0x1F}; //DCBAXXXX//枚举变量--正反转标志
typedef enum{FwdRun, RevRun} RunFlag;
RunFlag flag1 = FwdRun;uchar speed = 0;uchar KeyCode = 0; //按键编码值//共5个独立机械按键,通过短按实现5种按键编码值
uint KeyTimeCnt[5] = {0,0,0,0,0}; //按键去抖动延时计数器,分别对应KEY1/2/3/4/5
uchar KeyLock[5] = {0,0,0,0,0}; //按键触发后自锁的变量标志,分别对应KEY1/2/3/4/5/* IO引脚分配*/
sbit KEY1 = P1^2; //按键1
sbit KEY2 = P1^3; //按键2
sbit KEY3 = P1^4; //按键3
sbit KEY4 = P3^5; //按键4
sbit KEY5 = P3^6; //按键5sbit FWD_LED = P1^0; //正转指示灯
sbit REV_LED = P1^1; //反转指示灯//函数声明
void T0_Init(); //定时器0初始化函数声明
void T1_Init(); //定时器1初始化函数声明
void KeyService(); //按键服务函数声明
void delay_ms(uint t); //毫秒延时函数声明//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{ T0_Init(); //定时器0初始化T1_Init(); //定时器1初始化FWD_LED = 0; //正转指示灯亮,默认初始化是正转delay_ms(500); //延时500ms,待各个模块上电稳定EA = 1; //开启中断while(1){ KeyService(); //按键服务程序}
} //-----------------------------------------------------------------
// Timer0 初始化,模式1,允许中断,1ms定时
// Timer0 用于按键扫描
//-----------------------------------------------------------------
void T0_Init()
{TMOD &= 0xF0;TMOD |= 0x01; //T0工作于模式1,16位定时器TH0 = (65536 - 1000) >> 8; //1ms定时TL0 = (65536 - 1000) & 0xFF;ET0 = 1; //允许T0中断TR0 = 1; //启动T0
}//-----------------------------------------------------------------
// Timer1 初始化,模式1,允许中断
// Timer1 用于改变步进电机转速
//-----------------------------------------------------------------
void T1_Init()
{TMOD &= 0x0F;TMOD |= 0x10; //定时器1工作于模式1,16位定时器TH1 = Timer[speed][0];TL1 = Timer[speed][1]; //定时器1,定时用于步进电机转速控制ET1 = 1; //允许T1中断PT1 = 1; //定时器1优先级高TR1 = 0; //关闭定时器1
}//-----------------------------------------------------------------
// Timer0 中断服务程序
//-----------------------------------------------------------------
void InterruptTime0() interrupt 1
{TH0 = (65536 - 1000) >> 8; //1msTL0 = (65536 - 1000) & 0xFF;KeyScan(); //按键扫描
}//-----------------------------------------------------------------
// Timer1 中断服务程序
//-----------------------------------------------------------------
void InterruptTime1() interrupt 3
{static step1 = 0; static step2 = 0;TH1 = Timer[speed - 1][0]; //根据不同的转速档位,给定时器1赋定时器值TL1 = Timer[speed - 1][1]; //按照定时器1的频率循环发送正转励磁序列的脉冲给步进电机,使其不停地转动if(flag1 == FwdRun)//正转{MotorDriver = FFW[step1++]; if(step1 == 8) step1 = 0; }//按照定时器1的频率循环发送反转励磁序列的脉冲给步进电机,使其不停地转动else if(flag1 == RevRun) {MotorDriver = REV[step2++];if(step2 == 8) step2 = 0; }
}//-----------------------------------------------------------------
// 按键服务程序
//-----------------------------------------------------------------
void KeyService()
{switch (KeyCode){case 1: flag1 = FwdRun; //正转FWD_LED = 0; REV_LED = 1; //正转指示灯亮KeyCode = 0;break; case 2: flag1 = RevRun; //反转FWD_LED = 1; REV_LED = 0; //反转指示灯亮KeyCode = 0;break;case 3: speed++; //速度加if(speed == 10) speed = 1; SpeedShow = SEG_CODE[speed];if(TR1 == 0) TR1 = 1;KeyCode = 0;break;case 4: speed--; //速度减if(speed == 0 || speed == -1 ) speed = 9;SpeedShow = SEG_CODE[speed]; if(TR1 == 0) TR1 = 1; KeyCode = 0;break;case 5: TR1 = 0; //停止SpeedShow = 0xFF;MotorDriver = 0x00;KeyCode = 0;break; default: ;}
}
硬件设计
使用元器件:
单片机:STC89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
万用板9*15;DC电源插口;
自锁开关;2.2K电阻*7;
40脚IC座;钮扣电池;
电池座;10uF电容;
ULN2003驱动芯片;
1位7段LED数码管;
10K排阻(103);
10K电阻*1;按键*6;
30Pf瓷片电容*2;
DC-5V步进电机;
12M晶振;导线:若干;
结构图:
设计资料
01 仿真图
本设计使用proteus8.9版本设计,资料里有安装教程,无需担心!具体如图!
02 原理图
本系统原理图采用Altium Designer19设计,具体如图!
03 程序
本设计使用软件keil5版本编程设计,资料里有安装教程,无需担心!具体如图!
04 设计报告
五千字设计报告,具体如下!
05 设计资料
资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、AD原理图、参考论文、实物图、流程图、任务书、元件清单、讲解视频等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。
相关文章:

基于51单片机的步进电机调速系统设计
基于51单片机的步进电机调速系统 (仿真+程序+原理图+设计报告) 功能介绍 具体功能: 1.按键可以控制电机正、反转,加、减速,停止; 2.一位7段数码管实时显示档位…...
postcss概述
PostCSS是一个用于转换CSS的工具,它使用插件来处理CSS,并提供了一种方式来编写可扩展的CSS代码。其主要特点如下: 插件驱动:PostCSS的核心非常轻量级,大部分功能都是通过插件来实现的。这意味着用户可以根据项目的需求…...

【Proteus】51单片机对直流电机的控制
直流电机:输出或输入为直流电能的旋转电机。能实现直流电能和机械能互相转换的电机。把它作电动机运行时是直流电动机,电能转换为机械能;作发电机运行时是直流发电机,机 械能转换为电能。 直流电机的控制: 1、方向控制…...

JET毛选学习笔记:如何利用《实践论》学习实验
一、个人背景介绍 本人本科读的是预防医学专业(因为没考上临床),硕博连读(报名人少,我报了就得了)的时候专业是流行病与卫生统计学,除了学习流行病学、统计学(忘得差不多了…...

FinalShell 远程连接 Linux(Ubuntu)系统
Linux 系列教程: VMware 安装配置 Ubuntu(最新版、超详细)FinalShell 远程连接 Linux(Ubuntu)系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题:为什么使用 FinalShell 连接࿰…...

Python零基础从小白打怪升级中~~~~~~~多线程
线程安全和锁 一、全局解释器锁 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。 GIL全称global interpreter lock,全局解释器锁。 每个线程在执行的时候都需要先获取GIL,保证同一时刻只…...
【机器学习300问】67、均方误差与交叉熵误差,两种损失函数的区别?
一、均方误差(Mean Squared Error, MSE) 假设你是一个教练,在指导学生射箭。每次射箭后,你可以测量子弹的落点距离靶心的差距(误差)。MSE就像是计算所以射击误差的平方后的平均值。它强调了每一次偏离靶心的…...

SAP打印输出设置
SAP打印输入有很多方式,适合不同的应用场景。 一.打印输出总体概览图 二.前台打印 这个是比较常见的,前端打印的出现减轻了管理员的工作量,用户可以选择自己电脑上的打印机输出,不需要所有打印机都在SAP平台中进行配置࿰…...
qt对json文件下,qdatetime时间的正确读写方式
qt 对json文件下qdatetime时间的正确读写方式 被搞了很长时间,最后发现是需要控制格式。 正确方式 // read QByteArray localBytes mapJson["playTime"].toString().toLocal8Bit(); char* char_time localBytes.data(); std::string str_time char_…...

【系统分析师】计算机网络
文章目录 1、TCP/IP协议族1.1 DHCP协议1.2 DNS协议1.3网络故障诊断 2、网路规划与设计2.1逻辑网络设计2.2物理网络设计2.3 分层设计 3、网络接入3.1 接入方式3.2 IPv6地址 4、综合布线技术5、物联网5.1物联网概念与分层5.2 物联网关键技术 6、云计算7、网络存储技术(…...

DDoS攻击愈演愈烈,谈如何做好DDoS防御
DDoS攻击是目前最常见的网络攻击方式之一,各种规模的企业包括组织机构都在受其影响。对于未受保护的企业来讲,每次DDoS攻击的平均成本为20万美元。可见,我们显然需要开展更多的DDoS防御工作。除考虑如何规避已发生的攻击外,更重要…...

48.基于SpringBoot + Vue实现的前后端分离-雪具销售系统(项目 + 论文PPT)
项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的雪具销售系统设计与实现管理工作系统…...
P8715 [蓝桥杯 2020 省 AB2] 子串分值 (双边检测)
# [蓝桥杯 2020 省 AB2] 子串分值 ## 题目描述 对于一个字符串 $S$, 我们定义 $S$ 的分值 $f(S)$ 为 $S$ 中恰好出现一次的字符个数。例如 $f\left({ }^{\prime \prime} \mathrm{aba}{ }^{\prime \prime}\right)1$,$f\left({ }^{\prime \prime} \mathrm{abc}{ }^{…...

(十四)C++自制植物大战僵尸游戏windows平台视频播放实现
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/8UFMs VLC库 在Cocos2d-x游戏开发框架中,没有实现windows平台视频播放的功能,需要自定义实现。在本项目中使用vlc库实现windows平台的视频播放功能。 vlc官网:网址 下载完成后&#x…...

深入理解GCC/G++在CentOS上的应用
文章目录 深入理解GCC/G在CentOS上的应用编译C和C源文件C语言编译C语言编译 编译过程的详解预处理编译汇编链接 链接动态库和静态库静态库和动态库安装静态库 结论 深入理解GCC/G在CentOS上的应用 在前文的基础上,我们已经了解了CentOS的基本特性和如何在其上安装及…...
C语言【复合类型(自定义类型)】
一、结构体 结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型”; 1. 结构体变量的定义和初始化 定义结构体变量的方式: 先声明结构体类型再定义变量名 在声明类型的同时定义变量 // 结构体类型的定义 struct stu {char name[50];int age;…...
【python】初识爬虫
Python爬虫介绍 目录 一、概述二、Python爬虫的基本构成爬虫引擎解析器数据存储三、Python爬虫的主要技术请求与响应URL管理页面解析数据存储四、Python爬虫的应用场景数据采集搜索引擎竞品分析价格监控五、Python爬虫的开发流程六、常用的库...

提高小红书底层逻辑认知+短视频思路打爆笔记+纯带货笔记起号(8节课)
课程内容: 小红书如何0押金开通店铺 .mp4 店铺基础搭建.mp4 小红营的流量从哪里来? 如何用养号发现优质的对标笔记?养号的真正意义是什么?.mp4 什么叫垂类标签? 账号如何打上正确的标签 .mp4 前期笔记是否挂车?不同类型的笔记审核标准是什么?.mp4 如何用…...

力扣:219. 存在重复元素 II
力扣:219. 存在重复元素 II 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在,返回 true ;否则,返回 false 。 …...
程序安装 - 笔记
1 程序IOServer,依赖自己开发libs7.so.如何安装程序 要安装依赖于自己开发的 libs7.so 的程序 IOServer,你需要执行以下步骤: 编译 IOServer 程序:确保 IOServer 程序的源代码处于可用状态,并且已经编译成可执行文件。这可能需要执行诸如 make 或者其他编译命令,具体取决…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...