[51单片机]

求助:单片机控制步进电机

[复制链接]
1382|15
手机看帖
扫描二维码
随时随地手机跟帖
dzm8365|  楼主 | 2018-1-22 10:48 | 显示全部楼层 |阅读模式
下面是单片机控制步进单机的程序,由于本人没学过C语言,不是很懂,这些程序都是在网上找的,东拼西凑改出来的
现在所有功能都实现了,但是还有一点问题:

单片机上电,按住KEY1,电机正转,松手反转,可以循环,但是按KEY2,电机不动。
如果单片机上电后,先按key2,电机正转,松手反转,再按key2就不转了。按key1同样可以循环。

程序应该怎么改,请高手指点

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit key1=P3^2;   
sbit key2=P3^3;   
sbit key3=P3^4;   

uchar code ffw[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar code rev[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};

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


void  motor_ffw(uint n)      //步进电机正转
{
   uchar i;
   uint  j;
   for(j=0; j<6*n; j++)   
    {
      for(i=0; i<8; i++)     
        {
          P1 = ffw[i];      
          delay(15);         
        }
    }
                P1=0xff;
                while(key1==0||key2==0);
}

void  motor_rev(uint n)      //步进电机反转
{
    uchar i;
    uint j;
    for(j=0; j<6*n; j++)   
       {  
          for(i=0;i<8;i++)     
             {
                if(key3==0)  
                   {  
                        break;           
                   }
                P1=rev[i];      
                delay(15);      
             }  
    }
                P1=0xff;
                while(key1==1);
}
               
        
void main()
{
    while(1)
        {
            if(key3==1)
                {
                    delay(50);
                    if(key3==1)
                      {
                          motor_rev(11);
                        }
                  }
              if(key1==0||key2==0)
                 {
                     delay(50);
                     if(key1==0||key2==0)
                       {
                           motor_ffw(10);
                        }
                  }
       }
}
评论
通宵敲代码 2018-1-23 14:57 回复TA
这是什么控制逻辑,你们产品经理是疯了吗。 

相关帖子

ningling_21| | 2018-1-22 11:02 | 显示全部楼层
要实现什么功能

使用特权

评论回复
dzm8365|  楼主 | 2018-1-22 11:19 | 显示全部楼层

按住key1或者key2,电机正转,松手反转。现在只有key1能循环实现这个功能,key2只能按一次,再按就不转了

使用特权

评论回复
ningling_21| | 2018-1-22 11:30 | 显示全部楼层
dzm8365 发表于 2018-1-22 11:19
按住key1或者key2,电机正转,松手反转。现在只有key1能循环实现这个功能,key2只能按一次,再按就不转了 ...

给出伪代码,自己填充
if( 按键1按下  || 按键2 按下)
{
     电机正转;
}
else if( 按键1松开 || 按键2松开)
{
      电机反转;
}

使用特权

评论回复
ningling_21| | 2018-1-22 11:31 | 显示全部楼层
dzm8365 发表于 2018-1-22 11:19
按住key1或者key2,电机正转,松手反转。现在只有key1能循环实现这个功能,key2只能按一次,再按就不转了 ...

KEY3 什么功能?

使用特权

评论回复
dzm8365|  楼主 | 2018-1-22 11:59 | 显示全部楼层

key3是传感器,反转自动停的

使用特权

评论回复
dzm8365|  楼主 | 2018-1-22 16:32 | 显示全部楼层
ningling_21 发表于 2018-1-22 11:30
给出伪代码,自己填充
if( 按键1按下  || 按键2 按下)
{

还想请教个问题,假如key2信号是间歇性的,1秒一次,要连续1.5秒没有检测到信号才反转。能实现吗?

使用特权

评论回复
ningling_21| | 2018-1-22 16:42 | 显示全部楼层
dzm8365 发表于 2018-1-22 16:32
还想请教个问题,假如key2信号是间歇性的,1秒一次,要连续1.5秒没有检测到信号才反转。能实现吗? ...

比较麻烦

使用特权

评论回复
前功尽弃| | 2018-1-23 09:27 | 显示全部楼层
从中依稀看到了当年自己啥都不懂的时候

使用特权

评论回复
czdpj| | 2018-1-23 11:41 | 显示全部楼层
程序看上去太罗嗦了,干嘛不调用子程序。

使用特权

评论回复
caijie001| | 2018-1-23 21:27 | 显示全部楼层
你是初学者吧?干嘛这样子写程序,去看看51单片机的教程,

使用特权

评论回复
caijie001| | 2018-1-23 21:28 | 显示全部楼层
ningling_21 发表于 2018-1-22 11:30
给出伪代码,自己填充
if( 按键1按下  || 按键2 按下)
{

使用特权

评论回复
caijie001| | 2018-1-23 21:31 | 显示全部楼层
dzm8365 发表于 2018-1-22 16:32
还想请教个问题,假如key2信号是间歇性的,1秒一次,要连续1.5秒没有检测到信号才反转。能实现吗? ...

1s为周期的信号?那你在1.5s的时候怎么知道他有没有信号啊。。。。。起码得2s吧?第1s有信号。第2s没有。才知道吧?

使用特权

评论回复
caijie001| | 2018-1-23 21:40 | 显示全部楼层
看看这个帖子:PWM细分控制步进电机算法
https://bbs.21ic.com/icview-2153564-1-1.html?fromuid=1875788
(出处: 21ic电子技术论坛)

使用特权

评论回复
877049204| | 2018-1-25 09:04 | 显示全部楼层
愿你学有所成

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