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

作者&投稿:荆馥 (若有异议请与网页底部的电邮联系)
谁知道用一个51单片机控制两个步进电机,实现一个电机快转,同时另一个慢转的程序怎么写?~

PWM波,实现占空比不同,没有PWM的单片机可以用软件延时
PWM波:例如方波,是高电平很低电平时间相同,PWM波是高低电平时间不同,利用两个输出口控制两个电机。具体说起来挺多的,也不一定让你明白。
建议你去看PWM波的资料就行

#include
#include
#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 zhixian(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 shuzhi1 ()
{
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 shuzhi2 ()
{
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=shuzhi1();
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=shuzhi1();
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 zhixianchabu()
{ int q1=0,q2=0;
delay(300);
NX=shuzhi1();
delay(300);
NY=shuzhi2();
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();
zhixian(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)
{
zhixianchabu();
}
else if(getkey()==1)
{
zhengx();
}
else if(getkey()==2)
{
fux();
}
else if(getkey()==3)
{
zhengy();
} else if(getkey()==4)
{
fuy();
}

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

}

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

这个很简单的。一个单片机芯片(6块钱解决)+595芯片(根据步进电机的相数选择个数)+ULN2003芯片+一个按键(通过按键控制你的两个工作状态)+两个步进电机。我所说的办法是要自己搭电路,自己要有编程器。至于是什么编程器那就要看你用什么单片机芯片了。

虽然你没有说清楚电机转的速度 转的步数 以及两台机转的方式以及用在什么地方,但我还是可以说,行;一定行;特定行。以下基于最少钱,最少的工作量和玩玩而言。 一 ; 单片机最简电路一个(自己做),电机驱动两个(自己做),电机两个(买),二 单片机程序烧录器一个,(也可以借别人的或让别人烧一下) 三 猛修ASM语言或C语言五天,再了解一下相关的知识就OK了。总共花费(60元正)


急,用51单片机驱动直流电机,电机不工作
原因:1. 电源供电不足,电机可能上百毫安的电流把电压拉下来了。2. 继电器选型不对,电流太大,把电源拉下来了。3. 电机产生的电流对电源干扰太大,电源抖动厉害,mcu不停复位或者根本不能稳定工作.建议:51单独一个电源,电机一个电源

51单片机的3个定时器怎样使用?
51单片机只有T0,T1。52才有T2的。定时器设置方法:做定时用一般采用16位模式,也就是TMOD=0x11(10或01单独一个定时器的话),初值的计算是这样的:假设时间是X毫秒,晶振为YMhz,那么:THn=(65536-1000*X*Y\/12)\/256 TLn=(65536-1000*X*Y\/12)%256 之后就是TRn=1(开启定时器)ETn=1(开启...

51单片机的程序其他单片机可以用吗
1. MCS51内核的单片机程序不兼容非MCS51内核的单片机。2. 属于MCS51内核的不同型号单片机间,部分程序可能通用。3. 单片机内核的不同,导致存储区分配、寄存器地址等存在差异,编译器处理方式也不同。4. 移植MCS51单片机程序至其他单片机,通常需更换编程软件和编译环境。5. 修改底层代码,包括寄存器配置...

独立按键与51单片机相连为什么有的需要接电源,有的则不用?
一般不需接电源,将独立按键接于单片机IO管脚和地(电源负极)之间,让单片机管脚输出高电平,当有按键按下时,读得结果为低电平 如下图中 S2 S3 S4 如果想让平时读得为低电平,按键按下为高电平,需外接一下拉电阻(阻值小于10K),将单片机输出的高电平拉低,按键接于正电源和IO口之间,当按键按...

51单片机怎么用一个按键控制P0,P2顺序输出高电平
下面这个程序里面有你要的东西,自己找找。include"reg51.h"void delay(int n);sbit K1=P3^3; \/\/LED左移按键 sbit K2=P3^5; \/\/LED右移按键 sbit K3=P3^6; \/\/开启手动按键 sbit K4=P3^7; \/\/开启自动按键 bit mark1=0;bit mark2=0;unsigned char a,b,c,d;int x;v...

51单片机双机串行通信时能使用接在P3.0\/RXD,P3.1\/TXD 上的独立按键吗...
51单片机双机串行通信时,必须专用P3.0\/RXD,P3.1\/TXD ,这两个引脚上不允许有独立按键的,否则会影响通信。如果引脚实在不够用,就要控制好使用顺序,在用TXD脚上的按键时,就不能发送数据了。而RXD上最好不要有按键,因为不知道什么时候串口有数据接收,在按键的同时,恰好有数据,就无法接收了。

如何不用驱动器直接用51单片机控制伺服电机?
单片机的端口最多才能吸收20mA的电流,但是伺服电机的工作电流在100mA以上,怎么样?要不烧坏单片机,要不电机无法工作,所以才有驱动器的啊!你想用单片机控制MOS管之类的开关,再由MOS管驱动电机工作?这样当然可以。当然要保证电机转动的平稳,就对你的程序功底非常考验啦。

关于用51单片机通过可控硅来调光和过零检测问题的问题???求解,感激...
我用可控硅通过延时改变导通角来调压,可是过零检测电路单独检测时有100hz的信号,接到单片机外部中断0就检测不到信号了,怎么回事?源程序:#include<reg51.h>typedefunsignedcharun... 我用可控硅通过延时改变导通角来调压,可是过零检测电路单独检测时有100hz的信号,接到单片机外部中断0就检测不到信号了,怎么回事?

想制作机器人用51单片机可以吗
不能唉,51单片机的内存,处理速度都上不去,连个神经网络算法都运行不了,得32位的soc,最后是你编一个APP,然后通过手机控制机器人也可以的,这个嵌入式系统开发就剩好多事了,而且成本也最小,然后设计机器人机械部分于手机的互动

如何用51单片机做一个电子开关?大侠帮我写个程序?
\/\/你这一个程序挺简单的, 我使用循环扫描的办法#include<reg51.h>sbit kEy = P1^1;sbit oUt = P0^0;void Init(void){ kEy = 0; oUt = 0;}void Delay(void){ unsigned char a,b,c; for(a=10;a>0;a--) for(b=200;b>0;b--) for(c=120;c>0;c--);...

集贤县18026566657: 我想用51单片机单独控制两台步进电机,实现一台电机停,一台电机转和两台电机同时转,可以么?课设用
查哪怡安: 如果有驱动器的话,步进电机的控制一台只需要两个信号即CW(正转)和CCW(反转)信号就OK了,或者PAUSE(脉冲)+DIR(方向),因此控制两台步进电机只需要4路信号即可,所以任意实验板都可以达到,当然买最便宜的了.

集贤县18026566657: 需要用一个51单片机控制两个有变速功能的步进电机,怎么弄? -
查哪怡安: 单片机实现步进电机的变速控制可以用PWM来控制,通过改变输出脉冲宽度,改变速度.欢迎进一步咨询,谢谢采纳!!

集贤县18026566657: 用一片51单片机控制两个小功率两相四线步进电机,怎样实现两个电机各自加速减速不干拢另个电机正常运转? -
查哪怡安: 51单片机速度慢点,不用微步技术的话,速度也够用的,得配合中断,别说只两步进电机,就是四个到八个步进电机,也一样可以各不相干的正常运转,这个同步和实时不是绝对的,只要肉眼分辩不出来数据又不丢失就可以让为是同步和实时....

集贤县18026566657: 51单片机 如何利用一个口 控制两个步进电机,比如P3口第四位控制A,高四位控制B电机. -
查哪怡安: 将电机B的控制码,左移4位,和电机A的控制码做 或 运算,再把结果输出到P3口就可以

集贤县18026566657: 怎么用一个51单片机控制两个步进电机,实现一个电机快转,同时另一个慢转的程序怎么写 ...大神们帮帮忙 -
查哪怡安: PWM波,实现占空比不同,没有PWM的单片机可以用软件延时 PWM波:例如方波,是高电平很低电平时间相同,PWM波是高低电平时间不同,利用两个输出口控制两个电机.具体说起来挺多的,也不一定让你明白. 建议你去看PWM波的资料就行 查看原帖>>

集贤县18026566657: 想用51单片机控制两个步进电机画一个圆,有没有什么简单的指令,菜鸟求传授谢谢 -
查哪怡安: 没有.在数控机床上把这个过程叫做插补,如果要在51上实现这个功能的话需要自己写插补程序,常用的插补方法有逐点比较法和数字积分法,这个几句话说不清楚,随便找本数控原理的书就能看明白了.

集贤县18026566657: 我需要做一个智能小车,用51单片机控制,两个两相四线步进电机驱动,我该选择什么驱动芯片呢? -
查哪怡安: 两相4线步进电机,只能使用LM298,ULN2803和ULN2003都是NPN达林顿管,1个芯片无法组成H桥.再或者使用大功率三极管搭建2H桥来驱动也可以.我就没有用芯片,不过如果没有细分的话,电机比较抖.

集贤县18026566657: 如何用51单片机控制2个2相步进电机走圆形状 -
查哪怡安: 就是一个平面运动,一个步进电机走X轴,一个步进电机走Y轴,按x²+y²=r²走就好了.

集贤县18026566657: 51单片机如何控制两相四线步进电机 -
查哪怡安: #include#define uchar unsigned char#define uint unsigned int//-------------------------------- uchar step1[] = {0x05, 0x06, 0x0A, 0x09}; uchar stepx = 0;//-------------------------------- void zs(uint a) { while(a--); }//-------------------------------- void zheng(void) { P0 = ...

集贤县18026566657: 用单片机控制两台步进电机能做到吗? -
查哪怡安: 可以做到啊,你所说的一样速度,指的是角速度还是线速度?所说的两台电机,是已经在水平方向和30°方向了还是需要一个运动到30°方向?角速度比较好办,一个脉冲同时驱动两个电机转动就是了,如果是线速度,在机械上做下调整最省事,不过也可以调整两个电机的转动速度,这个主要在程序上调整就好了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网