微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机驱动步进电机程序问题

51单片机驱动步进电机程序问题

时间:10-02 整理:3721RD 点击:
程序如下通过共阳接法接俩个驱动器分别驱动步进电机




通过这俩个驱动板驱动步进实现后面的时序,不知道哪里不对了,请大师指点~
#include<reg52.h>#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CP1=P1^0;
sbit EN1=P1^1;
sbit DR1=P1^2;
sbit CP2=P1^3;
sbit EN2=P1^4;
sbit DR2=P1^5;
sbit run=P1^6;
sbit stop=P1^7;
sbit shoudong=P2^0;
uint a=0;
uchar cishu=0;
uint t=0;
uint t1=0;
uchar flag=0;
uchar x=0;
uchar y=0;
void delay_10ms(void)
{
  unsigned char a,b,c;
    for(c=5;c>0;c--)
        for(b=4;b>0;b--)
            for(a=248;a>0;a--);
}
void delay_3s(void)
{
   unsigned char a,b,c;
    for(c=254;c>0;c--)
        for(b=96;b>0;b--)
            for(a=60;a>0;a--);
          _nop_();  
}
  void init_I0()
{
          CP1=0;
          EN1=0;
          DR1=1;
          CP2=0;
          EN2=0;
          DR2=0;
          run=1;
          stop=1;
          shoudong=1;
          TMOD=0x11;
          TH0=0x0ff;
      TL0=0x9c;
      EA=1;
      ET0=1;
      TR0=0;
          TH1=0xff;
          TL1=0x9c;
      //EA = 1;         
      ET1 = 1;
      TR1 = 0;
}
void dianjiyunxin()       
{
       
          if(t==18000&&flag==0&&cishu<10)
        {
         
         EN1=0;
         DR1=0;
         EN2=1;
         delay_3s();
         EN2=0;
         TR0=0;
         EN1=1;
         flag=1;
         t=0;
         cishu++;//cishu=1
        }         
        if(t==18000&&flag==1&&cishu<10)
        {
         
         EN1=0;
         DR1=1;
         EN2=1;
         delay_3s();
         EN2=0;
         TR0=0;
         EN1=1;
         flag=0;
         t=0;//         
         cishu++; //cishu=2
        }
        if(cishu==10)
      {
          cishu=10;
          }
   if(t==18000&&flag==0&&cishu==10)
        {
         EN1=0;
         DR1=0;
         delay_3s();
         EN1=1;
         flag=1;
         t=0;   
        }         
        if(t==18000&&flag==1&&cishu==10)
        {
         EN1=0;
         DR1=1;         
         delay_3s();
         EN1=1;         
         flag=0;
         t=0;   
        }
}
void main()
{
init_I0();
//InitTimer0();
//InitTimer1();
while(1)
  {
   if(shoudong==0)
                  {
                         delay_10ms();
                          if(shoudong==0)
                          {
                            
                              for(cishu;cishu>0;cishu--)  
                               {
                                     TR0=1;
                                     EN2=1;
                                 DR2=1;
                                     delay_3s();
                               }
                                    EN2=0;
                                 
                                       while(a)
                                            {  
                                                    TR1=1;
                                                    EN1=1;
                                                        DR1=0;
                 
                                                 }
                                                 EN1=0;
                                                 DR1=1;
                                        }
                                        EN2=0;
                                        DR2=0;
                                        TR0=0;
                                        TR1=0;
                                        a=0;
                                     t=0;
                                         flag=0;       
                                        CP1=0;
                                        CP2=0;
                           }
   if(run==0)
   {
      delay_10ms();         
      if(run==0)
      {
       while(stop)
            {
              TR0=1;
                 EN1=1;
              dianjiyunxin();
               }
      }
   }
     if(stop==0)
    {
        delay_10ms();
        if(stop==0)         
        {
                  if(DR1==1)
                  a=t;
                  if(DR1==0)
                  a=(18000-t);
              // TR0=1;
          // while(!stop)  
             //  {
                // EN1=;
                
          // }
              EN1=0;
              //DR1=;
         
         }
    EN2=0;
        DR2=0;
        TR0=0;       
        CP1=0;
        CP2=0;          
    }
  }          
}
void Timer0() interrupt 1 using 1        //         定时器中断
{
    TH0 = 0x0ff;
    TL0 = 0x9c;
        t1++;
        x++;
        y++;
        if(y==10)//提供2电机的脉冲  
                {
                        CP2=~CP2;
                        y=0;
                }
        if(x==5) //提供1电机的脉冲
                 {
                    CP1=~CP1;
                         x=0;
              }
         if(t1==10)
                 {
                          t++;
                          t1=0;
                 }
}
         void Timer1() interrupt 3  using 2        //         定时器中断
{
    TH1 = 0x0ff;
    TL1 = 0x9c;
        t1++;
        x++;
        y++;
        if(y==10)//提供2电机的脉冲  
                {
                        CP2=~CP2;
                        y=0;
                }
        if(x==5) //提供1电机的脉冲
                 {
                    CP1=~CP1;
                         x=0;
              }
         if(t1==10)
                 {
                          a--;
                          t1=0;
                   }   }

为什么延时3秒呀,这么长时间里,不知道中断了多少次了。不知道你要表达的是什么问题?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top