基于51单片机的步进电机运转系统自动(角度、速度、方向、暂停时间)原理图、流程图、物料清单、仿真图、源代码

基于51单片机的步进电机运转系统自动(角度、速度、方向、暂停时间)原理图、流程图、物料清单、仿真图、源代码

功能:
1、步进电机执行多个动作,每个动作包含角度、速度、方向、暂停时间等参数;
2、按钮功能:
(1)K1——选择动作编号
(2)K2——选择设置参数
(3)K3——设置模式时用作数值加功能。正常模式时启动单次运行
(4)K4——设置模式时用作数值减功能。正常模式时启动循环运行,再次按下就会停止运行
3、单次运行:只执行当前动作,比如电机以速度S左转90度,然后延时,最后停止。
循环运行:每个动作循环执行,动作1完成后,执行动作2,以此类推。

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
在这里插入图片描述

#include"reg51.h"
#include"intrins.h"
#include"i2c.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int

sbit k1=P2^4;  //下一组
sbit k2=P2^5;  //下一个
sbit k3=P2^6;  //加		运行
sbit k4=P2^7;  //减		连续/停止

sbit motor1=P1^0;
sbit motor2=P1^1;
sbit motor3=P1^2;
sbit motor4=P1^3;

sbit led=P3^7;

uint yanshi=100;//延时时间
uchar shu[5]={0,0,1,1,1};//工作数据.方向LR、速度1-10、角度0-180、暂停时间0-255
uchar disp1[]="1   L   sudu:1 "; //编号、方向、速度
uchar disp2[]=" Ang:010  T:100"; //角度、时间

uchar mode=0;//模式,设置/工作
uchar flag=0;//连续运行标志
//===================================================
void delay(uint i) //延时
{
	uint k,m;
	for(k=0;k<i;k++)
	{
		for(m=0;m<80;m++);
		if(!k4)
			break;
	}
}
void zheng()//正转一个步进角
{
	motor2=1;delay(yanshi);
	motor1=0;delay(yanshi);
	motor3=1;delay(yanshi);
	motor2=0;delay(yanshi);
	motor4=1;delay(yanshi);
	motor3=0;delay(yanshi);
	motor1=1;delay(yanshi);
	motor4=0;delay(yanshi);
}
void fan()//反转一个步进角
{
	motor4=1;delay(yanshi);
	motor1=0;delay(yanshi);
	motor3=1;delay(yanshi);
	motor4=0;delay(yanshi);
	motor2=1;delay(yanshi);
	motor3=0;delay(yanshi);
	motor1=1;delay(yanshi);
	motor2=0;delay(yanshi);
}
void zheng_one()//正转1度
{
	uint i;
	for(i=0;i<3;i++)
	{
		zheng();
	}
}
void fan_one()//反转1度
{
	uint i;
	for(i=0;i<3;i++)
	{
		fan();
	}
}
void zheng_n(uint i)//正转i度
{
	uint k;
	for(k=0;k<i;k++)
	{
		zheng_one();	
	}
}
void fan_n(uint i)//反转i度
{
	uint k;
	for(k=0;k<i;k++)
		fan_one();
}
//===============================================
void read_shu()//读取工作数据
{
	shu[1]=At24c02Read(4*shu[0]);
	shu[2]=At24c02Read(4*shu[0]+1);
	shu[3]=At24c02Read(4*shu[0]+2);
	shu[4]=At24c02Read(4*shu[0]+3);
}
void write_shu()//存储工作数据
{
	At24c02Write(4*shu[0],shu[1]);
	delay(10);
	At24c02Write(4*shu[0]+1,shu[2]);
	delay(10);
	At24c02Write(4*shu[0]+2,shu[3]);
	delay(10);
	At24c02Write(4*shu[0]+3,shu[4]);
	delay(10);
}
//===============================================
void run()//运行一次
{
	led=0;//点亮LED
	yanshi=50*shu[2];//速度
	if(shu[1])//方向
	{
		zheng_n(shu[3]);
	}
	else
	{
		fan_n(shu[3]);
	}
	delay(1000*shu[4]);//暂停
	led=1;//熄灭LED
}
//===============================================
void disp()//显示
{
	disp1[0]=shu[0]+0x30; //编号
	if(shu[1])//方向
		disp1[4]='R';
	else
		disp1[4]='L';
	disp1[13]=shu[2]/10+0x30;//速度
	disp1[14]=shu[2]%10+0x30;
	disp2[5]=shu[3]/100+0x30;//角度
	disp2[6]=shu[3]%100/10+0x30;
	disp2[7]=shu[3]%10+0x30;
	disp2[12]=shu[4]/100+0x30;//时间
	disp2[13]=shu[4]%100/10+0x30;
	disp2[14]=shu[4]%10+0x30;
	write_string(1,0,disp1);
	write_string(2,0,disp2);
}
//===============================================
void main()
{
	uchar i;	
	init_1602();
	P1=0xf1;//初始化步进电机
	for(i=0;i<9;i++)//初始化存储器
	{
	shu[0]=i;
	read_shu();
		if(shu[1]>2)
			shu[1]=0;
		if(shu[2]>10)
			shu[2]=1;
		if(shu[3]>180)
			shu[3]=1;
		write_shu();
	}
	shu[0]=0; //读取第一组数据
	read_shu();
	disp();//显示

	while(1)
	{		
		if(!k1)//下一组
		{
			if(shu[0]<8)	 //0-8组
			 	shu[0]++;
			else
				shu[0]=0;	
			read_shu();
			disp();//显示
			 while(!k1);
		}
		if(!k2)//下一个
		{
			if(mode<4)
				mode++;
			else
				mode=0;
			switch(mode)//方向LR、速度1-10、角度0-180、暂停时间0-255
			{
				case 0:disp2[9]=' ';write_shu();break;
				case 1:disp1[3]='!';break;
				case 2:disp1[7]='!';disp1[3]=' ';break;
				case 3:disp2[0]='!';disp1[7]=' ';break;
				case 4:disp2[9]='!';disp2[0]=' ';
			}
			write_string(1,0,disp1);
			write_string(2,0,disp2);
			while(!k2);
		}
		if(!k3)//加	   运行一次
		{
			switch(mode)
			{
				case 0:run();break;
				case 1:shu[1]=0;break;//方向
				case 2:
					if(shu[2]<10);
						shu[2]++;
					break;//速度
				case 3:
					if(shu[3]<180);//角度
						shu[3]++;
					break;
				case 4:
					shu[4]++;//时间
			}
			write_shu();
			disp();
			while(!k3);
		}
		//减	   连续运行模式
		if(!k4)
		{
			switch(mode)
			{
				case 0:flag=!flag;break;
				case 1:shu[1]=1;break;//方向
				case 2:
					if(shu[2]>1);
						shu[2]--;
					break;//速度
				case 3:
					if(shu[3]>1);//角度
						shu[3]--;break;
				case 4:
					shu[4]--;//时间
			}
			write_shu();
			disp();
			while(!k4);
		}
		if(flag)//连续运行
		{
			read_shu();
			disp();
			run();
			if(shu[0]<8)
				shu[0]++;
			else
				shu[0]=0;
		}
	}
}

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值