×
单片机 > 单片机程序设计 > 详情

单片机控制多个步进电机C语言程序设计

发布时间:2020-08-21 发布时间:
|
//程序说明:烧好程序,连接好控制线(步进电机1的控制线I1-I4连接到P2.0-P2.3,步进电机2的控制线I1-I4连接

//  到P2.4-P2.7。按S19可控制步进电机1的转动停止、加减速和正反转,按S20可控制步进电机2的转动停
//  止、加减速和正反转。

//****************************************************************************************************************

#include
//#include

sbit A1=P2^0;   //步进电机1输出脚定义
sbit B1=P2^1;
sbit C1=P2^2;
sbit D1=P2^3;

sbit A2=P2^4;   //步进电机2输出脚定义
sbit B2=P2^5;
sbit C2=P2^6;
sbit D2=P2^7;

//步进电机1工作定义------------------------------------------------------------------------------------------------------
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF1 {A1=0;B1=0;C1=0;D1=0;}//全部断电

//步进电机2工作定义
#define Coil_A2 {A2=1;B2=0;C2=0;D2=0;}//A相通电,其他相断电
#define Coil_B2 {A2=0;B2=1;C2=0;D2=0;}//B相通电,其他相断电
#define Coil_C2 {A2=0;B2=0;C2=1;D2=0;}//C相通电,其他相断电
#define Coil_D2 {A2=0;B2=0;C2=0;D2=1;}//D相通电,其他相断电
#define Coil_OFF2 {A2=0;B2=0;C2=0;D2=0;}//全部断电

unsigned char x1,y1,i1,s1;
unsigned char x2,y2,i2,s2;
//unsigned char y1;
//unsigned char i1;
//unsigned char S1;

//------------------------------------------------------------------------------------------------------
// uS延时函数,含有输入参数 unsigned char t,无返回值
// unsigned char 是定义无符号字符变量,其值的范围是
// 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
// 长度如下 T=tx2+5 uS 
//-----------------------------------------------------------------------------------------------------
void DelayUs2x(unsigned char t)
{   
 while(--t);
}

//--------------------------------------------------------------------------------------------------------
// mS延时函数,含有输入参数 unsigned char t,无返回值
// unsigned char 是定义无符号字符变量,其值的范围是
// 0~255 这里使用晶振12M,精确延时请使用汇编
//-----------------------------------------------------------------------------------------------------------
void DelayMs(unsigned char t)
{    
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
  DelayUs2x(245);
 }
}

//---------------------------------------------------------------------------------------------------
//                   定时器初始化子程序
//---------------------------------------------------------------------------------------------------
void Init_Timer(void)
{
 TMOD |= 0x11;   //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响       
 //TH0=0x00;       //给定初值
 //TL0=0x00;
 EA=1;            //总中断打开
 ET1=1;           //定时器中断打开
 TR1=1;           //定时器开关打开
 PT1=1;           //优先级打开
 ET0=1;           //定时器中断打开
 TR0=1;           //定时器开关打开
 PT0=1;           //优先级打开
}

void main()
{
 s1=2;
 s2=2;
 Init_Timer();
 
 EX0=1;         //外部中断0开
 IT0=1;         //1表示边沿触发
 EX1=1;         //外部中断0开
 IT1=1;         //1表示边沿触发

 while(1)
 {

 }
}

////步进电机2控制按钮(S20)中断子程序
void ISR_INT0(void) interrupt 0
{
  if(!INT0)
    {
     DelayMs(50);//在此处可以添加去抖动程序,防止按键抖动造成错误
     if(!INT0)
   s1++;   
 }
 switch(s1)
 {
  case 0:
   x1=0xe4;    //快速转动赋值 间隔6ms
    y1=0xa8;
   break;
  case 1:
   x1=0xf4;    //慢速转动赋值 间隔3ms
   y1=0x48;
   break;
  case 3:
   x1=0xe4;    //反转赋值 间隔6ms
    y1=0xa8;
   break;
 }
 if(s1==5)
  s1=0;
}

//步进电机2控制按钮(S20)中断子程序
void ISR_INT1(void) interrupt 2
{
 if(!INT1)
 {
     DelayMs(50);//在此处可以添加去抖动程序,防止按键抖动造成错误
     if(!INT1)
         s2++;   
    }
 switch(s2)
 {
  case 0:
   x2=0xe4;    //快速转动赋值 间隔6ms
    y2=0xa8;
   break;
  case 1:
   x2=0xf4;    //慢速转动赋值 间隔3ms
   y2=0x48;
   break;
  case 3:
   x2=0xe4;    //反转赋值 间隔6ms
    y2=0xa8;
   break;
 }
 if(s2==5)
  s2=0;
}

//定时器0中断子程序,用于驱动步进电机1-----------------------------------------------------------------------
void Timer0_isr(void) interrupt 1 
{
 TH0=x1;    //重新赋值
 TL0=y1;
 
 if(s1==0||s1==1)       //正转工作流程
 {
  switch(i1)
  {
   case 0:Coil_A1;i1++;break;
   case 1:Coil_B1;i1++;break;
   case 2:Coil_C1;i1++;break;
   case 3:Coil_D1;i1=0;break;
   default:Coil_OFF1;i1=0;
  }
 }
 else if(s1==3)        //反转工作流程
 {
  switch(i1)
  {
   case 0:Coil_D1;i1++;break;
   case 1:Coil_C1;i1++;break;
   case 2:Coil_B1;i1++;break;
   case 3:Coil_A1;i1=0;break;
   default:Coil_OFF1;i1=0; 
  }
 }
 else          //停止转动
  Coil_OFF1;
}

//定时器1中断子程序,用于驱动步进电机2-----------------------------------------------------------------------
void Timer1_isr(void) interrupt 3 
{
 TH1=x2;    //重新赋值
 TL1=y2;
 
 if(s2==0||s2==1)       //正转工作流程
 {
  switch(i2)
  {
   case 0:Coil_A2;i2++;break;
   case 1:Coil_B2;i2++;break;
   case 2:Coil_C2;i2++;break;
   case 3:Coil_D2;i2=0;break;
   default:Coil_OFF2;i2=0;
  }
 }
 else if(s2==3)        //反转工作流程
 {
  switch(i2)
  {
   case 0:Coil_D2;i2++;break;
   case 1:Coil_C2;i2++;break;
   case 2:Coil_B2;i2++;break;
   case 3:Coil_A2;i2=0;break;
   default:Coil_OFF2;i2=0; 
  }
 }
 else          //停止转动
  Coil_OFF2;
}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会