导航:首页 > 操作系统 > 单片机控制两个步进电机

单片机控制两个步进电机

发布时间:2022-11-08 06:46:08

1. 求51单片机同时控制两个步进电机的C程序

限于篇幅,程序省去 按键子程序 延时子程序 液晶初始化及相关程序、字符部分
#include<reg52.h>
#include<intrins.h>
#define mode 0x81 // 方式0,A口、B口输出,C口高4位输出,低4位输入
# include "stdio.h"
# include "string.h"
# include "math.h"

xdata unsigned char PA _at_ 0x7f00;
xdata unsigned char PB _at_ 0x7f01;
xdata unsigned char PC _at_ 0x7f02;
xdata unsigned char caas _at_ 0x7f03; //控制字
sbit P32=P3^2;
sbit P33=P3^3;
sbit P35=P3^5;
#define uchar unsigned char
#define uint unsigned int
unsigned char h,Pos ;
unsigned int R,NX,NY;
unsigned char key;

code unsigned char KeyTable[] = { // 键码定义
0x0f, 0x0b, 0x07, 0x03,
0x0e, 0x0a, 0x06, 0x02,
0x0d, 0x09, 0x05, 0x01,
0x0c, 0x08, 0x04, 0x00
};

code unsigned char LEDMAP[] = { // 八段管显示码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};

unsigned char Code_ ; // 字符代码寄存器

#define PD1 61 // 122/2 分成左右两半屏(122x32)

unsigned char Column;
unsigned char Page_ ; // 页地址寄存器 D1,DO:页地址
unsigned char Code_ ; // 字符代码寄存器

unsigned char Command; // 指令寄存器
unsigned char LCDData; // 数据寄存器

xdata unsigned char CWADD1 _at_ 0x1cff; // 写指令代码地址(E1)
xdata unsigned char DWADD1 _at_ 0x1eff; // 写显示数据地址(E1)
xdata unsigned char CRADD1 _at_ 0x1dff; // 读状态字地址(E1)
xdata unsigned char DRADD1 _at_ 0x1fff; // 读显示数据地址(E1)

xdata unsigned char CWADD2 _at_ 0x3cff; // 写指令代码地址(E2)
xdata unsigned char DWADD2 _at_ 0x3eff; // 写显示数进地址(E2)
xdata unsigned char CRADD2 _at_ 0x3dff; // 读状态字地址(E2)
xdata unsigned char DRADD2 _at_ 0x3fff; // 读显示数据地址(E2)

//----------------------液晶-----------------

// 清屏

// ************************ 中文显示程序 ***********************************/

/*************************直线 插 补***************************8*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}

void zhengx()
{
PA=0x00;
delay(10);
PA=0x01;
delay(10);

}
void fux()
{
PA=0x02;
delay(10);
PA=0x03;
delay(10);

}
void zhengy()
{
PB=0x00;
delay(10);
PB=0x10;
delay(10);

}
void fuy()
{
PB=0x20;
delay(10);
PB=0x30;
delay(10);

}
void xian(int NX,int NY)
{int FM, NXY, XOY,ZF,z;
FM=0;
{if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}

for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)
{ {if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}

for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0;NXY--)
{ if(FM>=0)
{if(XOY==1||XOY==4)

{ZF=1;
zhengx();
}
else
{ZF=2;
fux();

}
FM=FM-fabs(NY);
}
else
{if(XOY==1||XOY==2)
{
ZF=3;
zhengy();

}
else
{ZF=4;
fuy();
}
FM=FM+fabs(NX);
}

}
for(z=0;z<200;z++)
{P35 = 0;
delay(10);
P35 = 1;
delay(10);
}

}
}

/*************************圆 弧 插 补***************************8*/
void yuanhu1( int X0,int Y0, int NX, int NY ,int RNS )
{
int NXY,BS,ZF,XM,YM,z;
int FM=0;
BS=fabs(NX-X0) + fabs(NY-Y0);
XM=fabs(X0);
YM=fabs(Y0);
for(NXY= fabs(NX-X0) + fabs(NY-Y0)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)
{
if(RNS==1||RNS==3||RNS==6||RNS==8)

{
if(FM<0)
{
if(RNS==1||RNS==8)

{ZF=1;
zhengx();

}
else

{ZF=2;
fux();}

FM=FM+2*fabs(XM)+1;
XM=XM+1;

}

else
{
if(RNS==1||RNS==6)
{
ZF=3;
fuy();
}
else

{ZF=4;
zhengy();
}

FM=FM-2*fabs(YM)+1;
YM=YM-1;
}
}
else
if(FM>=0)
{
if(RNS==2||RNS==7)

{ZF=1;
zhengx();
}
else

{ZF=2;
fux();
}

FM=FM-2*fabs(XM)+1;
XM=XM-1;
}
else
{
if(RNS==2||RNS==5)
{ZF=3;
zhengy();}
else
{ZF=4;
fuy();}
FM=FM+2*fabs(YM)+1;
YM=YM+1;
}
}
if(P32==0||P33==0)
{
for(z=0;z<200;z++)
{P35 = 0;
delay(10);
P35 = 1;
delay(10);
}
}

}
int shu1 ()
{
int i=0,j=0,k=3;
while (1)
{
if(testkey())
{ delay(300);
delay1();
if(testkey())
{ j=getkey();
if(j!=14)
{i=i*10 + j;
k--;}
}}
if(k==0)
break;
}
return i;
}
int shu2 ()
{
int i=0,j=0,k=3;
while (1)
{
if(testkey())
{ delay(300);
delay1();
if(testkey())
{ j=getkey();
if(j!=14)
{i=i*10 + j;
k--;}
}}
if(k==0)
break;
}
return i;
}

void yuanhuchabu1()
{ int q=0;
delay(300);
R=shu1();
yj1();

q=R/100;
Page_ = 0x00;
Column = 0x35;
Code_ = q;
WriteCHN8x16();

q=R%100;
q=q/10;
Page_ = 0x00;
Column = 0x40;
Code_ = q;
WriteCHN8x16();

q=R%10;
Page_ = 0x00;
Column = 0x48;
Code_ = q;
WriteCHN8x16();

yuanhu1(R,0,0,R,5);
yuanhu1(0,R,-R,0,6);
yuanhu1(-R,0,0,-R,7);
yuanhu1(0,-R,R,0,8);
}
void yuanhuchabu2()
{ int q=0;
delay(300);
R=shu1();
yj1();

q=R/100;
Page_ = 0x00;
Column = 0x35;
Code_ = q;
WriteCHN8x16();

q=R%100;
q=q/10;
Page_ = 0x00;
Column = 0x40;
Code_ = q;
WriteCHN8x16();

q=R%10;
Page_ = 0x00;
Column = 0x48;
Code_ = q;
WriteCHN8x16();

yuanhu1(0,R,R,0,1);
yuanhu1(R,0,0,-R,4);
yuanhu1(0,-R,-R,0,3);
yuanhu1(-R,0,0,R,2);
}
void xianchabu()
{ int q1=0,q2=0;
delay(300);
NX=shu1();
delay(300);
NY=shu2();
yj2();

Page_ = 0x00;
Column = 0x25;
Code_ = 0x10;
WriteCHN8x16();

q1=NX/100;
Page_ = 0x00;
Column = 0x30;
Code_ = q1;
WriteCHN8x16();

q1=NX%100;
q1=q1/10;
Page_ = 0x00;
Column = 0x37;
Code_ = q1;
WriteCHN8x16();

q1=NX%10;
Page_ = 0x00;
Column = 0x40;
Code_ = q1;
WriteCHN8x16();

q2=NY/100;
Page_ = 0x00;
Column = 0x50;
Code_ =q1;
WriteCHN8x16();

q2=NY%100;
q2=q2/10;
Page_ = 0x00;
Column = 0x58;
Code_ = q2;
WriteCHN8x16();

q2=NY%10;
Page_ = 0x00;
Column = 0x60;
Code_ = q2;
WriteCHN8x16();

Page_ = 0x00;
Column = 0x72;
Code_ = 0x11;
WriteCHN8x16();
xian(NX,NY );
}

void main()

{ int q=0,q1=0,q2=0;
caas=mode;
PA=0X00;
PB=0X00;
PC=0x00;
R=0X00;

while(1)
{
if(testkey())
{
delay1();
if(testKey())
{ delay1();
if(getkey()==15)
{
delay(300);
yuanhuchabu1();
}
else if(getkey()==10)
{ delay(300);
yuanhuchabu2();
}
else if(getkey()==13)
{
xianchabu();
}
else if(getkey()==1)
{
zhengx();
}
else if(getkey()==2)
{
fux();
}
else if(getkey()==3)
{
zhengy();
} else if(getkey()==4)
{
fuy();
}

}
}
if(GetKey()==12)
{ break;}
}

}

2. 我想用51单片机单独控制两台步进电机,实现一台电机停,一台电机转和两台电机同时转,可以么课设用

如果有驱动器的话,步进电机的控制一台只需要两个信号即CW(正转)和CCW(反转)信号就OK了,或者PAUSE(脉冲)+DIR(方向),因此控制两台步进电机只需要4路信号即可,所以任意实验板都可以达到,当然买最便宜的了。

3. 如何用单片机编程控制一个单相电机和两个步进电机间歇运行 ...

你说的单片机加上相应的驱动放大电路就是一个控制器了。不知道你对单相电机速度有没有要求,用单片机控制它,是不是只做开关控制?你要说清楚。两个步进电机可以用PWM波来控制,驱动放大电路可用一个移位器和普通的步进电机来实现。然后做间歇运动的话,可以用单片机里的定时器和中断来实现,这个不难。

4. 单片机如何控制两个步进电机同步

根据我的实战经验,不要用同一路输出,这样在实际运用过程中万一一台失步你将如何是好?为了确保良好同步,其一两台步进电机型号相同、驱动器型号相同、细分数相同,其二独立的原点信号,其三每做完一个循环时间允许的情况下各自找一次“原点”,其三正常运行过程中两路方向信号和脉冲性号在同一语句里发出。如果你严格做到上述三点,同步就不是问题!

5. 用单片机控制两台步进电机能做到吗

可以做到啊,你所说的一样速度,指的是角速度还是线速度?所说的两台电机,是已经在水平方向和30°方向了还是需要一个运动到30°方向?角速度比较好办,一个脉冲同时驱动两个电机转动就是了,如果是线速度,在机械上做下调整最省事,不过也可以调整两个电机的转动速度,这个主要在程序上调整就好了。

6. 用单片机控制两台步进电机能做到吗

用单片机控制两台步进电机,要求一台是水平方向,一台30度角方向,两台在水平方向的速度要一致,请问能不能做到?

7. 怎么用一个单片机控制多个步进电机

用单片机同时是不可能的,当然,时间间隔小到可以接受,跑几个任务,那也可以视为同时。要实现真正意义上的同时,用FPGA/CPLD是可以完成的。 话说回来,也许你的同时并不是说一定严格地同时工作,只是说一个单片机去控制四个步进电机,那就好办多了。 一个步进电机,比如四相5线那种,四个IO口可控制一个,四个步进电机就要一陆个,驱动芯片用ULN二00三即可。 当然,如果你的IO口不允许使用这么多,那也可以通过串转并的方法,扩展IO口,比如用漆四HC595,三根IO口控制它,它可以级联,三根线可以控制很多片。一片为吧位,两片就为一陆位,三片为二四位 …… 只要加些三极管驱动那三根控制线,三个IO口可控制一串级联的漆四HC595,得到的扩展IO口,那是相当多的。我用三个IO口控制过5片漆四HC595,三个IO口一下子就扩展成了四0个IO口!!

8. 一个AT89C52单片机怎么控制两个步进电机驱动器,从而驱动两个步进电机,实现不同动作

一个单片机控制八个LED,形成各种花样的流水灯,实例程序很常见。

这个,要比控制两个电机复杂多了。 道理是相同的,都是程序控制。

9. 一个51单片机同时控制2个步进电机的C语言程序

#include<reg52.h>
#include<intrins.h>
#define mode 0x81 // 方式0,A口、B口输出,C口高4位输出,低4位输入
# include "stdio.h"
# include "string.h"
# include "math.h"

xdata unsigned char PA _at_ 0x7f00;
xdata unsigned char PB _at_ 0x7f01;
xdata unsigned char PC _at_ 0x7f02;
xdata unsigned char caas _at_ 0x7f03; //控制字
sbit P32=P3^2;
sbit P33=P3^3;
sbit P35=P3^5;
#define uchar unsigned char
#define uint unsigned int
unsigned char h,Pos ;
unsigned int R,NX,NY;
unsigned char key;

code unsigned char KeyTable[] = { // 键码定义
0x0f, 0x0b, 0x07, 0x03,
0x0e, 0x0a, 0x06, 0x02,
0x0d, 0x09, 0x05, 0x01,
0x0c, 0x08, 0x04, 0x00
};

code unsigned char LEDMAP[] = { // 八段管显示码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};

unsigned char Code_ ; // 字符代码寄存器

#define PD1 61 // 122/2 分成左右两半屏(122x32)

unsigned char Column;
unsigned char Page_ ; // 页地址寄存器 D1,DO:页地址
unsigned char Code_ ; // 字符代码寄存器

unsigned char Command; // 指令寄存器
unsigned char LCDData; // 数据寄存器

xdata unsigned char CWADD1 _at_ 0x1cff; // 写指令代码地址(E1)
xdata unsigned char DWADD1 _at_ 0x1eff; // 写显示数据地址(E1)
xdata unsigned char CRADD1 _at_ 0x1dff; // 读状态字地址(E1)
xdata unsigned char DRADD1 _at_ 0x1fff; // 读显示数据地址(E1)

xdata unsigned char CWADD2 _at_ 0x3cff; // 写指令代码地址(E2)
xdata unsigned char DWADD2 _at_ 0x3eff; // 写显示数进地址(E2)
xdata unsigned char CRADD2 _at_ 0x3dff; // 读状态字地址(E2)
xdata unsigned char DRADD2 _at_ 0x3fff; // 读显示数据地址(E2)

//----------------------液晶-----------------

// 清屏

// ************************ 中文显示程序 ***********************************/

/*************************直线 插 补***************************8*/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}

void zhengx()
{
PA=0x00;
delay(10);
PA=0x01;
delay(10);

}
void fux()
{
PA=0x02;
delay(10);
PA=0x03;
delay(10);

}
void zhengy()
{
PB=0x00;
delay(10);
PB=0x10;
delay(10);

}
void fuy()
{
PB=0x20;
delay(10);
PB=0x30;
delay(10);

}
void xian(int NX,int NY)
{int FM, NXY, XOY,ZF,z;
FM=0;
{if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}

for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)
{ {if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}

for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0;NXY--)
{ if(FM>=0)
{if(XOY==1||XOY==4)

{ZF=1;
zhengx();
}
else
{ZF=2;
fux();

}
FM=FM-fabs(NY);
}
else
{if(XOY==1||XOY==2)
{
ZF=3;
zhengy();

}
else
{ZF=4;
fuy();
}
FM=FM+fabs(NX);
}

}
for(z=0;z<200;z++)
{P35 = 0;
delay(10);
P35 = 1;
delay(10);
}

}
}

