单片机控制步进电机系统可用于电梯开发文档格式.docx
《单片机控制步进电机系统可用于电梯开发文档格式.docx》由会员分享,可在线阅读,更多相关《单片机控制步进电机系统可用于电梯开发文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![单片机控制步进电机系统可用于电梯开发文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/15/2da383b7-391e-4980-ac53-8153c73c50be/2da383b7-391e-4980-ac53-8153c73c50be1.gif)
。
),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。
),八拍(A-AB-B-BC-C-CD-D-DA-A。
)。
注意:
这款电机的减速比是1:
64,也就是说电机每次的步进角度为5.625/64度,步进角度很小,也使得电机转速很精准,非常适合细微控制。
通过控制单片机P1.0-P1.3来操作步进电机了,我们为了快速操作IO口,直接对P1进行赋值,而不是每位单独赋值。
参看上面的电机驱动表格,我们列出电机操作方法:
橙(P1.0)
黄(P1.1)
粉(P1.2)
蓝(P1.3)
十六制(P1口)
1
0xF1
0xF3
0xF2
0xF6
0xF4
0xFC
0xF8
0xF9
实验代码:
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitMC0=P3^0;
sbitMC1=P3^1;
sbitMC2=P3^2;
sbitMC3=P3^3;
sbitKeyIn1=P2^4;
sbitKeyIn2=P2^5;
sbitKeyIn3=P2^6;
sbitKeyIn4=P2^7;
sbitKeyOut1=P2^3;
sbitKeyOut2=P2^2;
sbitKeyOut3=P2^1;
sbitKeyOut4=P2^0;
sbitADDR0=P1^0;
sbitADDR1=P1^1;
sbitADDR2=P1^2;
sbitADDR3=P1^3;
sbitENLED=P1^4;
sbitENLCD=P1^5;
sbitBUZZ=P1^6;
ucharcodeCCW[8]={0xF9,0xF8,0xFc,0xF4,0xF6,0xF2,0xF3,0xF1};
//顺时钟旋转相序表
ucharcodeCW[8]={0xF1,0xF3,0xF2,0xF6,0xF4,0xFc,0xF8,0xF9};
//逆时钟旋转相序表
ucharQ[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x86};
uintLed_n=0;
voiddelaynms(uintaa)
{
ucharbb;
while(aa--)
for(bb=0;
bb<
115;
bb++)//1ms基准延时程序
;
}
voidmotor_ccw(uintx)
uchari,j;
for(j=0;
j<
8;
j++)//电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周
for(i=0;
i<
i++)//旋转45度
P3=CCW[i];
delaynms(x);
//调节转速
voidmotor_cw(uinty)
j++)
P3=CW[i];
delaynms(y);
n(uinta,uintb)
ucharr;
for(r=0;
r<
(22*a);
r++)
{
motor_cw(b);
//电机逆转a/3圈以b速度,因为减速比为1/64,64/3=22
}
s(uinta,uintb)
{
for(r=0;
motor_ccw(b);
//电机顺转a/3圈以b速度
}
voidmain(void)//假设8层楼,现在这系统装在四楼的电梯,电梯转一圈就升或降一层楼
uintz=1000;
ENLED=0;
ADDR0=0;
ADDR1=0;
ADDR2=0;
ADDR3=1;
P0=Q[4];
while
(1)
{KeyOut1=1;
KeyOut2=1;
KeyOut3=1;
KeyOut4=0;
if(KeyIn1==1)
KeyOut1=0;
KeyOut4=1;
if(KeyIn1==0)
{
delaynms(5);
if(KeyIn1==0)
{P0=Q[4];
s(1,6);
s(1,3);
s(1,1);
P0=Q[3];
s(3,1);
P0=Q[2];
}//按1楼,9/3=3圈,即下降3层
P0=Q[1];
while(z--)
{BUZZ=0;
delaynms
(1);
BUZZ=1;
z=1000;
}
if(KeyIn2==0)
if(KeyIn2==0)
};
//按2楼,6/3=2圈,下降2层
P0=Q[2];
while(z--)
if(KeyIn3==0)
if(KeyIn3==0)
s(1,4);
}//按3楼,3/3=1圈,下降1层
P0=Q[3];
if(KeyIn4==0)
if(KeyIn4==0)//按4楼,电梯不动,蜂鸣器报警
{
}
while((KeyIn1==0)||(KeyIn2==0)||
(KeyIn3==0)||(KeyIn4==0));
KeyOut1=1;
KeyOut2=0;
n(1,4);
n(1,1);
}//按5楼,3/3=1圈,上升1层
P0=Q[5];
n(1,6);
n(1,3);
P0=Q[5];
//按6楼,6/3=2圈,上升2层
P0=Q[6];
n(3,1);
P0=Q[6];
}//按7楼,9/3=3圈,上升3层
P0=Q[7];
}
if(KeyIn4==0)
P0=Q[7];
}//按8楼,12/3=4圈,上升4层
P0=Q[8];
if(KeyIn1==0)
delaynms(5);
if(KeyIn1==0)
{P0=Q[1];
}
{P0=Q[2];
s(6,1);
}
{P0=Q[3];
s(9,1);
while((KeyIn