|
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
uchar i,a,flag,u;
code tabup[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//竖直电机正转1~2相励磁
code tabdown[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//竖直电机反转1~2相励磁
code tableft[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//水平电机正转1~2相励磁
code tabright[]={0x60,0x20,0x30,0x10,0x90,0x80,0xc0,0x40};//水平电机反转1~2相励磁
void control(uchar);
void moveauto();
void moveup();
void movedown();
void moveleft();
void moveright();
void delay(uchar);
void init()//初始化
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xFA;
TL1=0xFA;
TR1=1;//开定时器
PCON=0x80;
SCON=0x50;//9600,n,8,1
EA=1;//开总中断
ES=1;//开串口中断
}
void serial() interrupt 4//串口中断
{
RI=0;
a=SBUF;
control(a);
delay(1);
}
void control(uchar l)//中断控制电机动作
{
switch(l)
{
case 'A':moveup();break;
case 'B':movedown();break;
case 'C':moveleft();break;
case 'D':moveright();break;
case 'Z':flag=1;break;
default:break;
}
}
void delay(uint z)//延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void moveup()//竖直方向向上
{
flag=0;
if(P10!=1)
{
for(i=0;i<8;i++)
{
P2=tabup[i];
delay(50);
}
}
}
void movedown()//竖直方向向下
{
flag=0;
if(P11!=1)
{
for(i=0;i<8;i++)
{
P2=tabdown[i];
delay(50);
}
}
}
void moveleft()//水平方向向左
{
flag=0;
if(P10!=1)
{
for(i=0;i<8;i++)
{
P2=tableft[i];
delay(50);
}
}
}
void moveright()//水平方向向右
{
flag=0;
if(P10!=1)
{
for(i=0;i<8;i++)
{
P2=tabright[i];
delay(50);
}
}
}
void moveauto()//自动运行
{
P1=0;
while(!P10)
{
for(i=0;i<8;i++)
{
P2=tabup[i];
delay(50);
}
}
while(!P11)
{
for(i=0;i<8;i++)
{
P2=tableft[i];
delay(50);
}
}
while(!P12)
{
for(i=0;i<8;i++)
{
P2=tabdown[i];
delay(50);
}
}
while(!P13)
{
for(i=0;i<8;i++)
{
P2=tabright[i];
delay(50);
}
}
}
void controlkey(uchar i)//按键控制电机动作
{
switch(i)
{
case 1:moveup();break;
case 2:movedown();break;
case 4:moveleft();break;
case 8:moveright();break;
case 16:flag=1;break;
default:break;
}
}
void main()
{
P1=0;
flag=0;
init();
while(1)
{
if(flag==1)
{
moveauto();//自动运行
}
P0=0xff;
u=P0;
controlkey(u);
}
}