/*************************圆 弧 插 补***************************8*/
void yuanhu1( int X0,int Y0, int NX, int NY ,int RNS )
{
int NXY,BS,ZF,XM,YM,z;
int FM=0;
BS=fabs(NX-X0) + fabs(NY-Y0);
XM=fabs(X0);
YM=fabs(Y0);
for(NXY= fabs(NX-X0) + fabs(NY-Y0)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)
{
if(RNS==1||RNS==3||RNS==6||RNS==8)

{
if(FM<0)
{
if(RNS==1||RNS==8)

{ZF=1;
zhengx();

}
else

{ZF=2;
fux();}

FM=FM+2*fabs(XM)+1;
XM=XM+1;

}

else
{
if(RNS==1||RNS==6)
{
ZF=3;
fuy();
}
else

{ZF=4;
zhengy();
}

FM=FM-2*fabs(YM)+1;
YM=YM-1;
}
}
else
if(FM>=0)
{
if(RNS==2||RNS==7)

{ZF=1;
zhengx();
}
else

{ZF=2;
fux();
}

FM=FM-2*fabs(XM)+1;
XM=XM-1;
}
else
{
if(RNS==2||RNS==5)
{ZF=3;
zhengy();}
else
{ZF=4;
fuy();}
FM=FM+2*fabs(YM)+1;
YM=YM+1;
}
}
if(P32==0||P33==0)
{
for(z=0;z<200;z++)
{P35 = 0;
delay(10);
P35 = 1;
delay(10);
}
}

}
int shu1 ()
{
int i=0,j=0,k=3;
while (1)
{
if(testkey())
{ delay(300);
delay1();
if(testkey())
{ j=getkey();
if(j!=14)
{i=i*10 + j;
k--;}
}}
if(k==0)
break;
}
return i;
}
int shu2 ()
{
int i=0,j=0,k=3;
while (1)
{
if(testkey())
{ delay(300);
delay1();
if(testkey())
{ j=getkey();
if(j!=14)
{i=i*10 + j;
k--;}
}}
if(k==0)
break;
}
return i;
}

