51单片机控制步进电机正反转

通过51单片机驱动步进电机

proteus模拟

proteus仿真
电机内部数据参数,初始的即可,不用调改。
整体程序的结果:
(1)先正转一圈,等待一秒后再反转一圈。这一过程可以自己修改程序,把它去掉,即整体main函数while循环的前面那部分,只会执行一次。
while(1)
{
(2)按下按钮1,整个电机开始正转N圈,当检测按钮一直按下时,整个电机就一直正转下去。当检测到其他按钮按下时,立即跳转到其他按钮对应的程序。
(3)按下按钮2,和按钮1相反。
(4)按钮3,使整个电机停止工作。
}
上面2,3,4部分是一直在循环扫描检测的。

程序代码
#include <reg52.h>
#include <intrins.h>
unsigned char code z[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03//315,270,225......360(0)
};//八拍
unsigned char code f[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03//45,90,145......360(0)
};
sbit K1 = P3^0;//定义正转按钮
sbit K2 = P3^1;//定义反转按钮
sbit K3 = P3^2;//定义停止按钮
void zz(unsigned char n);
void fz(unsigned char n);
void delay();
void step();
void main()
{
	unsigned char N = 1;//由于设定好了转一圈的数据,所以N在此设定为转多少圈。
	TMOD=0X10;
	TL1=0XF0;
	TH1=0XD8;
	EA=0;
	ET1=0;//这里没有使用定时器中断,这里只是使用定时器的定时功能。
	
	zz(N);
	delay();
    fz(N);
	while(1)
	{
	 	if(K1 == 0)
		{
			while(1)
			{
				P0 = 0xfe;
				zz(N);
				if(K3 == 0||K2==0) break;
			}
		}
		else if(K2 == 0)
		{
			while(1)
			{
				P0 = 0xfd;
				fz(N);
				if(K3 == 0||K1==0) break;
			}
		}
		else
		{
			P0 = 0xfb;
			P1 = 0x03;
		}
	}
}
void zz(unsigned char n)//正转
{
 	unsigned char i,j;
	for(i=0;i<n;i++)
	{
	 	for(j=0;j<8;j++)//整个for循环,正转一个步距角,因为四相八拍,所以是半个步距角,即半步。
		{
		 	if(K3 == 0)	break;
			P1 = z[j];
			step();
		}
	}
}
void fz(unsigned char n)//反转
{
 	unsigned char i,j;
	for(i=0;i<n;i++)
	{
	 	for(j=0;j<8;j++)
		{
		 	if(K3 == 0)	break;
			P1 = f[j];
			step();
		}
	}
}
void delay()//定义1s
{
	unsigned char i,j,k;
	_nop_();
	i=8;
	j=154;
	k=122;
	do
	{
	 do
	 {
		 while(--k);
		}while(--j);
	}while(--i);
}
void step()//定时器计时10ms
{
	TF1=0;
	TR1=1;
	while(TF1==0);
	TR1=0;
	TL1=0XF0;
	TH1=0XD8;
}
关于一些实验过程中的说法

1.程序中用到的延时,这个根据自己的习惯,可以写相对应的函数延时,但是由于电机转的过程中的延时,就我上文中for循环里面的定时10ms,这个是根据实际情况来调的,理论上来说,使用proteus仿真的电机延时最低是1ms,如果低于1ms实验起来,不会看到自己编写代码的理想结果。
2.步距角的不同,那么想要电机转一圈,执行zz或者fz函数的参数就要有所不同。以我上面程序为例。
八拍转一个循环,转过360度,步距角是90°。
那么步距角是45°时,要想转过360°,那么就需要16拍。
这里需要各位自己去修改程序去实验,这里只提供一个提醒。如果超过256拍的话,那么unsigned char是不够你玩的,需要unsigned int。

版权声明:本文为CSDN博主「空 W 禹」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43627368/article/details/117189786

生成海报
点赞 0

空 W 禹

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

stm32——4、中断exti

这里是基于正点原子开发板的学习记录。 首先你要加入固件库 stm32f10x_exti.h 和 stm32f10x_exti.c 1、STM32中每个io口都可以作为外部中断的中断输入口。 2、STM32F103的中断控制器支持19个外部中断/