|
#define Motor_PORT P3 //定义步进电机控制端口为P2 如果修改此端口,必须也同时修改初始化端口,(默认为低四位,也可由地下A_Line来控制)
#define A_Line 4 //A相接端口0
#define B_Line 5 //B相接端口1
#define C_Line 6 //C相接端口2
#define D_Line 7 //D相接端口3
unsigned char code Rotation[8] = {0xE0,0xA0,0xB0,0x90,0xD0,0x50,0x70,0x60}; //步进电机旋转编码表
//----------------------------------------------------------------
// dir = 1 正转,dir = 0 反转
// 步进电机单步正反转函数
//----------------------------------------------------------------
void Step_Motor(unsigned char dir) //步进电机单步正反转函数
{
static unsigned char Motor_Num = 0; //静态变量步进电机走了几步
if(dir == 1) //正转
{
if(Motor_Num >= 7)
Motor_Num = 0;
else
Motor_Num ++ ;
}
else //反转
{
if(Motor_Num == 0)
Motor_Num = 7;
else
Motor_Num -= 1;
}
Motor_PORT = (Motor_PORT & ~((1 << A_Line) | (1 << B_Line) |(1 << C_Line)|(1 << D_Line))) | Rotation [Motor_Num]; //屏蔽ABCD三项以外的端口,并且把编码赋值给步进电机
}
因为P3口接步进电机,同时也接串口1,当步进电机工作的时候,串口1就无法正常工作,
纠其原因,发现问题出现在
Motor_PORT = (Motor_PORT & ~((1 << A_Line) | (1 << B_Line) |(1 << C_Line)|(1 << D_Line))) | Rotation [Motor_Num];
把这句替换成下面这个就好了。
switch(Motor_Num)
{
case 0:
Step_A = 0;
Step_B = 1;
Step_C = 1;
Step_D = 1;
break;
case 1:
Step_A = 0;
Step_B = 1;
Step_C = 0;
Step_D = 1;
break;
case 2:
Step_A = 1;
Step_B = 1;
Step_C = 0;
Step_D = 1;
break;
case 3:
Step_A = 1;
Step_B = 0;
Step_C = 0;
Step_D = 1;
break;
case 4:
Step_A = 1;
Step_B = 0;
Step_C = 1;
Step_D = 1;
break;
case 5:
Step_A = 1;
Step_B = 0;
Step_C = 1;
Step_D = 0;
break;
case 6:
Step_A = 1;
Step_B = 1;
Step_C = 1;
Step_D = 0;
break;
case 7:
Step_A = 0;
Step_B = 1;
Step_C = 1;
Step_D = 0;
break;
}
问题:如果用查表法,怎样屏蔽那几个不是接步进电机的接口。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|