51单片机——可调速,多开关控制步进电机驱动

### ==这是一个基础的步进电机程序==

```
#include "reg52.h"

//电机IO
#define GPIO_MOTOR P1



unsigned char code FFW[8] = { 0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9 }; //反转顺序

void Delay(unsigned int t);
void  Motor();

void main(void)
{
	while (1)
	{
		Motor();
	}
}


void  Motor()
{
	unsigned char i;
	for (i = 0; i<8; i++)
	{
		GPIO_MOTOR = FFW[i] & 0x1f;  //取数据
		Delay(30);	//调节转速	
	}
}

void Delay(unsigned int t) //延时函数
{
	unsigned int k;
	while (t--)
	{
		for (k = 0; k<80; k++)
		{
		}
	}
}
```



### ==下面我们加点开关控制和传感器==
### # 事实上 ++按键的功能可以根据需要自己定制++
```

#include "reg51.h"

#define GPIO_MOTOR P1  //电机输出


#define speed_max 500	//电机转速
#define start_speed 300
#define speed_min 100


#define change_speed 20 //每次改变的速度


sbit K1 = P3 ^ 0;  //这些是可以使用的开关和按键
sbit K2 = P3 ^ 1;
sbit K3 = P3 ^ 2;
sbit K4 = P3 ^ 3;
sbit K5 = P3 ^ 4;
sbit K6 = P3 ^ 5;
sbit K0 = P3 ^ 6;

sbit senser_l= P2 ^ 0;  //外部传感器,用来检测运动的终点
sbit senser_r= P2 ^ 1;

bit end_l, end_r;		//用来存储传感器的值


//***以下定义控制步进电机转动数组,从0到7依次将信号发送给电机,可以使电机进行相应转动
unsigned char code FFW[8] = { 0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9 }; //反转
unsigned char code FFZ[8] = { 0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1 }; //正转


bit Direction;						//用于控制转向
bit roll;                          //转动总开关
unsigned char Speed;				//转速
void Delay(unsigned int t);			//延时函数
void  Motor();						//转动函数
void Stop();						  //刹车函数


void main(void)
{
	unsigned char i; //用来检测松手 可以认为没用
	Speed = start_speed;
	while (1)				//从这里开始循环
	{
		P3 = 0xff;			//对开关赋予高电平
							//从K1到K6依次检验开关是否被按下

		if (K1 == 0)		//如果K1按下,使其正转,即改变Direction=1。
		{
			Delay(1);		//消抖,下同
			if (K1 == 0)
			{
				Direction = 1;
			}
			while ((i<200) && (K1 == 0))	//松手 ,下同
			{
				Delay(1);
				i++;
			}
			i = 0;
		}
		if (K2 == 0)		//如果K2按下,使其反转,即改变Direction=0。
		{
			Delay(1);	
			if (K2 == 0)
			{
				Direction = 0;
			}
			while ((i<200) && (K2 == 0))	 
			{
				Delay(1);
				i++;
			}
			i = 0;
		}
		if (K3 == 0)		//如果K3按下,使其加速,即改变Speed。每次加一个change_speed.
		{
			Delay(1);	
			if (K3 == 0)
			{
				Speed +=change_speed;
				if (Speed > speed_max)
					Speed = speed_max;			//不允许超过最大速度
			}
			while ((i<200) && (K3 == 0))	 
			{
				Delay(1);
				i++;
			}
			i = 0;
		}
		if (K4 == 0)	//如果K4按下,使其减速,即改变Speed。每次减一个change_speed.
		{
			Delay(1);	
			if (K4 == 0)
			{
				Speed -=change_speed;
				if (Speed < speed_min)			//不允许超过最小速度值
					Speed = speed_min;
			}
			while ((i<200) && (K4 == 0))	
			{
				Delay(1);
				i++;
			}
			i = 0;
		}
		if (K5 == 0)	//自动正转,直到传感器检测到到达终点后停止,速度为auto_speed.
		{
			Delay(1);
			if (K5 == 0)
			{
				Speed = start_speed;
				Direction = 1;
			}
				while ((i < 200) && (K4 == 0))
				{
					Delay(1);
					i++;
				}
				i = 0;
		}
		if (K6 == 0)	//自动反转,直到传感器检测到到达终点后停止,速度为auto_speed.
		{
				Delay(1);
				if (K6 == 0)
				{
					Speed = start_speed;
					Direction = 0;
				}
				while ((i < 200) && (K4 == 0))
				{
					Delay(1);
					i++;
				}
				i = 0;
		}
		if (K0 == 0)		//总开关 如果K0按下,改变roll,即对其取反。
		{
			Delay(1);
			if (K0 == 0)
			{
				roll= ~roll;
			}
			while ((i<200) && (K2 == 0))
			{
				Delay(1);
				i++;
			}
			i = 0;
		}
		if (roll)		//roll 为真时 执行转动函数

			Motor();
		else
			Stop();
	}
}


void  Motor()
{
	unsigned char i;
	for (i = 0; i<8; i++)
	{
		
		if (Direction == 1)
			if (!end_r)			// 传感器检测到右侧边界 禁止右转
			{
				Stop();
				break;
			}
			else
			{
				GPIO_MOTOR = FFW[i] & 0x1f;
			
			}
		else
			if (!end_l)			//传感器检测到左侧侧边界 禁止左转
			{
				Stop();
				break;
			}
			else
			{
				GPIO_MOTOR = FFZ[i] & 0x1f;
			
			}
		Delay(Speed);	//调节转速	
		
		
		senser_l = 1; //拉高传感器电平重新检测
		senser_r = 1;				
		
		//如果传感器电平被拉低,认为已经到了某侧边界
		if (!senser_l || !senser_r)
		{
			Stop();	//赶紧刹车!!!
			if (!senser_l)
			{
				end_l = 0;
			}
			if (!senser_r)
			{
				end_r = 0;
			}

		}
	}
}

void Delay(unsigned int t)
{
	unsigned int k;
	while (t--)
	{
		for (k = 0; k<80; k++)
		{
		}
	}
}
void Stop()
{
	GPIO_MOTOR =  0x1f;
	
}




```


你可能感兴趣的:(51单片机——可调速,多开关控制步进电机驱动)