【毕业设计】5-基于51单片机步进电机的控制研究(原理图工程+仿真工程+答辩论文+答辩PPT)

本文详细描述了一项基于51单片机的步进电机控制系统的设计,包括功能分析、元器件选择、硬件电路设计(如单片机、LCD、按键、步进电机等)、软件编程以及实际测试。设计者展示了从原理图到实物实现的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【毕业设计】5-基于51单片机步进电机的控制研究(原理图工程+仿真工程+答辩论文+答辩PPT)

资料要求

包含此题目毕业设计全套资料:
原理图工程
PCB工程
仿真工程文件
源代码工程
论文低重复率,字数:23541
答辩PPT
详情请私信!

设计说明书

摘要

步进电机现在已经广泛的应用在各种工业控制和机械控制场合中,随着单片机的发展,也使得步进电机的控制技术成熟和应用,控制精度和控制难度也得到了大幅度的提高,现在已经常用于打印机,绘图仪和机器人控制系统中,对其研究具有重大意义。
在系统设计之前对系统的功能分析,然后对系统元器件选型确定使用使用STC89C52为主控制,LCD1602作为系统的显示器,独立按键作为系统的人机交互设备,步进电机选择型号为28BYJ-48,驱动芯片为ULN2003。将系统硬件电路设计完成后,购买元器件焊接电路,然后对电路进行检测,测试电路电压是否满足要求。然后编写系统程序,将程序烧录到单片机中再对系统进行软件与硬件联合调试,最后测试实现了单片机的正传、反转、加速、减速、步进度数为5°的功能测试,完成了设计。

设计框架架构

在这里插入图片描述

目 录 III
第1章 引言 5
1.1 研究目的和意义 5
1.2 国内外的研究概况 6
1.3 本文的主要研究内容 6
第2章 基于51单片机步进电机的控制系统方案分析 7
2.1 系统设计功能分析 7
2.2 系统元器件方案选择 7
2.2.1 人机交互方案选择 7
2.2.2 步进电机驱动方案选择 8
2.2.3 显示器方案选择 8
2.2.4 主控芯片选择 9
2.3 步进电机工作原理 9
2.3.1 步进电机的工作原理 10
2.3.2 步进电机的特点 12
2.3.3 步进电机速度控制原理 12
2.4 系统结构总框图 13
第3章 基于51单片机步进电机的控制系统硬件电路设计 15
3.1 单片机最小系统电路设计 15
3.1.1 单片机介绍 15
3.1.2 晶振电路设计 17
3.1.3 复位电路设计 18
3.2 电源电路设计 20
3.3 按键电路设计 20
3.4 步进电机及驱动电路设计 21
3.5 LCD液晶显示电路设计 22
3.6 系统总电路图 25
第4章 基于51单片机步进电机的控制系统的软件设计 26
4.1 软件开发环境 26
4.2 软件总设计流程 27
4.3 步进电机控制模块程序设计 29
4.4 显示程序 29
4.5 按键扫描程序 31
第5章 基于51单片机步进电机的控制实现 33
5.1 实物焊接与调试 33
5.2 实物功能测试 35
5.2.1 系统正向转动测试 35
5.2.2 系统反向转动测试 36
总结 39
参考文献 41
致谢 43
附录 44
附录一:工程图纸 44
附录二:程序源码 44
外文资料原文 53
译文 59

设计说明书及设计文件

在这里插入图片描述在这里插入图片描述
在这里插入图片描述字数:23541
在这里插入图片描述

源码展示

在这里插入图片描述

