【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

这篇具有很好参考价值的文章主要介绍了【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 文章来源地址https://www.toymoban.com/news/detail-427277.html

一、设计目标

    设计程序实现按键控制步进电机启动、停机、正反转、加减速、转速及转向显示。

二、主要功能

    功能1:步进电机的启动、重启、停机;

    功能2:步进电机正反装;

    功能3:静态数码管显示速度等级;

    功能4:步进电机的加减速;

三、硬件部分

    51单片机,导线,5161BS静态数码管,独立按键,四线双极性步进电机。

 

图1

【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

   图2【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

图3

【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

图4

【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

图5

 【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

 图6

【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

 

    图1为单片机接线图;

    图2为静态数码管的内部电路图;

    图3为控制步进电机的部分的内部电路图;

    图4为独立按键设置;

    图5为四线双极性步进电机内部原理图;

    图6为步进电机转动的原理图:

    ①A加正极,A-加负极,B加负极,B-加负极(电机状态,N极朝上)。

    ②A加负极,A-加负极,B加正极,B-加负极(电机状态,N极朝右,旋转90度)。

    ③A加负极,A-加正极,B加负极,B-加负极(电机状态,N极朝下)。

    ④A加负极,A-加负极,B加负极,B-加正极(电机状态,N极朝左)。

    只要依次给相应引脚相应的电平就可以使得电机转动,转动的最小角度为90度。为了实现更加小角度的供电,本次设计中的供电顺序:A、AB、B、BA-、A-、A-B-、B-、B-A,转动的最小角度为45°。

 

四、程序框图

 

【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度

 

五、代码说明

    代码由延时函数、按键扫描函数、模式判断函数、中断初始化函数、调速函数、主函数组成。

    延时函数用于调节给电机供电的时间,从而实现调速。

    按键扫描函数用来判断哪个键被按下,从而实现对应功能。

    模式判断函数根据按键扫描的返回值执行相应功能。

    中断初始化函数定义了两个中断。

    调速函数通过两个中断函数实现电机转动的加减速。

    主函数调用并执行子函数。    

1.主函数

    主函数声明两个中断函数,并进入子程序的循环,即先按键扫描,返回值再进入模式判断函数。 

 

/****************************主函数**********************************/       
void main(void)
{
  Int0Init();//声明加速的中断
  Int1Init();//声明减速的中断
  while(1)
  {
    mode(key());//先按键扫描,后选择模式
  }		
}

声明部分。定义顺时针和逆时针转动时供电的顺序,分别放到两个数组里;定义数码管显示的供电;定义全局变量V用来调节转速、全局变量D用来调节显示的速度档。

#include <REGX51.H>

unsigned char SSZ[] = {0x08,0x0a,0x02,0x06,0x04,0x05,0x01,0x09};//顺时针数组
unsigned char NSZ[] = {0x09,0x01,0x05,0x04,0x06,0x02,0x0a,0x08};//逆时针数组
smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//用于显示档速
int V=500,D=1;//V在延时函数中,用于调速;D用来控制数码管显示的数字
int i=4;//先使电机处于停机状态
int n=0;//用于循环给电机通电

 

2.子函数1

    延时函数用于调节给电机供电的时间,从而实现调速。

/***************************延时函数*******************************/
void delay(unsigned int t)//调节给电机供电的时间,从而调速	
{
  while(t--);
}

 

3.子函数2

    按键扫描函数用来判断哪个键被按下,从而实现对应功能。

/***************************按键扫描***************************************/
int key()
{
  if(P0_0==0) i=1;//顺时针
  if(P0_1==0) i=2;//逆时针
  if(P0_2==0) i=3;//启动/回到初速度
  if(P0_3==0) i=4;//停机
  return i;
}  

 

4.子函数3

    模式判断函数根据按键扫描的返回值执行相应功能。停机即不给电机供电并使数码管显示0。启动会首先给全局变量V赋值500保证一定的延时,达到一定的转速,并且速度档先为1。正转使用顺时针数组内规则供电,反转使用逆时针数组内规则供电,并根据全局变量D的值显示速度档。

/****************************模式判断**************************************/  
void mode(int i)//由按键扫描返回值判断 
{
  switch(i)
  {
/****************停机****************/    
	case 4:
	  P2=0X00;//不给电机供电
	  P1=~smg[0];//数码管显示0
	  break;  
/****************启动/重启****************/ 
	case 3:
	  V=500;//启动的速度/初速度
	  D=1;//速度1档,自动进入模式1
/****************模式1 正转****************/
	case 1:
	  while(1)
	  {
	    for(n=0;n<8;n++)//循环供电
		{
		  P2=SSZ[n];//供电
		  delay(V);//延时
		  P1=~smg[D];//显示速度档
		}
		break;
	  }  
	 break; 	 
/****************模式2 反转****************/
	case 2:
	  while(1)
	  {
	    for(n=0;n<8;n++)//循环供电
		{
		  P2=NSZ[n];//供电
		  delay(V);//延时
		  P1=~smg[D];//显示速度档
		}
		break;
	  }
	  break; 	       
  }
}

 

