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

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();	
	}
}
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 基于51单片机步进电机控制系统设计开发diy正反转源文件包括以下几个部分: 1. 硬件设计:根据步进电机的参数,选择适当的驱动电路和控制器,并按照电路图进行焊接和布线。 2. 软件设计:编写控制程序,使步进电机可以正反转,实现编码器计数器功能和自动控制功能。程序应该实现对步进电机速度、位置和加速度的精确控制。 3. 驱动程序:编写驱动程序,使控制程序和硬件可以正常协作,使步进电机能够根据控制信号准确运转。 4. 调试:对整个系统进行调试和测试,确保各个部分的功能正常,并进行性能优化。 5. 文档编写:撰写相关文档,包括测试结果、用户手册、技术规范等内容,方便后续的开发和维护工作。 以上是基于51单片机步进电机控制系统设计开发diy正反转源文件的主要内容。在实际开发过程中,应该精心设计、认真调试,以确保系统的可靠性和性能。同时,适当地使用现有的资源或借鉴其他项目的经验也是必要的,这样可以大大提高项目的开发效率和质量。 ### 回答2: 本项目基于51单片机开发了一种步进电机控制系统,可实现电机的正反转功能。本文将介绍该系统的diy源代码。 该系统设计上采用了四相驱动的方式,步进电机控制器带有一个编码器和步进电机。通过流程控制语句,该系统可以转向和控制步进电机的速度。具体步骤如下: 1. 首先定义所用的引脚数目 ``` #define IN1 P2_0 //正转 #define IN2 P2_1 #define IN3 P2_2 #define IN4 P2_3 ``` 2. 定义电机移动的步长 ``` const unsigned char code MotorSteps[]={0xA,0x6,0x5,0x9}; ``` 3. 设置电机正转,反转,或停止 ``` void Turn(int Direction, int Speed) { int i,j; for(i=0;i<44-Speed;i++) { for(j=0;j<4;j++) { if(Direction == 1) //正转 { P2 = MotorSteps[j]; i++; } else if(Direction == 2) //反转 { P2 = MotorSteps[3-j]; i++; } else //停止 { P2 = 0x00; i++; } delay(10); } } } ``` 4. 使用捕获定时器来控制转动速度 ``` void timer(void) interrupt 1 { TH0 = 0xFF; TL0 = 0x97; flag ++; if(flag == rotSpeed) //转速控制 { flag = 0; counter ++; if(counter > 3) counter = 0; P2 = MotorSteps[counter]; } } int main() { while(1) { if(buttonDown(BTN_P)) //正转控制 { Turn(1,22); } if(buttonDown(BTN_N)) //反转控制 { Turn(2,22); } if(buttonDown(BTN_S)) //停止控制 { Turn(0,22); } } } ``` 通过以上的设计,我们已经可以实现基于51单片机步进电机控制系统,控制电机的正反转以及速度。通过调整代码中的步数和转速,可以使该系统适用于不同的步进电机。 ### 回答3: 在基于51单片机步进电机控制系统设计开发过程中,需要考虑到正反转操作的实现。为此,我们需要编写相应的源代码以实现这一功能。 首先,我们需要了解步进电机的工作原理。步进电机通常有两种驱动方式:全步进和半步进。在控制步进电机运行过程中,最关键的是控制电机的每一个步进,以及确保它们按预设的顺序和速度运行。 我们可以使用信号采样方式,将步进电机的电压信号作为反馈输入,实现精准控制。同时,我们需要依据正反转操作的不同需要,分别设置开关量输出,以实现正转和反转的控制。 为了实现这一操作,我们需要编写一段程序代码,以实现步进电机正反转切换时的控制。我们可以设置一个开关量输入口,通过检测开关量的状态来判断是正转信号还是反转信号。通过判断信号状态以及步进电机的当前状态,我们可以实现正反转的切换和控制,保证步进电机运行的稳定性和可靠性。 总的来说,基于51单片机步进电机控制系统设计开发diy正反转源文件编写过程需要关注如下几点:对步进电机工作原理的理解、信号采样方式的选择、开关量状态的检测、步进电机当前状态的判断,以及控制正反转切换的代码实现。只有通过精心的设计和编写源文件,我们才能够实现一个高效、稳定和可靠的步进电机控制系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值