找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1470|回复: 0
打印 上一主题 下一主题
收起左侧

步进电机仿真

[复制链接]
跳转到指定楼层
楼主
ID:313067 发表于 2018-4-24 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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   = P2^3;       //?????
sbit  K2   = P2^4;       //????
sbit  K3   = P2^5;       //????
sbit  K4   = P2^6;       //????

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[ ] = {"Bi Ye She Ji "};
uchar code  cdis2[ ] = {"    LuoWeilan"};
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;   


/********************************************************/
/*                                                  
/* ??t??
/* 11.0592MHz??,???1ms                                    
/*                                                      
/********************************************************/
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++)
     { }
   }
}


/********************************************************/
/*                                                               
/*??LCD???                                                   
/*lcd_busy?1?,?,????0?,?,????????     
/*                                                               
/********************************************************/

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

/********************************************************/
/*                                                                 
/*??????LCD                                                
/*RS=L,RW=L,E=???,D0-D7=????                             
/*                                                               
/********************************************************/

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;  
}

/********************************************************/
/*                                                               
/*??????LCD                                                  
/*RS=H,RW=L,E=???,D0-D7=???                              
/*                                                               
/********************************************************/

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;
}

/********************************************************/
/*                                                               
/*  LCD?????                                                
/*                                                               
/********************************************************/

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+????
}


/********************************************************/
/*                                                      
/* LCD1602???????                                             
/*                                                      
/********************************************************/
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%10;       //??
     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


/********************************************************/
/*
/*  ??? T0 ??
/*
/********************************************************/

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; }
          }
    }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表