基于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;
}
}
}