微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教各位大神,有关步进电机程序

请教各位大神,有关步进电机程序

时间:10-02 整理:3721RD 点击:
请教各位大神,小弟初学,还望各位大神指教!
想用51单片机控制步进电机,步进电机有驱动器。单片机上连接了一个激光接收器,单片机上电后步进电机正转。
      当激光照射到激光接收器,(激光为闪烁状态,不是常亮)接收器第一次触发,步进电机停止转动1秒。
      当在电机停止的1秒时间内,激光接收器第二次被触发,电机反转2秒。如果1秒后激光接收器没有触发,电机正转,重新检测
      当电机在反转的2秒时间内,激光接收器再次被触发,电机继续反转,直到激光接收器没有再被触发,电机开始正转,重新开始检测
      
       小弟程序写到能反转了,再往后就不会了,实在想不出,特来请教各位大神指点指点。小弟写的程序如下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit zhuan=P1^2;                       
sbit fangxiang=P1^3;
sbit jieshou=P2^2;           //激光接收器
uchar flag1,flag2,flag3,flag4,t0,jsnum1;
uint k;
void yanshi(uint z)
{       
      uint x,y;
            for(x=z;x>0;x--)               
            for(y=200;y>0;y--);
}
void qianjin()          //步进电机正转
{                     
      fangxiang=0;         
      zhuan=1;       
      yanshi(1);         
      zhuan=0;
             yanshi(1);
}
void houtui()          //步进电机反转
{       
     fangxiang=1;
            zhuan=0;
            yanshi(1);
            zhuan=1;       
      yanshi(1);}
void main()
{                 
      TMOD=0x01;
             TH0=(65536-50000)/256;       
      TL0=(65536-50000)%256;
             EA=1;       
      ET0=1;
            jsnum1=0;         //激光接收次数       
      flag1=0;     //步进电机1标志位        
             while(1)
            {   
                        if(flag1==0)               
      {                       
            jsnum1=0;                       
             qianjin();               
       }
       if(jieshou==0)           //激光接收器第一次触发               
       {                       
                    jsnum1++;       
                    flag1=1;        
                          TR0=1;
                    flag2=1;                       
              while(!jieshou);               
       }
            }
}
void dingshi() interrupt 1
{       
      TH0=(65536-50000)/256;       
      TL0=(65536-50000)%256;       
        t0++;       
        if(flag2==1)       
        {                        flag1=1;               
              if(t0==20)       
                    {                            
                   t0=0;                               
                   if(jieshou==0)                 //激光接收器第二次触发               
                         {                       
                                jsnum1++;                                 
                          while(!jieshou);                       
                   }
                                     else                                 //没有触发重新开始                       
                  TR0=0;               
                       flag1=0;
                                         if(jsnum1==2)                   //电机开始反转                               
                {                       
                                    uint i;                                 
                            for(i=5000;i>0;i--)                               
                                           houtui();                                 
                                         jsnum1=0;                    
                                          }                         
                        flag1=0
            }
              }
}

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

网站地图

Top