5.子函数4

    中断初始化函数定义两个外部中断从而实现控制电机的加速和减速。

/*************************中断初始化*****************************/
void Int0Init()//加速
{
  IT0=1;
  EX0=1;
  EA=1;
}

void Int1Init()//减速
{
  IT1=1;
  EX1=1;
  EA=1;
}

 

6.子函数5

    调速函数的实质是两个中断函数。如果对应按键按下,会使全局变量V加或减相应值实现转速的改变,同时全局变量D也会加或减1,从而改变数码管显示的速度档。

/*************************调速函数****************************/
void Int0() interrupt 0	 //加速
{
  if(P3_2==0)//判断加速键是否被按下
  {
    delay(2000);//消抖
    if(P3_2==0)//消抖后再次判断
	{
      V=V-50;//延时时间减少,所以速度增加
	  D=D+1;//速度档加1
	}
  }
}

void Int1() interrupt 2	 //减速
{
  if(P3_3==0)//判断减速键是否被按下
  {
    delay(2000);//消抖
    if(P3_3==0)//消抖后再次判断
	{
      V=V+50;//延时时间增加,所以速度减少
	  D=D-1;//速度档减1
	}
  }
}

 六、结束语

    本函数实现了步进电机的基本控制,但是可拓展的地方还有很多,比如使用动态数码管显示,使用LCD1602液晶显示屏显示均可。还可以通过计算延时函数的长短,计算出电机转一圈的时间,从而计算转速。另外还可以使用计数器来计算电机1s内转了多少圈,也可以用来计算转速。留待后期开发,还有很多可以探索的功能。

七、演示视频

步进电机视频

八、源代码

#include <REGX51.H>

