学习步进电机的基本构造,现在一般情况下都是永磁式步进电机永磁式可以分为四相八拍这个可以根据构造来了解主要是通过通电后利用磁铁来吸引转子从而从而使其转动起来。
一般的工作模式是八拍及六十四拍使其转动。
同时通过其控制顺序表能使其转动起来。
下面是将矩阵键盘与步进电机相结合
按键1~9是控制圈数,上键与下键分别控制向上与向下,左右键控制旋转左右90度,ESC🗡控制退出
与加法计算机有异曲同工之妙[dog]
#include<reg52.h>
sbit KEY_OUT_1=P1^7;
sbit KEY_OUT_2=P1^6;
sbit KEY_OUT_3=P1^5;
sbit KEY_OUT_4=P1^4;
sbit KEY_IN_1=P1^3;
sbit KEY_IN_2=P1^2;
sbit KEY_IN_3=P1^1;
sbit KEY_IN_4=P1^0;
unsigned char code KeyCodeMap[4][4]={
{0x31,0x32,0x33,0x26},
{0x34,0x35,0x36,0x25},
{0x37,0x38,0x39,0x28},
{0x30,0x1B,0x0D,0x27}
};
unsigned char keysta[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};
signed char beats=0;
void KeyDriver();
void main()
{
EA=1;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
TR0=1;
ET0=1;
while(1)
{
KeyDriver();
}
}
void StartMonter(signed long angle)
{
EA=0;
beats=(angle*4076)/360;
EA=1;
}
void StopMonter()
{
EA=0;
beats=0;
EA=1;
}
void KeyAction(unsigned char keycode)
{
static bit dirmonter=0;
if(keycode>=0x30&&keycode<=0x39)
{
if(dirmonter==0)
{
StartMonter(360*(keycode-0x30));
}
else
{
StartMonter(-360*(keycode-0x30));
}
}
else if(keycode==0x26)
{
dirmonter=0;
}
else if(keycode==0x28)
{
dirmonter=1;
}
else if(keycode==0x25)
{
StartMonter(90);
}
else if(keycode==0x27)
{
StartMonter(-90);
}
else if(keycode==0x1B)
{
StopMonter();
}
}
void KeyDriver()
{
unsigned char i,j;
static unsigned char backup[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(backup[i][j]!=keysta[i][j])
{
if(backup[i][j]==1)
{
KeyAction(KeyCodeMap[i][j]);
}
backup[i][j]=keysta[i][j];
}
}
}
}
void KeyScan()
{
unsigned char i;
static unsigned char keyout=0;
static unsigned char keybuff[4][4]={
{0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF}, {0xFF,0xFF,0xFF,0xFF}
};
keybuff[keyout][0]=(keybuff[keyout][0]<<1) | KEY_IN_1;
keybuff[keyout][1]=(keybuff[keyout][1]<<1) | KEY_IN_2;
keybuff[keyout][2]=(keybuff[keyout][2]<<1) | KEY_IN_3;
keybuff[keyout][3]=(keybuff[keyout][3]<<1) | KEY_IN_4;
for(i=0;i<4;i++)
{
if((keybuff[keyout][i]&0x0F)==0x00)
{
keysta[keyout][i]=0;
}
else if((keybuff[keyout][i]&0x0F)==0x0F)
{
keysta[keyout][i]=1;
}
}
keyout++;
if(keyout>4)
{
keyout=0;
}
switch(keyout)
{
case 0:KEY_OUT_1=0;KEY_OUT_2=1;KEY_OUT_3=1;KEY_OUT_4=1;break;
case 1:KEY_OUT_1=1;KEY_OUT_2=0;KEY_OUT_3=1;KEY_OUT_4=1;break;
case 2:KEY_OUT_1=1;KEY_OUT_2=1;KEY_OUT_3=0;KEY_OUT_4=1;break;
case 3:KEY_OUT_1=1;KEY_OUT_2=1;KEY_OUT_3=1;KEY_OUT_4=0;break;
default:break;
}
}
void TurnMonter()
{
unsigned char tmp;
static unsigned char index=0;
unsigned char code beatcode[8]={
0xE,0XC,0xD,0x9,0xB,0x3,0x7,0x6
};
if(beats!=0)
{
if(beats>0)
{
index++;
if(index>=8)
{
index=0;
}
beats--;
}
else
{
index--;
if(index<=-1)
{
index=7;
}
beats++;
}
tmp=P1;
tmp=tmp&0xF0;
tmp=tmp | beatcode[index];
P1=tmp;
}
else
{
P1=P1 | 0x0F;
}
}
void InterruptTimer0() interrupt 1
{
static bit div=0;
TH0=0xFC;
TL0=0x67;
KeyScan();
div=~div;
if(div==1)
{
TurnMonter();
}
}
|