#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^4;//1602数据/命令选择端(H:数据寄存器L:指令寄存器) 
sbit RW = P2^5;//1602读/写选择端 
sbit E  = P2^6;//1602使能信号端
sbit key1=P3^0;//用户按键
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit key5=P3^4;
uchar code B_Rotation[8]={0x7f,0x3f,0xbf,0x9f,0xdf,0xcf,0xef,0x6f}; //反转表格
uchar code F_Rotation[8]={0xef,0xcf,0xdf,0x9f,0xbf,0x3f,0x7f,0x6f}; //正转表格
uchar table1[]="dir: +  spe:005";
uchar table2[]="cir:000 ang:000";
uchar num;
uint key,flag,speed=5,zflag,znum,fflag,fnum,select,pp,qq;
//1键值2键值标志3速度4正转标志5正转圈数6反转标志7反转圈数8正转角度9反转角度10选择
float zang,fang;
/******************************************************************/
/*                    延时函数 Xms                                   */
/******************************************************************/
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=110;y>0;y--);
}
/******************************************************************/
/*                   LCD1602写命令操作                            */
/******************************************************************/
void WriteCommand(uchar com)
{
	delay(5);//操作前短暂延时,保证信号稳定
	E=0;
	RS=0;
	RW=0;
	P0=com;
	E=1;
	delay(5);
	E=0;
}
/******************************************************************/
/*                   LCD1602写数据操作                            *//******************************************************************/
void WriteData(uchar dat)
{
	delay(5);  //操作前短暂延时,保证信号稳定
	E=0;
	RS=1;
	RW=0;
	P0=dat;
	E=1;
	delay(5);
	E=0;
}
/******************************************************************/
/*                           1602初始化程序                       */
/******************************************************************/
void InitLcd()//1602初始化程序
{
	delay(15);
	WriteCommand(0x38); //display mode
	WriteCommand(0x38); //display mode
	WriteCommand(0x38); //display mode
	WriteCommand(0x06); //当读或写一个字符后地址指针加一,且光标加一
	WriteCommand(0x0c); //显示开及光标不显示
	WriteCommand(0x01); //清屏

	WriteCommand(0x80);
	for(num=0;num<15;num++)//第一行的显示
	{
		WriteData(table1[num]);
		delay(15);
	}
	WriteCommand(0x80+0x40);//第二行的显示
	for(num=0;num<15;num++)
	{
		WriteData(table2[num]);
		delay(15);
	}

}
/******************************************************************/
/*              独立键盘扫描函数                                  */
/******************************************************************/
void keyscan()  
{	
	
	P3=0xff;//拉高P3口,以读取P3口的值
	if(key1==0)//键1被按下
	{
		delay(5);//延时消抖
		if(key1==0)
		{
			flag=1;
		}
		while(!key1);
		delay(5);//延时消抖
		while(!key1);//松手检测
	}
	if(key2==0)
	{
		delay(5);
		if(key2==0)
		{
			flag=2;
		}
		while(!key2);
		delay(5);
		while(!key2);
	}
	if(key3==0)//键1被按下
	{
		delay(5);//延时消抖
		if(key3==0)
		{
			flag=3;
		}
		while(!key3);
		delay(5);//延时消抖
		while(!key3);//松手检测
	}
	if(key4==0)
	{
		delay(5);
		if(key4==0)
		{
			flag=4;
		}
		while(!key4);
		delay(5);
		while(!key4);
	}
	if(key5==0)
	{
		delay(5);
		if(key5==0)
		{
			flag=5;
		}
		while(!key5);
		delay(5);
		while(!key5);
	}
}
/******************************************************************/
/*                           1602显示3位数                       */
/******************************************************************/
void write_sfm(uchar add,uint date)//1602显示
{
	uchar bai,shi,ge;
	bai=date/100;
	shi=date%100/10;
	ge=date%10;
	WriteCommand(0x80+add);//设置数据地址指针
	WriteData(0x30+bai);
	WriteData(0x30+shi);
	WriteData(0x30+ge);
	WriteData(0x20);
}
/******************************************************************/
/*                           键值处理                             */
/******************************************************************/
void handle_flag() 
{	

	uchar select1;
	if(TR0==0&&TR1==0)
	{	
		if(flag==1) //正转
		{
			WriteCommand(0x80+0x05);
			WriteData('+');
			delay(20);
			select=0;
		}
		if(flag==2) //反转
		{
			WriteCommand(0x80+0x05);
			WriteData('-');
			delay(20);
			select=1;
		}
		if(flag==3)//转速加
		{
	    	speed++;
			if(speed>=12)
				speed=12;
			write_sfm(0x0c,speed);//显示速度
			delay(20);
    	}
		if(flag==4)	//转速减
		{
			speed--;
			if(speed<=1)
				speed=1;
			write_sfm(0x0c,speed);//显示速度
			delay(20);
		}
}
	if(flag==5)关闭中断,停止电机
	{
		select1++;
		select1%=2;
		if( select1==0)
		{
			TR0=0;
			TR1=0;
			if(select==0)//显示转动的角度
				write_sfm(0x40+0x0c,zang);
			else
				write_sfm(0x40+0x0c,fang);
     	}
		else
		{if(select==0)
		{
			TR0=1;//开定时器0,产生正转相序
			TR1=0;//关定时器1
		}
		else
		{	
			TR1=1;//开定时器1,产生反转相序
			TR0=0;//关定时器0	
		}
		}			
	}
	flag=0;
}
void main()
{
	
	pp=0;
	qq=0;
    InitLcd();
	TMOD=0x11;
    EA=1;
	ET0=1;
	ET1=1;

	TH0=(65536-(14648/speed))/256;
	TL0=(65536-(14648/speed))%256;
	TH1=(65536-(14648/speed))/256;
	TL1=(65536-(14648/speed))%256;
	TR0=0;
	TR1=0;	
	while(1)
	{	
		keyscan();
		handle_flag();	
	}
}
在园区网建设过程中,我们常常面临诸多实际挑战,例如网络设计、IP规划、成本控制以及项目管理等。而名为“园区网的真实案例.zip”的压缩包文件提供了大量实用资源,包括真实园区网案例、综合实验拓扑图、相关脚本和项目需求分析等,这些资料对于理解和实践园区网建设具有重要意义。我们重点关注其中的“园区网综合实验”部分。 园区网是在学校、企业或政府机构等相对封闭区域内构建的网络,旨在为区域内用户提供高效、安全的数据通信服务。综合实验则是为了模拟真实环境,帮助学习者掌握园区网设计的关键技术和步骤,通常涵盖网络设备选择与配置、VLAN划分、路由协议应用、QoS策略设定以及安全防护措施等内容。压缩包中的“最终”文件可能包含了项目实施的最终成果,如经过验证的网络设计方案、配置脚本或项目总结报告,这些资料有助于我们将理论知识转化为实际可执行的方案。 “命令”文件则可能包含了用于配置网络设备的CLI指令,涉及交换机和路由器的基本配置,如VLAN设置、端口安全、静态路由或动态路由协议(如OSPF、RIP等)。通过研究这些命令,我们可以学习如何根据不同场景正确配置网络设备,以满足业务需求。 IP规划是园区网建设中的关键任务,合理的IP规划能够避免地址冲突,便于管理和维护。案例中可能会展示如何根据园区规模、功能区划分及未来扩展需求制定合适的IP地址策略。成本控制同样重要,园区网建设不仅涉及设备购置费用,还包括安装、运维、升级等长期成本。案例可能探讨如何在满足功能需求的同时,选择性价比高的设备,优化布线方案,并通过节能技术降低运营成本。 项目总结则是对整个实施过程的回顾,涵盖遇到的问题、解决方案、经验教训及改进点,对提升项目管理能力和问题解决技巧非常有帮助。这个压缩包的内容全面覆盖了园区网设计、建设和管理的多个方面,是学习和实践网络技术的宝贵资源。通过深入研究这些材料,我们可以提升网络规划和实施能力,更好
内容概要:本文档《Grafana运维指南:从入门到精通》详细介绍了Grafana这一开源度量分析和可视化工具的各个方面。首先解释了Grafana在数据监控和分析中的重要性,强调其开源、可视化、多数据源支持、告警功能、灵活的仪表盘管理和丰富的插件生态系统等特点。接着,文档逐步讲解了Grafana的安装与配置,包括系统准备、初始配置和数据源配置等步骤。随后,深入探讨了数据源管理、仪表盘操作、插件使用等核心功能,提供了详细的配置和使用指南。最后,文档介绍了性能优化、安全管理、日志分析等日常运维要点,并通过一个实际案例展示了Grafana在大型电商平台运维中的应用价值。 适用人群:适用于运维人员、系统管理员、开发人员以及任何需要进行数据监控和分析的专业人士,尤其是那些对Grafana有一定了解或有兴趣深入了解的人群。 使用场景及目标:①帮助用户掌握Grafana的安装配置和基本使用方法;②指导用户如何整合多种数据源,创建和管理仪表盘;③提供性能优化、安全管理等方面的建议,确保Grafana在实际应用中的高效稳定运行;④通过实际案例分享,展示Grafana在复杂业务环境中的应用效果,提升用户对Grafana的理解和应用能力。 其他说明:本文档不仅涵盖了Grafana的基础知识和技术细节,还结合实际案例,帮助读者更好地理解和应用Grafana。建议读者在学习过程中结合实际操作,通过实践加深对Grafana的理解。此外,文档鼓励读者参与社区交流,分享经验和心得,共同进步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值