//PIC18F458单片机 北京时代超群57系列步进电机以及配套驱动器
// 开发环境 MPALB8.40 ,CCSC
//设计思想:用串口调试助手控制电机转动的角度以及方向
#include <18F458.h>
#include<string.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(clock=10000000)
#use rs232(baud=19200, parity=N,xmit=PIN_C6, rcv=PIN_C7,stream=MYPC,bits=8)
void Turn_ange(int16 Set_Angel);
void chose();
int8 order=0; // 命令
// float tmp;//电机转的角度
int1 a=0; //电机正反转
int8 xorder;
void main()
{
float Deg;//电机转的角度
int8 f=0; // 数位的标志位
int16 data1,data2,data3,data4,data5,data6,data7; //依次百十个
output_high(PIN_D1);//开始时,电机处于脱机状态
while(1)
{
if(kbhit()!=0)
{
xorder=getc(MYPC);
if(xorder>0x42) //判断是否是命令
{
order=xorder;
delay_ms(1);
chose();
}
if(xorder<=0x39)
{
if(f==0)
{
data1=xorder;
Deg=(data1-48)*100; //ASCII转换成十进制
f=1;
} //end if(f==0)
if(f==1)
{
data2=getc(MYPC);
Deg+=(data2-48)*10; //ASCII转换成十进制
f=2;
} //end if(f==1)
if(f==2)
{
data3=getc(MYPC);
Deg+=(data3-48); //ASCII转换成十进制
f=3;
} //end if(f==2)
if(f==3)
{
data4=getc(MYPC);
//tmp=tmp+(data4-48)*10; //ASCII转换成十进制
f=4;
} //end if(f==3)
if(f==4)
{
data5=getc(MYPC);
Deg+=(float)(data5-48)/10; //ASCII转换成十进制
f=5;
} //end if(f==4)
if(f==5)
{
data6=getc(MYPC);
Deg+=(float)(data6-48)/100; //ASCII转换成十进制
f=6;
} //end if(f==5)
if(f==6)
{
data7=getc(MYPC);
Deg+=(float)(data7-48)/1000; //ASCII转换成十进制
f=7;
} //end if(f==4)
if(f==7)
{
int16 tmp;
f=0;
printf("Turn %6.3f Deg
", Deg);//打印转的角度
tmp= (unsigned int16)(Deg/0.028125);//转换转多少步
Turn_ange(tmp); //转换转多少步
}
} //end if(xorder<=65)
} //end if(kbhit()!=0)
} //end while(1)
} //end main
/////////////////设定角度/////////////////////////////////////////
void Turn_ange(unsigned int16 Set_Angel)
{
int16 i;
for(i=0;i<Set_Angel;i++)
{
output_low(PIN_C2);//输出高电平
delay_us(100);
output_high(PIN_C2);//输出低电平
delay_us(100);
if(kbhit()!=0)
{
xorder=getc(MYPC);
if(xorder=='e'||xorder=='E') //判断是否是命令
{
order=xorder;
delay_ms(1);
chose(); break;
}
}
}
}
/////////////////选择命令//////////////////////////////////////
void chose()
{
switch(order) //选择命令
{
case 'S': //大写S
case 's': //发的数据是S吗?
printf( "S:StartMotor
" ); //在串口助手
//上打印“S:StartMotor"
printf( "delay_ms(500)
" );
delay_ms(500);
output_low(PIN_D1);//
break;
case 'D':
case 'd':
printf("change direction
");
a=!a;
output_bit(PIN_D3,a);
break;
case 'E':
case 'e':
printf( "E:End_Motor
" ); //在串口助手上打印"Q:EndADC"
printf( "delay_ms(500)
" );
delay_ms(500);
output_high(PIN_D1);//
break;
default : // rs232 get other char
delay_ms(100);
puts( "ERROR
" );
break;
}//end switch(tmp)
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>