基于51单片机的步进电机的控制

基于51单片机的步进电机的控制前面笔者分享过基于51单片机的两种小车制作,我们利用的是L298N驱动控制电机转动,那么接下来,笔者给大家介绍两种利用51单片机控制步进电机的小程序。首先我们要如何使电机转动呢,源程序如下:#include<reg52.h>unsignedcharcodeF_Rotation[4]={0x02,0x04,0x08,0x10};//正转表格,换算成二进制00…

大家好,又见面了,我是你们的朋友全栈君。

前面笔者分享过基于51单片机的两种小车制作,我们利用的是L298N驱动控制电机转动,那么接下来,笔者给大家介绍两种利用51单片机控制步进电机的小程序。
首先我们要如何使电机转动呢,源程序如下:

#include <reg52.h>


unsigned char code F_Rotation[4]={
  
  0x02,0x04,0x08,0x10}; //正转表格,换算成二进制 0000 0010,0000 0100,0000 1000,0001 0000
unsigned char code B_Rotation[4]={
  
  0x10,0x08,0x04,0x02}; //反转表格,换算成二进制 0001 0000,0000 1000,0000 0100,0000 0010
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void Delay(unsigned int i)//延时
{
 while(--i);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{

 unsigned char i;

 while(1)
 {
  for(i=0;i<4;i++)      //4相
     {
     P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格
     Delay(500);        //改变这个参数可以调整电机转速 ,数字越小,转速越大
     }
  }
}

接下来,我们要控制电机的正反转,这个程序主要用于4相步进电机的常规驱动,速度不可调的过快,不然就没有力矩的转动了,按s4可控制电机正反转:

#include <reg52.h>

bit Flag;//定义正反转标志位


unsigned char code F_Rotation[4]={
  
  0xf1,0xf2,0xf4,0xf8}; //正转表格
unsigned char code B_Rotation[4]={
  
  0xf8,0xf4,0xf2,0xf1}; //反转表格
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void Delay(unsigned int i)//延时
{
 while(--i);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{

 unsigned char i;


  EX1=1;         //外部中断0开
  IT1=1;         //边沿触发
  EA=1;          //全局中断开

 while(!Flag)            
 {
  P0=0x71;//显示 F 标示正转
  for(i=0;i<4;i++)      //4相
     {
     P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格
     Delay(500);        //改变这个参数可以调整电机转速 ,数字越小,转速越大
     }
  }
while(Flag)
 { 
  P0=0x7C;//显示 b 标示反转
  for(i=0;i<4;i++)      //4相
     {
     P1=B_Rotation[i];  //输出对应的相 
     Delay(500);        //改变这个参数可以调整电机转速 ,数字越小,转速越大
     }
  }
}
/******************************************************************/
/* 中断入口函数 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
 Delay(300);

 Flag=!Flag;         //s3按下触发一次,标志位取反

 }

最后介绍一下带停机的步进电机正反转的方法:

#include <reg52.h>

unsigned char Flag;//定义正反转和停止标志位
sbit KEY = P3^3;


unsigned char code F_Rotation[4]={
  
  0xf1,0xf2,0xf4,0xf8}; //正转表格
unsigned char code B_Rotation[4]={
  
  0xf8,0xf4,0xf2,0xf1}; //反转表格
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void Delay(unsigned int i)//延时
{
 while(--i);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{

 unsigned char i;


  EX1=1;         //外部中断0开
  IT1=1;         //边沿触发
  EA=1;          //全局中断开

 while(Flag==0)            
 {
  P0=0x71;//显示 F 标示正转
  for(i=0;i<4;i++)      //4相
     {
     P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格
     Delay(500);        //改变这个参数可以调整电机转速 ,数字越小,转速越大
     }
  }
while(Flag==1)
 { 
  P0=0x7C;//显示 b 标示反转
  for(i=0;i<4;i++)      //4相
     {
     P1=B_Rotation[i];  //输出对应的相 
     Delay(500);        //改变这个参数可以调整电机转速 ,数字越小,转速越大
     }
  }
while(Flag==2)  //停止
 { 
  P0=0x6D;// 显示 S
  P1=0;
  }
}
/******************************************************************/
/* 中断入口函数 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
 Delay(500);
 if(!KEY)
 {

 Flag++;         //s3按下触发一次
 if(Flag==3)
   Flag=0;
  }
 }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138248.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • uo什么意思_2018五大学科集训队

    uo什么意思_2018五大学科集训队uoj#418. 【集训队作业2018】三角形(线段树合并)

    2022年4月21日
  • PyCharm官网无法访问的解决办法[通俗易懂]

    PyCharm官网无法访问的解决办法[通俗易懂]问题描述  最近在研究pythonweb框架,用的是以前学python的时候用的Pycharm社区版(无力吐槽)。不太好用,就想去下个企业版用用,结果出现这种情况。。。  emmm,检查了网络没问题,换了个浏览器也是无法访问,最后辗转多个论坛发现似乎是因为hosts文件的问题。模糊的记得我好像激活成功教程过这个软件修改了一下hosts文件,改回来就可以访问Pycharm官网了。解决办法  Wi…

    2022年8月26日
  • Java之父:C语言是撑起一切的基石[通俗易懂]

    Java之父:C语言是撑起一切的基石[通俗易懂]为了忘却的纪念:无论任何领域,伟大的人物,永远不死!2011年10月9日,患有前列腺癌和心脏病的C语言之父丹尼斯·里奇离世。不知不觉,这位伟大的程序员已经离开我们已经有6年了。有人曾说,没有C语言之父,就没有乔布斯。C语言之父影响力其实不止这些。毫不夸张的说,没有C语言之父,就没有微软的Windows10和SurfaceBook,也没有安卓智能手机

    2022年7月8日
  • csv文件格式说明[通俗易懂]

    csv文件格式说明[通俗易懂]csv文件应用很广泛,历史也很悠久。有很多种类型的csv格式,常用的是rfc4180定义的格式。csv文件包含一行或多行记录,每行记录中包含一个或多个字段。记录与记录之间使用换行符分隔,最后一个记

    2022年8月6日
  • CSS3选择器详解

    CSS3选择器详解一、CSS3选择器分类1.基本选择器2.层次选择器3.伪类选择器1)动态伪类选择器2)目标伪类选择器3)语言伪类选择器4)UI元素状态伪类选择器5)结构伪类选择器6)否定伪类选择器4.伪元素5.属性选择器二、基本选择器语法这里着重说一下群组选择器(selector1,selector2,…,selec

    2022年7月27日
  • 风讯.NET与NETCMS的选择—开源.NET内容管理系统

    风讯.NET与NETCMS的选择—开源.NET内容管理系统最近想要学习做一个网站,本来在某公司实习的时候,boss就要求快速的建立一个非盈利性的门户站点,当时用的是动易的SiteFactory3.0版本,感觉用起来也是很不错的,尤其是后台的可视化编缉做得是相当的到位,内容的采集部分也是很好使,初学者只要是不太笨的基本上就可以快速建立起一个功能比较好的站点了,不过令人没想到的是,建立好站点好以后才真的是恶梦的开始,boss提出要求,对它进行二次的开发,基…

    2022年9月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号