1.文件
文件下载地址
https://download.csdn.net/download/weixin_43130546/12188429
2.电机分类
驱动类电机——如:四驱车马达
控制类电机
反应式步进电机——性能差,已被淘汰
永磁式步进电机——广泛用于消费产品
如: 28BYJ-48 (4相永磁式步进电机)
混合式步进电机——主要用于工业
3.电机工作模式
单四拍
双四拍
八拍
4.说明
P1_0-P1_4控制电机
按键上正转
按键下反转
按键1-9转相应的圈数
按键左反转90
案件右正转90
ESC暂停
5.代码
#include
sbit KEYOUT1 = P3^0;
sbit KEYOUT2 = P3^1;
sbit KEYOUT3 = P3^2;
sbit KEYOUT4 = P3^3;
sbit KEYIN1 = P3^4;
sbit KEYIN2 = P3^5;
sbit KEYIN3 = P3^6;
sbit KEYIN4 = P3^7;
unsigned char code KeyCodeMap[4][4] =
{
{0x31,0x32,0x33,0x26},
{0x34,0x35,0x36,0x25},
{0x37,0x38,0x39,0x28},
{0x30,0x1B,0x0D,0x27}
};
unsigned char KeyStay[4][4] =
{
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
long beats = 0;
void ConfigTimer0(void);
void KeyDriver(void);
void main(void)
{
ConfigTimer0();
while(1)
{
KeyDriver();
}
}
void ConfigTimer0(void)
{
TH0 = 0xFC;
TL0 = 0x67;
EA = 1;
ET0 = 1;
TMOD &= 0xF0;
TMOD |= 0x01;
TF0 = 0;
TR0 = 1;
}
void MotorStart(long angle)
{
EA = 0;
beats = (angle * 4076) / 360;
EA = 1;
}
void MotorStop(void)
{
EA = 0;
beats = 0;
EA = 1;
}
void KeyAction(unsigned char KeyCode)
{
static bit MotorDir = 0;
if((KeyCode>=0x30) && (KeyCode<=0x39))
{
if(0 == MotorDir)
{
MotorStart(360 * (KeyCode - 0x30));
}
else
{
MotorStart(-360 * (KeyCode - 0x30));
}
}
else if(0x26 == KeyCode)
{
MotorDir = 0;
}
else if(0x28 == KeyCode)
{
MotorDir = 1;
}
else if(0x25 == KeyCode)
{
MotorStart(90);
}
else if(0x27 == KeyCode)
{
MotorStart(-90);
}
else if(0x1B == KeyCode)
{
MotorStop();
}
}
void KeyDriver(void)
{
unsigned char i,j;
static unsigned char KeyBack[4][4] =
{
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
if(KeyStay[i][j] != KeyBack[i][j])
{
if(0 == KeyBack[i][j])
{
KeyAction(KeyCodeMap[i][j]);
}
KeyBack[i][j] = KeyStay[i][j];
}
}
}
}
void KeyScan(void)
{
unsigned char i;
static unsigned char KeyOut = 0;
static unsigned char KeyBuff[4][4] =
{
{0xF,0xF,0xF,0xF},{0xF,0xF,0xF,0xF},
{0xF,0xF,0xF,0xF},{0xF,0xF,0xF,0xF}
};
KeyBuff[KeyOut][0] = (KeyBuff[KeyOut][0] <<1) | KEYIN1;
KeyBuff[KeyOut][1] = (KeyBuff[KeyOut][1] <<1) | KEYIN2;
KeyBuff[KeyOut][2] = (KeyBuff[KeyOut][2] <<1) | KEYIN3;
KeyBuff[KeyOut][3] = (KeyBuff[KeyOut][3] <<1) | KEYIN4;
for(i=0; i<4; i++)
{
if(0xF0 == KeyBuff[KeyOut][i])
{
KeyStay[KeyOut][i] = 0;
}
else if(0xFF == KeyBuff[KeyOut][i])
{
KeyStay[KeyOut][i] = 1;
}
}
KeyOut++;
KeyOut &= 0x3;
switch(KeyOut)
{
case 0 : KEYOUT4 = 1; KEYOUT1 = 0; break;
case 1 : KEYOUT1 = 1; KEYOUT2 = 0; break;
case 2 : KEYOUT2 = 1; KEYOUT3 = 0; break;
case 3 : KEYOUT3 = 1; KEYOUT4 = 0; break;
default : break;
}
}
void MotorTurn(void)
{
unsigned char tmp;
static unsigned char index = 0;
unsigned char code MotorCode[8] =
{
0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6
};
if(0 != beats)
{
if(beats > 0)
{
index++;
index &= 0x07;
beats--;
}
else
{
index--;
index &= 0x07; //????????????????????
beats++;
}
tmp = P1;
tmp &= 0xF0;
tmp |= MotorCode[index];
P1 = tmp;
}
else
{
P1 |= 0x0F;
}
}
void InterruptTimer0(void) interrupt 1
{
static bit div = 0;
TH0 = 0xFC;
TL0 = 0x67;
KeyScan();
div = ~div;
if(1 == div)
{
MotorTurn();
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』