51单片机控制步进电机课设

51单片机控制步进电机课设步进电机正反转设计设计要求:设置开始、停止以及正反转键。转速以及转向由数码管显示。#include<reg52.h>/*步进电机正反转设计设计要求:设置开始、停止以及正反转键。转速以及转向由数码管显示。步距角=5.625°/64,其意思就是每64个脉冲步进电机就会转5.625度。转一圈的脉冲数为(360/5.625)*64=4096个脉冲计算发送4096/4个脉冲需要的时间t转速=1/t*4rad/s注意:这里由于实际开发板驱动能力不足及

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

步进电机正反转设计

设计要求:
设置开始、停止以及正反转键。转速以及转向由数码管显示。

#include <reg52.h>
/* 步进电机正反转设计 设计要求: 设置开始、停止以及正反转键。转速以及转向由数码管显示。 步距角=5.625°/64,其意思就是每64个脉冲步进电机就会转5.625度。 转一圈的脉冲数为 (360 / 5.625) * 64 = 4096 个脉冲 计算发送 4096/4 个脉冲需要的时间t 转速 = 1/t*4 rad/s 注意:这里由于实际开发板驱动能力不足及电机性能不够,在此显示转速的导数 即转一圈需要多少时间 单位s/rad */

/* 参考资料:https://www.bilibili.com/read/cv11379422/ https://blog.csdn.net/wuhenyouyuyouyu/article/details/51612073 https://blog.csdn.net/sdkdlwk/article/details/106573784 https://blog.csdn.net/weixin_54092701/article/details/113484193 */
#define uc unsigned
unsigned char code F_Rotation[8]={ 
   0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//正转表格
unsigned char code B_Rotation[8]={ 
   0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//反转表格 1000 1100 1011
uc code x[13]={ 
   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
				0x6f,0x80,0x00,0x40};  // 小数点 全隐 负号
int shumaguan[8]={ 
   0};	 // 第一位定义为mod 模式选择
//mod x x z . z z z
// mod 0 (停止)
// mod 1 (开始) k2 正转 k3 反转 k4 停止 
// mod 2 (开始) k2 加速 k3 减速 k4 停止
// C51 没有bool
bit is_action = 0; //是否开始旋转
bit correct = 1;   //1 正转 0 反转



int hz = 150;

sbit k1 = P3^1;	  //模式选择 按下时 mod+1
sbit k2 = P3^0;
sbit k3 = P3^2;	  
sbit k4 = P3^3;

sbit lsa = P2^2;
sbit lsb = P2^3;
sbit lsc = P2^4;


int num = 0; //计算发送的脉冲数
int time = 0;


int mod = 0;  
float zhuansu = 0;


void delayms(int xms)//延时
{ 
   
         unsigned int x,y;
         for(x=xms;x>0;x--)
                 for(y=110;y>0;y--);

}
void delay10um(int h) //延时10*h us
{ 
   
   while(h--);
}

// 数码管动态显示
void display()
{ 
   
	uc i;
	if(correct == 0) //反转
	{ 
   
		shumaguan[2] = 12;		//显示负号
	}
	else
	{ 
   
		shumaguan[2] = 11;
	}

	if(mod == 0)		  //停转
	{ 
   
		shumaguan[3] = 0;
		shumaguan[5] = 0;
		shumaguan[6] = 0;
		shumaguan[7] = 0;	
	}
	for(i=0;i<8;i++)
	{ 
   
		switch(7-i)
		{ 
   
			case (0): lsa=0,lsb=0;lsc=0;break;
			case (4): lsa=0,lsb=0;lsc=1;break;
			case (2): lsa=0,lsb=1;lsc=0;break;
			case (6): lsa=0,lsb=1;lsc=1;break;
			case (1): lsa=1,lsb=0;lsc=0;break;
			case (5): lsa=1,lsb=0;lsc=1;break;
			case (3): lsa=1,lsb=1;lsc=0;break;
			case (7): lsa=1,lsb=1;lsc=1;break;
		}
		P0=x[shumaguan[i]];
        delay10um(80);
        P0=0x00;
	}

}
//按键扫描函数
void scan()
{ 
   
	if(!(k1 & k2 & k3 & k4 ) )
	{ 
   
		delayms(10);
		if(!k1)
		{ 
   
			//mod +1
			mod = mod + 1 ;
			is_action = 1;
			if(mod == 3)
			{ 
   
				mod = 0;
			}
		}

		if(!k2)
		{ 
   
			is_action = 1;
			if(mod == 1)
			{ 
   
				//正转
				correct = 1;

			}
			if(mod == 2)
			{ 
   
				//加速
				hz = hz - 10 ;

			}
		}
		if(!k3)
		{ 
   
			if(mod == 1)
			{ 
   
				//反转
				correct = 0;

			}
			if(mod == 2)
			{ 
   
				//减速
				hz = hz + 10 ;

			}
		}
		if(!k4)
		{ 
   
			//stop!
			is_action = 0 ;
			mod = 0;
		}
	}
	while(!(k1 & k2 & k3 & k4 )) ;

   shumaguan[0] = mod ;
}


void motor_zheng(void)
{ 
   
  char i =0;
  for(i=0;i<8;i++)     
     { 
   
     P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格
	 num++;
     delay10um(hz);        //改变这个参数可以调整电机转速
	 }
}


void motor_fan(void)
{ 
   
	char i =0;
	for(i=0;i<8;i++)      
	 { 
   
	 P1=B_Rotation[i];  //输出对应的相 可以自行换成反转表格
	 num++;
	 delay10um(hz);        //改变这个参数可以调整电机转速
	 }
}

void xuanzhuan()
{ 
   

   if(correct == 1) //正转
   { 
   
	  motor_zheng();
   }
   if(correct == 0) //反转
   { 
   
	  motor_fan();
   }
}

//定时器0 初始化 用于精确计时
void tim0_init()
{ 
   
    TMOD=0x01;//1.模式设置,00000001,采用的是定时器0,工作与式1(M1=0,M0=1)。
    TH0=(65536-1000)/256;  //2.定时器设置,每隔1毫秒发起一次中断。
    TL0=(65536-1000)%256;
    ET0=1;                  //3.开定时器0中断
    EA = 1;                 //4.开总中断
    TR0=1;                  //5.打开定时器
}
void jiexi(float t)
{ 
   
	char ge=0,gef=0,shif=0,baif=0,qianf=0;


	ge = t ;		
	gef = (t-ge)*10;
	shif = (t*1000 - ge*1000- gef*100)/10;
	baif = t*1000 - ge*1000- gef*100-shif*10;

	shumaguan[3] = ge;
	shumaguan[5] = gef;														    
	shumaguan[6] = shif;
	shumaguan[7] = baif;
			
	
}



void main()
{ 
   
	tim0_init();
	shumaguan[4] = 10;	 
	shumaguan[1] = 11;
	while(1)
	{ 
   
		scan();
		display();
		if(is_action != 0)
		{ 
   
			xuanzhuan();
		}
		
	}


}
 





void timer_0() interrupt 1		//?
{ 
   
	
    TH0=(65536-1000)/256;  //进入中断要重新设置定时器处置,要注意。
    TL0=(65536-1000)%256;

	time++ ;  //1ms 进入一次中断 
	if(num == 1024)
	{ 
   
		num = 0;
		zhuansu =  4*time/1000.0;
		time = 0;
		jiexi(zhuansu);
	
	}   

}









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

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

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

相关推荐

  • 微信小程序累计访客数怎么查_小程序独立访客uv是什么

    微信小程序累计访客数怎么查_小程序独立访客uv是什么在小程序后台查看打开这里然后在这里查看,不过是昨天的数据当天的在下一天更新也可以登录后台顶部导航栏右侧将鼠标挺方在手机查看数据上方扫二维码即可查看还有都告诉了这么多了扫一扫下方小程序码支持一下,谢谢…

    2022年9月18日
  • Linux三剑客 grep sed awk 详细使用方法

    Linux三剑客 grep sed awk 详细使用方法Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。在说这三个命令前我们要插入一个小插曲就是“正则表达式”。一、正则表达式所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实…

    2022年7月11日
  • pycharm断点调试教程_pycharm怎么debug

    pycharm断点调试教程_pycharm怎么debug前言如果你不会用IDE开发工具的debug,你在调试代码的时候可能会用print输出去调试,那样效率比较低。我们可以用Pycharm的debug来调试,当然如果你用的Jetbranis的其他产品,操作方法也是一样的。Pycharm的Debug(1)开启debug的方式:右键debug项目 工具栏的甲壳虫(2)常用按钮图解debugger栏:stepover(单步调试)程序代码越过子函数,但子函数会执行,且不进入。 stepinto(进入)在单步执行时,遇到子函数就进入.

    2022年8月26日
  • 初中英语语法(008)-动词不定式

    初中英语语法(008)-动词不定式动词不定式动词不定式(台版叫不定词)是非限定动词,不受主词的人称和数的限制,一般由to+原形动词构成,有时可不带to或不可带to。动词不定式的“不定”主要体现在“身份”不定,也就意味着它在句子中所充当的成分不定。1、动词不定式可以充当哪些成分1、名词可以代替名词属性,所以也就可以充当主语,宾语,表语和补语。例如:(1)Tobuythingsinthismarketmu…

    2022年7月16日
  • J2EE架构师之路[转]

    J2EE架构师之路[转]
    不经意的回首,工作进入第五个年头了,发现走过了从Java程序员到J2EE架构师的历程。
    发现电脑上安装了各种各样的J2EE工具:JBuilder,WSAD,Eclipse,Rose,Together,Weblogic,Jtest,Optimizator,Mysql…
    发现电脑上保存了各种各样的OpenSource项目:Tomcat,JBoss,Ant,Hibernate,Spring,ibatis,Struts,Log4j,Lucene,MovableTyp

    2022年6月26日
  • 阿里云短信平台实现手机验证码登录_在线云短信验证码

    阿里云短信平台实现手机验证码登录_在线云短信验证码阿里云短信平台实现手机验证码登录首先创建一个工具类工具类AliyunMessageUtil代码如下所示:publicclassAliyunMessageUtil{ privatestaticfinalStringproduct=”Dysmsapi”; //产品域名,开发者无需替换 privatestaticfinalStringdomain=”dysmsapi.aliyuncs.com”; //此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)TOD

    2022年10月27日

发表回复

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

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