熱度 1|
軟件設計:
#include <reg51.h>
//四相步進電機工作與八拍方式
//正轉勵磁序列為A->AB->B->BC->C->CD->D->DA
unsigned char code Z1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
unsigned char code Z2[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
//反轉勵磁序列為AD->D->DC->C->CB->B->BA->A
unsigned char code F1[]={0x09,0x08,0x0C,0x04,0x06,0x02,0x03,0x01};
unsigned char code F2[]={0x90,0x80,0xC0,0x40,0x60,0x20,0x30,0x10};
sbit K1=P3^0 ; //電機1正轉
sbit K2=P3^1 ; //電機1反轉
sbit K3=P3^2 ; //停止
sbit K4=P3^3 ; //電機2正轉
sbit K5=P3^4 ; //電機2反轉
void delay_ms(unsigned char x)
{
unsigned char t; while(x--) for (t=0;t<120;t++); //延時函數
}
//電機1正轉
void STEP_MOTOR_Z1 ()
{
unsigned char i;
for(i=0;i<8;i++) //八拍
{
if (K3==0) break;
P1=Z1[i];
delay_ms(50);
}
}
//電機2正轉
void STEP_MOTOR_Z2 ()
{
unsigned char i;
for(i=0;i<8;i++) //八拍
{
if (K3==0) break;
P1=Z2[i];
delay_ms(50);
}
}
//電機1反轉
void STEP_MOTOR_F1 ()
{
unsigned char i;
for(i=0;i<8;i++)
{
if (K3==0) break;
P1=F1[i];
delay_ms(50);
}
}
//電機2反轉
void STEP_MOTOR_F2 ()
{
unsigned char i;
for(i=0;i<8;i++)
{
if (K3==0) break;
P1=F2[i];
delay_ms(50);
}
}
//主函數
void main()
{
while (1) //主循環
{
if (K1==0) //按下按鍵1電機1正轉4圈且D1燈亮
{
P0=0xfe;
STEP_MOTOR_Z1 ();//電機1正轉
if (K3==0) break;
}
else if (K2==0) //按下按鍵2電機1反轉3圈且D2燈亮
{
P0=0xfd;
STEP_MOTOR_F1 ();//電機1反轉
if (K3==0) break;
}
else if (K4==0) //按下按鍵4電機2正轉3圈且D4燈亮
{
P0=0xfB;
STEP_MOTOR_Z2 ();//電機2正轉
if (K3==0) break;
}
else if (K5==0) //按下按鍵5電機2反轉3圈且D5燈亮
{
P0=0xf7;
STEP_MOTOR_F2 ();//電機2反轉
if (K3==0) break;
}
else //按下按鍵3電機停止轉動且D3燈亮
{
P0=0xEF;//紅燈亮 表示電機不轉
P1=0x33;//電機初始狀態
}
}
}