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

请教各位大神一下,有关步进电机程序的问题

时间:10-02 整理:3721RD 点击:
请教各位大神,求大神们帮我看看程序,
想用单片机控制步进电机,步进电机有启动器,单片机上电步进电机正转,单片机上连接了一个激光接收器。
     当激光照射到激光接收器第一次触发后,(激光为闪烁状态,不是常亮)步进电机停止转动1秒。
     当在电机停止的1秒内,激光接收器第二次触发后,电机反转2秒。如果激光接收器没触发,电机正转,重新开始检测。
    当在反转的2秒内,激光接收器再次触发,电机继续反转,直到激光接收器没有接收到激光信号不触发时,电机变回正转,再次等待激光接收器触发

小弟程序写到电机可以反转2秒,再往后就不会了,还请大神们指点指点,小弟写的程序如下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned charsbit
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