分享

51单片机控制步进电机正反转的程序

 共同成长888 2018-05-05

51单片机控制步进电机正反转的程序

 
        这是一款51单片机控制步进电机正反转的程序,同时还能实现调速。
#include ”reg51.h“     
#include “intrins.h”
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

unsigned char code FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //??
unsigned char code REV[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //??
//unsigned char code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //??
//unsigned char code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //??
sbit  K1   = P3^2;       //?????
sbit  K2   = P3^3;       //????
sbit  K3   = P3^4;       //????
sbit  K4   = P3^5;       //????

sbit  LCD_RS = P2^0;             
sbit  LCD_RW = P2^1;
sbit  LCD_EN = P2^2;

bit  on_off=0;            //???????
bit  direction=1;         //????
bit  rate_dr=1;           //????
bit  snum_dr=1;           //????

uchar code  cdis1[ ] = {"NO.0738230126 "};
uchar code  cdis2[ ] = {"     2012/5/24"};
uchar code  cdis3[ ] = {"    STOP        "};
uchar code  cdis4[ ] = {"NUM:    RATE:   "};
uchar code  cdis5[ ] = {"  RUNNING       "};

uchar   m,v=0,q=0;

uchar   number=0,number1=0; 
uchar   snum=20,snum1=20;       //?????
uchar   rate=3;               //?????
uchar   data_temp,data_temP0,data_temp2;   


void delay(uint t)
{                           
   uchar k;
   while(t--)
   {
     for(k=0; k<124; k++)
     { }
   }
}

void delayB(uchar x)    //x*0.14MS
{
   uchar i;
   while(x--)
   {
     for (i=0; i<13; i++)
     { }
   }
}


 

bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result); 
}


void lcd_wcmd(uchar cmd)

{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}


void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0; 
}


void lcd_init()
    delay(30);                   
    lcd_wcmd(0x38);      //16*2??,5*7??,8???
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);

    lcd_wcmd(0x0c);      //???,???
    delay(5);
    lcd_wcmd(0x06);      //????
    delay(5);
    lcd_wcmd(0x01);      //??LCD?????
    delay(5);
}


void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80);  //????=80+????
}


void  LCD_init_DIS()
{            
     delay(10);                 //??
     lcd_init();                //???LCD             
        
     lcd_pos(0);                //????????????1???
     m = 0;
     while(cdis1[m] != '\0')
      {                         //????
        lcd_wdat(cdis1[m]);
        m++;
      }

     lcd_pos(0x40);             //???????????1???
     m = 0;
     while(cdis2[m] != '\0')
      {
        lcd_wdat(cdis2[m]);      //????
        m++;
      }

      delay(3000);               //??        
        
      lcd_pos(0);                //????????????1???
      m = 0;
      while(cdis3[m] != '\0')
        {                        //????
          lcd_wdat(cdis3[m]);
          m++;
        }

      lcd_pos(0x40);             //???????????1???
      m = 0;
     while(cdis4[m] != '\0')
        {
          lcd_wdat(cdis4[m]);    //????
          m++;
        }      
        for(m=0;m<2;m++)
          
       lcd_pos(0x0c+m);    //??????
             lcd_wdat(0x3e);
    }

}
void  data_conv() 
{
     data_temP0=data_temp/10;       //??
  if(data_temP0==0)
  {data_temP0=0x20;}             //???0???
     else 
  {data_temP0=data_temP0+0x30;}

   data_temp2=data_temp;       //??
     data_temp2=data_temp2+0x30;
}

void  data_dis()
{
    data_temp = snum;        //????
    data_conv();
       lcd_pos(0x44); 
       lcd_wdat(data_temP0);
       lcd_pos(0x45); 
       lcd_wdat(data_temp2);
    
    data_temp = rate;         //????
    data_conv();
       lcd_pos(0x4d); 
       lcd_wdat(data_temP0);
       lcd_pos(0x4e); 
       lcd_wdat(data_temp2);
}
void  motor_DR()
  {
       if(direction==1)           //??????
        { for(m=0;m<2;m++)
          
      lcd_pos(0x0c+m);      //??????
            lcd_wdat(0x3e);
     }
   }
        else
         { for(m=0;m<2;m++)       //??????
           
          lcd_pos(0x0c+m);     //?????? 
             lcd_wdat(0x3c);
     }
   }
  }

void  motor_RUN()
{
      if(on_off==1)
    { TR0=1; 
      lcd_pos(0);     //????????????1???
         m = 0;
         while(cdis5[m] != '\0')
          { lcd_wdat(cdis5[m]);      //RUNNING
            m++;   }
            motor_DR();              //
    }  
      else  
    { TR0=0; P0 =0x0f; 
   lcd_pos(0);     //????????????1???
         m = 0;
         while(cdis3[m] != '\0')
          { lcd_wdat(cdis3[m]);      //STOP
            m++;   }
            motor_DR();              //
   snum=snum1;             //
   number1=0;              //??????
         }
  }



main()
{                
         LCD_init_DIS();
  
   TMOD = 0x01;       //T0????1
   TL0  = 0x33;
   TH0  = 0xf5;
   EA   = 1;
   ET0  = 1; 
   
   P1=0;
   while(1)
    {  
       if(K1==0)
    {
         //beep();
      while(K1==0);       //?????
      on_off=~on_off;       
         motor_RUN();  
        }   //K1 end
      if(K2==0)    
       {
        if(snum_dr==1)
    { snum++;
        snum1=snum;
      if(snum==0x14)
            { snum_dr=~snum_dr;}
    }
   else  
     {snum--;
   snum1=snum;
      if(snum==0x01)
   { snum_dr=~snum_dr; }
     }
   
    } //K2  end
        if(K3==0)    
      {
   direction=~direction; 
         motor_DR();
      }//K3 end

        if(K4==0)    
       {
   if(rate_dr==1)
    { rate++;
      if(rate==0x10)
            { rate_dr=~rate_dr;}
    }
    else  
     
      rate--;
      if(rate==0x01)
   { rate_dr=~rate_dr; }
     }
  } //K4 end
    
      if(number1==snum1)   //?????????  
     { number1=0; 
         on_off=0;
         TR0=0;
        snum=snum1;
   P1=0x0f;
    motor_RUN();
    }         
         data_dis();
}  // while(1) end
}  //main end



void  motor_onoff()  interrupt  1  
{     
       TL0  = 0x33;
       TH0  = 0xf5; 
       q++;
    if(q < rate)
        { return; }
    else 
       {  q=0;    
       number++;                  //????
        
      if(number==64)              //64????????
       { snum--;
      number=0;
            number1++; }          //??????
    

         if(direction==1)            //????
       { if(v<8)  
         {P1 = FFW[v];v++;}       //???,??
        if(v==8) 
        { v=0; } 
          }
   
      else
       { if(v<8)  
         {P1 = REV[v];v++;}       //???,??
         if(v==8) 
         { v=0; } 
          }
    }
}

分享: 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多