📄 motor.c
字号:
/////////////////////////////////////////////////////////////////////////////////////
// MCS51单片机作为主控制器组成一个双步进电机控制器 //
// 通过小键盘,能给定两台步进电机单独运行的速度,要求可供选择的步 //
// 进速度从60~600步/秒,可连续任意设置;通过直线差补算法能实时显 //
// 示所绘直线段的坐标,并能通过键盘设定新的终点参数,且步进电机能 //
// 正确运行到该点,回零后能快速回到始点。 //
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
#include<reg51.h> //51芯片管脚定义头文件
#include<stdio.h>
typedef unsigned char unchar;
sbit LED1=P2^0; //LED位选
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
unchar start=0; //启动键按下标志, 按下标志量变为一
unchar back=0; //回零键按下标志, 按下标志量变为一
unchar setX_F=0; //设置键X按下标志,按下标志量变为一
unchar setY_F=0; //设置键Y按下标志,按下标志量变为一
unchar set_add_F=0; //加一键按下标志, 按下标志量变为一
unchar set_sure_F=0; //确定键按下标志, 按下标志量变为一
unchar setX_Z=0; //设置X坐标键按下,按下标志量变为一
unchar setY_Z=0; //设置Y坐标键按下,按下标志量变为一
////////////////////////////////////////////////////////////////////////////////////////////////
//定义全局变量
///////////////////////////////////////////////////////////////////////////////////////////
unsigned int keytmp,tmp;
unsigned int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,p=0,t=0,u=0,r=0;
unsigned int speed=0,speed1=0,speed2=0;
unsigned int Xi=0,Yi=0;
unsigned int FX=0,FY=0;
unsigned int XE=0,YE=0,Nxy=0; //(X轴坐标,Y轴坐标,总部数)
int FM=0;
unsigned int flag=0,flagx=0,flagy=0;
unsigned int setX_value=0; // 当标志位为一时跳出设置X速度的循环
unsigned int setY_value=0; // 当标志位为一时跳出设置Y速度的循环
unsigned int setX_Z_value=0; // 当标志位为一时跳出设置X坐标的循环
unsigned int setY_Z_value=0; // 当标志位为一时跳出设置X坐标的循环
unsigned char code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //LED段选码
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
int time=0; //定时扫描键盘标志位
int time1=0;
int time2=0; //LED闪射时间
int timeF2=0; //LED闪射时间标志
/////////////////////////////////////////////////////////////////////////////////////////////
//声明函数
////////////////////////////////////////////////////////////////////////////////////////////
void Time0_initial();
void Time1_initial(); //定时器1初始化
void chabu(); //双步进电机差补运行
void runback(); //步进电机回零
void runX(); //电机X正向运行
void runY(); //电机Y正向运行
void control(); //速度,坐标设置控制
void displayxy(int,int); //LED显示(int-位选,int-段选)
void displayXY_data(int,int,int,int,int,int,int,int,int); //8位LED显示数据,第一个int代表LED1显示的
//数值,第二个int代表LED2显示的数值,*****
//第九个int代表是否屏蔽其中的位选,是否闪动.
//////////////////////////////////////////////////////////////////////////////
void dingshi1ms(int i) //延时10ms程序
{
time1=0;
while(1)
{
if(time1==i)
break;
}
}
/////////////////////////////////////////////
main() //主程序
{
P0=0x00;
P1=0;
P2=0xff;
P3=0x00;
TMOD=0x11;
TF1=0;
TF0=0;
Time0_initial();
Time1_initial();
ET0=1;
ET1=1;
EA=1;
while(1)
{
control();
}
}
void time0_initial()
{
TR0=0;
TF0=0;
TH0=0xfc;
TL0=0x17;
TR0=1;
}
///////////////////////////////////////////////
void time0_int(void) interrupt 1
{
time1+=1;
time0_initial();
}
void Time1_initial() //定时器1中断初始化定时50ms
{
TR1=0;
TF1=0;
TH1=0x3c;
TL1=0xaf;
TR1=1;
}
///////////////////////////////////////////////
//定时扫描键盘
////////////////////////////////////////////////
void time1_int(void) interrupt 3
{
time+=1;
time1+=1;
time2+=1;
if(time2<=4)
{timeF2=0;}
if(time2>4&&time2<8)
{timeF2=1;}
if(time2==8)
{ timeF2=0;
time2=0;
}
if(time==2)
{
P3=0x00;
P3=0x01; //第一行置零
tmp=P3;
keytmp=tmp&0xff;
if(keytmp!=0x01)
{
switch(keytmp)
{
case 0x11:
start=1; break;
case 0x21:
setX_F=1; break;
case 0x41:
setY_F=1; break;
case 0x81:
setX_Z=1; break;
default : break;
}
}
}
if(time==4)
{
P3=0x00;
P3=0x02; //第二行置零
tmp=P3;
keytmp=tmp&0xff;
if(keytmp!=0x02)
{
switch(keytmp)
{
case 0x12:
back=1; break;
case 0x22:
set_sure_F=1; break;
case 0x42:
set_add_F=1; break;
case 0x82:
setY_Z=1; break;
default : break;
}
}
time=0;
}
Time1_initial();
}
//////////////////////////////////////////////
//电机X轴正运行函数
//////////////////////////////////////////////
void runX(void)
{ int tt;
speed=(int)(3750/(a*100+b*10+c));
while(1)
{
P1=0x01;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
P1=0x03;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
P1=0x02;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
P1=0x06;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
P1=0x04;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
P1=0x0c;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
P1=0x08;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
P1=0x09;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
Xi+=1;Yi+=1;
if(set_sure_F==1) break;
}
}
/////////////////////////////////////////////
//电机Y正运行函数
/////////////////////////////////////////////
void runY(void)
{
int tt;
speed=(int)(3750/(d*100+e*10+f));
while(1)
{
P1=0x10;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
P1=0x30;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
P1=0x20;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
P1=0x60;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
P1=0x40;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
P1=0xc0;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
P1=0x80;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
P1=0x90;
tt=speed;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
Xi+=1;Yi+=1;
if(set_sure_F==1) break;
}
}
/////////////////////////////////////////////
///双步进电机差补运行
//////////////////////////////////////////////
void chabu(void)
{ int tt;
speed1=(int)(3750/(a*100+b*10+c));
speed2=(int)(3750/(d*100+e*10+f));
FM=0;
XE=g*100+h*10+p;
YE=t*100+u*10+r;
Nxy=XE+YE;
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
while(1)
{
if(FM>=0)
{
P1=0x01;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x03;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x02;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x06;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x04;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x0c;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x08;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x09;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
Xi+=1;
FM=FM-YE;
}
else if(FM<0)
{
P1=0x10;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x30;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x20;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x60;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x40;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0xc0;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x80;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x90;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
Yi+=1;
FM=FM+XE;
}
Nxy-=1;
if(Nxy==0) break;
}
}
///////////////////////////////////////////////
//步进电机回零函数
///////////////////////////////////////////////
void runback(void)
{
int tt;
speed1=(int)(3750/(a*100+b*10+c));
speed2=(int)(3750/(d*100+e*10+f));
FM=0;
XE=g*100+h*10+p;
YE=t*100+u*10+r;
Nxy=XE+YE;
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
while(1)
{
if(FM>=0)
{
P1=0x09;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x08;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x0c;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x04;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x06;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x02;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x02;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x01;
tt=speed1;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
Xi-=1;
FM=FM-YE;
}
else if(FM<0)
{
P1=0x90;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x80;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0xc0;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x40;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x60;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x20;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x30;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
P1=0x10;
tt=speed2;
while(tt--)
displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
Yi-=1;
FM=FM+XE;
}
Nxy-=1;
if(Nxy==0) break;
}
}
//////////////////////////////////////////////
///////////显示程序
/////////////////////////////////////////////
void displayxy(int i,int j)
{
P2=0xff;
if(i==0)
{ P2=0xff; P0=LED[j]; }
if(i==1)
{ LED1=0; P0=LED[j]; }
if(i==2)
{ LED2=0; P0=LED[j]; }
if(i==3)
{ LED3=0;P0=LED[j]; }
if(i==4)
{ LED4=0;P0=LED[j]; }
if(i==5)
{ LED5=0; P0=LED[j]; }
if(i==6)
{ LED6=0;P0=LED[j]; }
if(i==7)
{ LED7=0; P0=LED[j]; }
if(i==8)
{ LED8=0; P0=LED[j]; }
if(i==11)
{ LED1=1; P0=LED[j]; }
if(i==12)
{ LED2=1; P0=LED[j]; }
if(i==13)
{ LED3=1; P0=LED[j]; }
if(i==14)
{ LED4=1; P0=LED[j]; }
if(i==15)
{ LED5=1; P0=LED[j]; }
if(i==16)
{ LED6=1; P0=LED[j]; }
if(i==17)
{ LED7=1; P0=LED[j]; }
if(i==18)
{ LED8=1; P0=LED[j];}
}
////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
void displayXY_data(int i,int j,int k,int m,int x,int y,int z,int q,int n)
{
if(n==0)
{
displayxy(1,i);
dingshi1ms(2);
displayxy(2,j);
dingshi1ms(2);
displayxy(3,k);
dingshi1ms(2);
displayxy(4,m);
dingshi1ms(2);
displayxy(5,x);
dingshi1ms(2);
displayxy(6,y);
dingshi1ms(2);
displayxy(7,z);
dingshi1ms(2);
displayxy(8,q);
dingshi1ms(2);
}
////////////////////////////////////////////////
if(n==1)
{
displayxy(1,i);
dingshi1ms(2);
displayxy(2,j);
dingshi1ms(2);
displayxy(3,k);
dingshi1ms(2);
displayxy(4,m);
dingshi1ms(2);
displayxy(15,x);
dingshi1ms(2);
displayxy(16,y);
dingshi1ms(2);
displayxy(17,z);
dingshi1ms(2);
displayxy(18,q);
dingshi1ms(2);
}
/////////////////////////////////////////////
if(n==2)
{
displayxy(11,i);
dingshi1ms(2);
displayxy(12,j);
dingshi1ms(2);
displayxy(13,k);
dingshi1ms(2);
displayxy(14,m);
dingshi1ms(2);
displayxy(5,x);
dingshi1ms(2);
displayxy(6,y);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -