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

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
#include
#include
#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();	
	}
}

你可能感兴趣的:(51单片机,单片机,嵌入式硬件)