void yuanhuchabu1()
{ int q=0;
delay(300);
R=shu1();
yj1();

q=R/100;
Page_ = 0x00;
Column = 0x35;
Code_ = q;
WriteCHN8x16();

q=R%100;
q=q/10;
Page_ = 0x00;
Column = 0x40;
Code_ = q;
WriteCHN8x16();

q=R%10;
Page_ = 0x00;
Column = 0x48;
Code_ = q;
WriteCHN8x16();

yuanhu1(R,0,0,R,5);
yuanhu1(0,R,-R,0,6);
yuanhu1(-R,0,0,-R,7);
yuanhu1(0,-R,R,0,8);
}
void yuanhuchabu2()
{ int q=0;
delay(300);
R=shu1();
yj1();

q=R/100;
Page_ = 0x00;
Column = 0x35;
Code_ = q;
WriteCHN8x16();

q=R%100;
q=q/10;
Page_ = 0x00;
Column = 0x40;
Code_ = q;
WriteCHN8x16();

q=R%10;
Page_ = 0x00;
Column = 0x48;
Code_ = q;
WriteCHN8x16();

yuanhu1(0,R,R,0,1);
yuanhu1(R,0,0,-R,4);
yuanhu1(0,-R,-R,0,3);
yuanhu1(-R,0,0,R,2);
}
void xianchabu()
{ int q1=0,q2=0;
delay(300);
NX=shu1();
delay(300);
NY=shu2();
yj2();

Page_ = 0x00;
Column = 0x25;
Code_ = 0x10;
WriteCHN8x16();

q1=NX/100;
Page_ = 0x00;
Column = 0x30;
Code_ = q1;
WriteCHN8x16();

q1=NX%100;
q1=q1/10;
Page_ = 0x00;
Column = 0x37;
Code_ = q1;
WriteCHN8x16();

q1=NX%10;
Page_ = 0x00;
Column = 0x40;
Code_ = q1;
WriteCHN8x16();

q2=NY/100;
Page_ = 0x00;
Column = 0x50;
Code_ =q1;
WriteCHN8x16();

q2=NY%100;
q2=q2/10;
Page_ = 0x00;
Column = 0x58;
Code_ = q2;
WriteCHN8x16();

q2=NY%10;
Page_ = 0x00;
Column = 0x60;
Code_ = q2;
WriteCHN8x16();

Page_ = 0x00;
Column = 0x72;
Code_ = 0x11;
WriteCHN8x16();
xian(NX,NY );
}

void main()

{ int q=0,q1=0,q2=0;
caas=mode;
PA=0X00;
PB=0X00;
PC=0x00;
R=0X00;

while(1)
{
if(testkey())
{
delay1();
if(testKey())
{ delay1();
if(getkey()==15)
{
delay(300);
yuanhuchabu1();
}
else if(getkey()==10)
{ delay(300);
yuanhuchabu2();
}
else if(getkey()==13)
{
xianchabu();
}
else if(getkey()==1)
{
zhengx();
}
else if(getkey()==2)
{
fux();
}
else if(getkey()==3)
{
zhengy();
} else if(getkey()==4)
{
fuy();
}

}
}
if(GetKey()==12)
{ break;}
}

}

阅读全文

与单片机控制两个步进电机相关的资料

热点内容
dvd光盘存储汉子算法 浏览:758
苹果邮件无法连接服务器地址 浏览:963
phpffmpeg转码 浏览:672
长沙好玩的解压项目 浏览:145
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:737
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:486
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:383
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:350
风翼app为什么进不去了 浏览:779
im4java压缩图片 浏览:362
数据查询网站源码 浏览:151
伊克塞尔文档怎么进行加密 浏览:893
app转账是什么 浏览:163