基于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;  //按键5

sbit 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;		//1ms
	TL0 = (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原理图、参考论文、实物图、流程图、任务书、元件清单、讲解视频等。具体内容如下,全网最全! !

资料获取请观看前面演示视频!

点赞分享一起学习成长。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6个免费的伪原创工具,轻松生成原创文章

如今,内容创作已经成为许多人关注的焦点。然而,随之而来的是创作压力和时间成本的增加。为了解决这些问题,越来越多的人开始寻找一些伪原创工具来帮助他们生成原创文章,其中免费的伪原创工具成为了热门选择之一。这些免费的伪原创…

建都寿春的袁术兴亡史

三国(220年-280年)是中国历史上位于汉朝之后,晋朝之前的一段历史时期。这一个时期,先后出现了曹魏、蜀汉、东吴三个主要政权。袁术的地盘很小,为了在三国时期能够立足? 事实上,袁术巅峰时期的地盘并不小,而…

类和对象中-运算符重载

在C中,有些成员函数如果我们不去显示定义,编译器会自动生成 会自动生成的特殊函数: 他们不能定义为全局函数,必须是类成员员函数(特别是拷贝赋值重载) 下面介绍默认生成函数的作用,特点 构造 …

工作流JBPM流程图说明

文章目录 5☃️ 相关概念6 ☃️流程图说明6.0 ❄️❄️快速上手6.1 ❄️❄️活动Activity / 节点Node6.1.1 start 开始活动6.1.2 end 结束活动6.1.3 task 任务活动6.1.4 decision 判断活动6.1.5 fork/join 分支/聚合活动 6.2 ❄️❄️流转 Transition / 连线 (单向箭…

Python相关性分析

分析连续变量之间线性相关程度的强弱,并用适当的统计指标表示出来的过程称为相关分析。 可以直接绘制散点图,或者绘制散点图矩阵,或者计算相关系数来进行相关分析。 相关系数的计算如下所示: 示例数据: 计算百合酱蒸…

云服务器安装Mysql、MariaDB、Redis、tomcat、nginx

前置工作 进入根目录 cd / 都在/usr/local/src文件夹) 上传压缩包 rz 压缩包 Mysql 1.下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum…

lua 光速入门

文章目录 安装注释字符串变量逻辑运算条件判断循环函数Table (表)常用全局函数模块化 首先明确 lua 和 js Python一样是动态解释性语言,需要解释器执行。并且不同于 Python 的强类型与 js 的弱类型,它有点居中,倾向于强类型。 安装 下载解释…

美易官方:人民币国际支付占比升至近5%

随着全球金融市场的不断发展和数字化进程的加速,人民币的国际支付地位逐渐提升,成为备受瞩目的焦点。最近的数据显示,人民币在国际支付中的占比已经升至近5%,自11月以来已成为第四大交易货币。这一变化不仅反映了中国经济的崛起和…

Python 密码学实用指南(全)

原文:zh.annas-archive.org/md5/fe5e9f4d664790ea92fb33d78ca9108d 译者:飞龙 协议:CC BY-NC-SA 4.0 前言 密码学在保护关键系统和敏感信息方面有着悠久而重要的历史。本书将向您展示如何使用 Python 加密、评估、比较和攻击数据。总的来说&…

MDK stm32怎么生成bin文件

第一种 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe --bin -o ../../Output/atk_f407.bin ../../Output/atk_f407.axf 空格解析 D:\Keil_v5\ARM\ac5.6\bin\fromelf.exe一个空格--bin一个空格-o两个空格../../Output/atk_f407.bin ../../Output/atk_f407.axf (注意后…

Rose中UML类图详解及画法

一、UML简介 UML(Unified Modeling Language)是一种用于软件系统建模的标准化工具,它提供了一套统一的符号和语法,用于描述、设计、构建和交流软件系统的结构和行为。UML广泛应用于软件开发领域,被视为一种通用的建模语…

【C语言】qsort()函数排序及其模拟实现,万物皆可排!

🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 函数介绍 2. qsort举例排列整型变量 3. qsort举例排列结构型变量 3.1 按名字排序 3.1.1 srtcmp函数 3.2 按年龄排序 4. qsort函数模拟实现(采用冒泡的…

宝塔要注意的问题

数据库创建访问权限要全部人 反向代理1 打包dist,并不会有反向代理,所以宝塔里面要配置 反向代理2 这种去掉/api为/,上面的并没有去掉 rewrite ^/api/(.*)$ /$1 break;

mysql数据库表的数据显示到前端tableView

首先我们在ui视图设计中引入TableView, 定义一个model QSqlQueryModel *modelnew QSqlQueryModel(ui->tableView);model->setQuery(query);//将查询结果绑定到模型上ui->tableView->setModel(model); 将tableView内容设置成model然后就可以出现数据库的数据。示…

uni.uploadFile上传图片后台接收不到数据

今天遇到一个很奇怪的问题,通过使用uni.uploadFile上传文件时后端接收不到文件,查过很多资料,原来是自定义了header的Content-Type问题。取消即可,另把自定义文件上传的代码贴出来。 分析:当我们加上请求头的时候 不…

一.NODE MCU(ESP8285,ESP8286)开发环境搭建

一.序言: 1.esp8285长什么样? 2.esp8285是什么,能做什么? 通过上面图片,看到上面的芯片,是带有多个阵脚的单片机。实际上,看着该芯片很小,但是却具有完整的wifi无线蓝牙功能,它本身可以运行一个极简的linux小系统,并且该极简的小linux系统具备无线蓝牙功能。。它同…

了解光纤的最大损耗

在电信和数据传输领域,保持最佳的网络性能和可靠性至关重要。 影响网络完整性的关键因素之一是光纤中的信号丢失。信号损耗,也称为衰减损耗或光纤衰减,测量光缆输入和输出之间的光损耗量。本文将深入探讨光纤中的主要损耗,并指导您…

压缩感知的概述梳理(2)

参考文献 An efficient double-image encryption and hiding algorithm using a newly designed chaotic system and parallel compressive sensing 文献内容 梳理结果 列表形式 并行压缩感知核心元素 信号 x 和 s 信号 x: 稀疏信号信号 s: 非稀疏自然信号,在频…

数据库的创建

数据库分类 通过查看对象资源管理器来区分数据库类型 数据库物理文件的组成 : 数据库文件 日志文件 创建一个主数据文件和一个日志文件

数据结构--顺序表,链表,双向链表

数据结构的学习,从浅到深的学习,在了解他们的概念后,当然要明白他们分别是怎么实现的,同时通过对比来了解他们的异同点。 一.数据结构 1.1 什么是数据结构 所谓数据结构,拆开来讲,就是数据和结构。 数据…