unsigned char SSZ[] = {0x08,0x0a,0x02,0x06,0x04,0x05,0x01,0x09};//顺时针数组
unsigned char NSZ[] = {0x09,0x01,0x05,0x04,0x06,0x02,0x0a,0x08};//逆时针数组
smg[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//用于显示档速
int V=500,D=1;//V在延时函数中,用于调速;D用来控制数码管显示的数字
int i=4;//先使电机处于停机状态
int n=0;//用于循环给电机通电
/***************************延时函数*******************************/
void delay(unsigned int t)//调节给电机供电的时间,从而调速	
{
  while(t--);
}
/***************************按键扫描***************************************/
int key()
{
  if(P0_0==0) i=1;//顺时针
  if(P0_1==0) i=2;//逆时针
  if(P0_2==0) i=3;//启动/回到初速度
  if(P0_3==0) i=4;//停机
  return i;
}  
/****************************模式判断**************************************/  
void mode(int i)//由按键扫描返回值判断 
{
  switch(i)
  {
/****************停机****************/    
	case 4:
	  P2=0X00;//不给电机供电
	  P1=~smg[0];//数码管显示0
	  break;  
/****************启动/重启****************/ 
	case 3:
	  V=500;//启动的速度/初速度
	  D=1;//速度1档,自动进入模式1
/****************模式1 正转****************/
	case 1:
	  while(1)
	  {
	    for(n=0;n<8;n++)//循环供电
		{
		  P2=SSZ[n];//供电
		  delay(V);//延时
		  P1=~smg[D];//显示速度档
		}
		break;
	  }  
	 break; 	 
/****************模式2 反转****************/
	case 2:
	  while(1)
	  {
	    for(n=0;n<8;n++)//循环供电
		{
		  P2=NSZ[n];//供电
		  delay(V);//延时
		  P1=~smg[D];//显示速度档
		}
		break;
	  }
	  break; 	       
  }
}
/*************************中断初始化*****************************/
void Int0Init()//加速
{
  IT0=1;
  EX0=1;
  EA=1;
}

void Int1Init()//减速
{
  IT1=1;
  EX1=1;
  EA=1;
}
/*************************调速函数****************************/
void Int0() interrupt 0	 //加速
{
  if(P3_2==0)//判断加速键是否被按下
  {
    delay(2000);//消抖
    if(P3_2==0)//消抖后再次判断
	{
      V=V-50;//延时时间减少,所以速度增加
	  D=D+1;//速度档加1
	}
  }
}

void Int1() interrupt 2	 //减速
{
  if(P3_3==0)//判断减速键是否被按下
  {
    delay(2000);//消抖
    if(P3_3==0)//消抖后再次判断
	{
      V=V+50;//延时时间增加,所以速度减少
	  D=D-1;//速度档减1
	}
  }
}
/****************************主函数**********************************/       
void main(void)
{
  Int0Init();//声明加速的中断
  Int1Init();//声明减速的中断
  while(1)
  {
    mode(key());//先按键扫描,后选择模式
  }		
}

 

 

 

 

 

到了这里,关于【C语言】51单片机四线双极性步进电机启动、停机、正反转、加减速(中断实现)数码管显示速度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机步进电机角度控制详解(免费提供代码+仿真)

    我个人认为,步进电机的基本原理和介绍看看其他博主的介绍就好了。我比较希望讲一下我对步进电机的关于自己一种理解方式,可能与真正步进电机的原理差的有点大。下面还是给一下我推荐的一些博主对步进电机的介绍文章。 百度步进电机链接 步进电机驱动及原理—s

    2023年04月18日
    浏览(46)
  • 【Proteus仿真】【51单片机】步进电机控制系统设计

    本项目使用Proteus8仿真51单片机控制器,使用ULN2003电机模块、LCD1602模块、按键模块等。 主要功能: 系统运行后,LCD1602显示电机当前运行档位、方向、状态。 可通过按键K4启动与停止,按键K1加速、按键K2减速,按键K3换向;档位可在1-5挡。 最终可实现: 按键功能:具有加速

    2024年02月12日
    浏览(50)
  • 51单片机控制步进电机启停,正反转速度——入门

    实验器件 STC89C52RC的学习板子一个 DC 5V 4相5线步进电机 28YBJ-48 减速步进电机一个 元器件连接: 51单片机开发板  电气原理图     实验现象:下载程序后; 当按下KEY1键可调节电机旋转方向; 当按下KEY2键,电机加速; 当按下KEY3键,电机减速; 按下KEY4的时候,电机启动/停止;

    2024年02月11日
    浏览(47)
  • 51单片机的步进电机控制系统(仿真+程序+报告+原理图)

    该系统由AT89C51单片机+数码管模块+步进电机模块+按键模块构成。 可实现功能: 1、按键控制步进电机正反转、加减速、停止; 2、2个发光二极管显示正反转,1位7段LED数码管显示当前转速档位(共9个档位); 3、4个红色LED,指示电机的转速。 protues 仿真使用的是8.10版本,由于

    2024年02月11日
    浏览(40)
  • 51单片机双轴太阳能追光追日系统ULN2003步进电机

    功能介绍:    

    2023年04月09日
    浏览(55)
  • 7-3、S曲线生成器【51单片机控制步进电机-TB6600系列】

    摘要 :本节介绍步进电机S曲线生成器的计算以及使用 一.计算原理 根据上一节内容,已经计算了一条任意S曲线的函数。在步进电机S曲线加减速的控制中,需要的S曲线如图1所示,横轴为时间,纵轴为角速度,其中w0为起始角速度,w1为终止角速度 在S曲线加减速控制中,加减

    2024年02月08日
    浏览(47)
  • 【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态

    步进电机控制 设计思路 电路设计: 选用AT89C51单片机作为电路核心部件,外加LM016L液晶显示屏作为显示,显示步进电机的Fast,Slow,Stop的三个状态 将AT89C51单片机所选引脚与LM016L控制引脚相连,再将数据通过引脚与LCD接收引脚相连。 通过AT89C51单片机P0^0和P0^2两个引脚引出两个

    2024年01月20日
    浏览(57)
  • 基于51单片机的FRID智能门禁系统(RFID,12864,AT24C02,步进电机......)

    目录 门禁系统 需要的器件 设计思路 流程图实现 技术实现 实物接线图 实物接线图  函数设计 部分主程序代码,截取片段 12864显示模块 步进电机模块以及蜂鸣器 FRID射频模块 AT24C02模块 功能实现及其源代码 完整文件         STC89C52,MFRC-522 RFID射频模块,AT24C02存储电路,

    2024年02月07日
    浏览(55)
  • 单片机设计_自动追光系统、光源跟踪系统(AT89C51 光敏电阻 步进电机)

    想要更多项目私wo!!!          51 单片机双轴自动追光系统主要由 STC89C52RC + 5516 光敏电阻 + ADC0832 + ULN2803 + 步进电机 + LCD1602 显示屏组成。         1.通过子电路板的上、下、左、右四个光敏电阻来感受四个方向的光强,自 动寻找光强最强的方向。四个光敏电阻的分压电

    2024年02月11日
    浏览(43)
  • 51单片机STC15W4K56S4控制步进电机28BYJ-48正反转

    步进电机28BYJ-48(12V)介绍:       首先,我们看下步进电机28BYJ-48(12V)外观图,如下:         28BYJ-48(12V)含义如下:28表示电机直径28毫米,B表示电机 ,Y表示永磁,J表示带减速箱,48表示四相八拍。       下面解释下“4 相永磁式”的概念,28BYJ-48 的构造如下图所示

    2023年04月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包