锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

单片机控制步进电机程序+视频

时间:2024-04-30 15:07:09

完善二

源程序:


/*-----------------------------------------------------------------------------
工作板源程序
-----------------------------------------------------------------------------*/

#include //各个特殊功能寄存器地址定义
#include

/*-----------------------------------------------------------------------------
用于串行输入I的数据接收口
-----------------------------------------------------------------------------*/
volatile unsigned int data zd0; //功能1的时候调整时间
volatile unsigned char data SPI_DH,SPI_DL;//串行口高位和低位高位用于识别功能指令和地址指令,低位用于数据传输
volatile unsigned char data SPI_ZL,SPI_DZ,SPI_SJ;
volatileunsigned int data m,z;
/*-----------------------------------------------------------------------------
三变量用于默认的速度,宽度,高度。
-----------------------------------------------------------------------------*/
volatile unsigned char data b=100; //单位是rpm/min
volatile unsigned char data BBZ;
volatile unsigned char data c=1; // 宽度单位是毫米
volatile unsigned char data CBZ;
volatile unsigned char data d=4; // 高度单位是毫米
volatile unsigned char data Z;
/*-----------------------------------------------------------------------------
三变量用于速度,宽度,高度的翻译中间变量
-----------------------------------------------------------------------------*/
unsigned char data e;// 用于速度
unsigned char data f; //用于宽度
unsigned char data g;//用高度



/*-------------------------------------------------------------
P0引脚定义: P0口有5种定义,每种定义根据P2口给定功能不同而不同。
每种功能不能同时实现,否则会出现混乱。

-------------------------------------------------------------*/

sbitCLK1=P0^0; //1脉冲
sbit 1 =P0^1; //步进1方向
sbitEW1=P0^2; //步进电机1使能
sbitCLK2 =P0^3; //步进电机2脉冲
sbitCW2 =P0^4; //步进电机2方向
sbitEW2 =P0^5; //步进电机2使能
sbitEN1 =P0^6; //角度电机使能
sbitIN1 =P0^7; //角度电机脉冲

/*-------------------------------------------------------------
P1引脚定义 :P1口为限位检测口。

-------------------------------------------------------------*/
sbit LED_SD =P1^0;

sbit LED_KD =P1^2;
sbit LED_GD=P1^3;
sbit LED_YX=P1^4;
sbit LED_FW=P1^5;
sbit CLK =P1^6; //角度限位右 。当高电平表示有限位
sbitDATAS =P1^7; //角度电机输入2

/*-------------------------------------------------------------
P2引脚定义 :
-------------------------------------------------------------*/
sbit VSW = P2^0;
sbit FXXWZ = P2^1;
sbitFXXWY=P2^2; // 驱动控制,=0该为Q=D.=1时为高阻态。
sbitZXWX=P2^3; //控制,该位=0时为跟随变化Q=D,=1时为高阻态。
sbitZXWS=P2^4; //指示灯LED控制该位=0时为保持,=1时为数据Q=D
sbit XXWZ=P2^5; //个位控制该位=0时为保持,=1时为数据Q=D

sbit XXWY=P2^6; //数码管十位控制该位=0时为保持,=1时为数据Q=D


sbitIN2 =P2^7; //角度电机脉冲


/*-------------------------------------------------------------
P3引脚定义:P3口为主轴电机调速端口和
主轴编码方向编码,还有键盘中断。
-------------------------------------------------------------*/

sbit B_IO =P3^2 ;
sbit JT =P3^3 ;
sbitZZZD=P3^4;
sbitFXMC=P3^5;
sbitPOWSW=P3^7;


/*-----------------------------------------------------------------------------
函数功能 : MS 毫秒 延迟函数
-----------------------------------------------------------------------------*/
void Delay(unsigned int i)
{
unsigned int j;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}


unsigned char code table[]=
{
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,
0x71,0x00,0x40,0x00
};

/*-----------------------------------------------------------------------------
函数功能 : us 微秒 延迟函数
-----------------------------------------------------------------------------*/
void MyDelay(unsigned int time)
{
while(time--)
{
_nop_();
}
}

/*-----------------------------------------------------------------------------
函数功能 : us 微秒 精确US延迟 12MHZ延迟6us
-----------------------------------------------------------------------------*/
void MyDelay2()
{
_nop_();
}


/*-----------------------------------------------------------------------------

函数功能 :X轴脉冲

-----------------------------------------------------------------------------*/
void XZDJQD()
{
CLK1=0;
MyDelay2();
CLK1=1;
Delay(1);

}

/*-----------------------------------------------------------------------------
函数功能 :Z轴电机驱动脉冲

-----------------------------------------------------------------------------*/
void ZZDJQD()
{
CLK2=0;
MyDelay2();
CLK2=1;
Delay(1);

}
/*-----------------------------------------------------------------------------
函数功能 :机构复位程序 复位x轴z轴以及角度轴。
-----------------------------------------------------------------------------*/
void jgfw ( )
{

unsigned int g=0; //中点计数中间变量
EX0=0;//关闭键盘中断等待复位完成。
EW1=0;
CW1=1;
while(XXWZ==0)
{
CW1=1;
XZDJQD();
}
CW1=0;
while (XXWY==0)
{
CW1=0;
XZDJQD();
g=g+1;
}
g=g/2;
CW1=1;
while (g>0)
{
CW1=1;
XZDJQD();
g=g-1;
}
P2=0XF0;
EX0=1;
}


/*-----------------------------------------------------------------------------
函数功能 :运行状态中X轴和Z轴角度轴的控制。
-----------------------------------------------------------------------------*/
void YXQD ( )
{
f=c*20;
while(f>0)
{
XZDJQD();
f=f-1;
if(XXWZ==1)CW1=0;
if(XXWY==1)CW1=1;
if(XXWZ==1||XXWY==1)
{
g=d*5;
while(g>0)
{
ZZDJQD();
g=g-1;
}

}


}



}





/*-----------------------------------------------------------------------------
函数功能 :运行状态电机参数送出(串行方式)

-----------------------------------------------------------------------------*/

void Control(unsigned char cmd)
{
unsigned char i;
STB_IO = 0;//拉低片选
Delay(20);
for(i=0;i<8;i++)
{
CLK = 0;
//这里大约是100us
if(cmd & 0x80)DATAS = 1;//把datas的参数与16进制数8000进行位与运算把结果给datas(如果有数则DAT=1
else DATAS = 0;//否则DAT=0
MyDelay(200) ;
CLK = 1;
MyDelay(200) ;//这里大约是100us
cmd <<= 1;
}
DATAS = 1;
STB_IO = 1;
CLK = 1;
}

/*-----------------------------------------------------------------------------
函数功能 : 主函数
-----------------------------------------------------------------------------*/
void main(void)
{
unsigned char YSJS=5 ;

EX0=1;//开中断0
EA=1; //开总中断
IT0=1; //设定中断0方式为下降沿触发。
while (1)
{

if (SPI_ZL==0) {POWSW=1;LED_SD=1;LED_KD=1;LED_GD=1;LED_YX=1;LED_FW=1;} // 关闭电源状态
while(SPI_ZL==0){; }

if (SPI_ZL==1){VSW=0; POWSW=0;} //启动电源的状态。
while(SPI_ZL==1) {LED_SD=~LED_SD;L

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章