找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3341|回复: 17
收起左侧

单片机一键怎控制步进电机正转和反转?

[复制链接]
ID:578423 发表于 2020-9-10 16:39 | 显示全部楼层 |阅读模式
功能要求:当安键KEY1安下且长安时步进电机正转70度停止,当松开时电机反转原位置。
小白写了个程序控制不了,安下键只能正转70度就停了,松开安键不能反转,没反应。问题在哪里,请大侠指点,非常感谢!
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;
#define  KEY_Status P10
#define  UP   20
#define  DOWN  30
#define  STOP  40

void delay()//延时程序
{
        unsigned i,j,k;
        for(i=0;i<0x02;i++)
                for(j=0;j<0x02;j++)
                        for(k=0;k<0xff;k++);
}
void SetpP()    //步进电机正转70度停止
  {

                uint j;
                j=155;        //正转70度
                while(j--)
                {
                      P2=0X08;//控制正转
                                        delay();
                                        delay();
                                        P2=0X04;
                                        delay();
                                        delay();
                                        P2=0X02;
                                        delay();
                                        delay();
                                        P2=0X01;
                                        delay();
                                        delay();
                        
                }
    while(1) ;
  }


void SetpN()
{
                uint j;
                j=155;        //反转70度
                while(j--)
                {
                P2=0X01;//控制反转 //0011
                                        delay();
                                        delay();
                                        P2=0X02;//0110
                                        delay();
                                        delay();
                                        P2=0X04;//1100
                                        delay();
                                        delay();
                                        P2=0X08;//1001
                                        delay();
                                        delay();
                        }
    while(1) ;
}




void Stop()
{
          P2=0X00;//电机停止
                                        delay();
                                        delay();
}


main()
{
        unsigned char i;
  i=0;                  //将i初始化为0
        P2=0x00;
        while(1)
  {               
  if(KEY_Status==0)     //如果键按下
        {
          delay();            //延时一段时间 按键消抖
          delay();
         if(KEY_Status==0)   //如果再次检测到S1键按下
                i++;               //i自增1
   if(i==3)                   //如果i=4,重新将其置为1
         i=1;
  }
               
        switch(i)
          {
                case 1:KEY_Status==0;SetpP();break;    //步进电机正转70度停止
          case 2:KEY_Status==1;SetpN();break;    //步进电机反转70度回原位
//                case 3:P2=0x00; Stop();break;          //步进电机停止
                default:P2=0x00;
    }
  }
}

51.png
回复

使用道具 举报

ID:578423 发表于 2020-9-10 16:41 | 显示全部楼层
提示这个错,
1.png
回复

使用道具 举报

ID:578423 发表于 2020-9-10 16:42 | 显示全部楼层
stepmotor.c(94): warning C275: expression with possibly no effect
回复

使用道具 举报

ID:213173 发表于 2020-9-10 20:38 | 显示全部楼层
1AJ1987402 发表于 2020-9-10 16:42
stepmotor.c(94): warning C275: expression with possibly no effect

2处语法错误
case 1:KEY_Status==0;SetpP();break;    //步进电机正转70度停止
case 2:KEY_Status==1;SetpN();break;    //步进电机反转70度回原位

Stop()没有被引用。
回复

使用道具 举报

ID:578423 发表于 2020-9-10 21:02 | 显示全部楼层
wulin 发表于 2020-9-10 20:38
2处语法错误
case 1:KEY_Status==0;SetpP();break;    //步进电机正转70度停止
case 2:KEY_Status==1;S ...

但安键按下来,第一步已工作,电机正转OK,就是松开安键时不进行第二步,
回复

使用道具 举报

ID:578423 发表于 2020-9-10 21:04 | 显示全部楼层
wulin 发表于 2020-9-10 20:38
2处语法错误
case 1:KEY_Status==0;SetpP();break;    //步进电机正转70度停止
case 2:KEY_Status==1;S ...

SetpP() 和SetpN()怎才可以引用?
回复

使用道具 举报

ID:213173 发表于 2020-9-11 05:41 | 显示全部楼层
1AJ1987402 发表于 2020-9-10 21:02
但安键按下来,第一步已工作,电机正转OK,就是松开安键时不进行第二步,

SetpP() 和SetpN()之一一旦被调用就会死在while(1);,永远出不来。
void SetpP()    //步进电机正转70度停止
{
        uint j;
        j=155;        //正转70度
        while(j--)
        {
                P2=0X08;//控制正转
                delay();
                delay();
                P2=0X04;
                delay();
                delay();
                P2=0X02;
                delay();
                delay();
                P2=0X01;
                delay();
                delay();
        }
        while(1);
}
void SetpN()
{
        uint j;
        j=155;        //反转70度
        while(j--)
        {
                P2=0X01;//控制反转 //0011
                delay();
                delay();
                P2=0X02;//0110
                delay();
                delay();
                P2=0X04;//1100
                delay();
                delay();
                P2=0X08;//1001
                delay();
                delay();
        }
        while(1);
}
回复

使用道具 举报

ID:280512 发表于 2020-9-11 08:23 | 显示全部楼层
程序停在While(1);
回复

使用道具 举报

ID:578423 发表于 2020-9-11 10:00 | 显示全部楼层
wulin 发表于 2020-9-11 05:41
SetpP() 和SetpN()之一一旦被调用就会死在while(1);,永远出不来。
void SetpP()    //步进电机正转70度 ...

要怎改?非常感谢指点,在线等
回复

使用道具 举报

ID:578423 发表于 2020-9-11 10:03 | 显示全部楼层

我是小白,要怎修改?非常感谢
回复

使用道具 举报

ID:280512 发表于 2020-9-11 14:31 | 显示全部楼层
本帖最后由 青桑叶 于 2020-9-11 17:31 编辑

void SetpP()    //步进电机正转70度停止
{
        uint j,k;
        j=155;        //正转70度
        while(j--)
        {
                P2=0X08;//控制正转
                delay();
                delay();
                P2=0X04;
                delay();
                delay();
                P2=0X02;
                delay();
                delay();
                P2=0X01;
                delay();
                delay();P2=0x00;delay();
         }
       // while(1);
   //void SetpN()
   // {
        //uint j;
       k=155;        //反转70度
        while(k--)
          {
                P2=0X01;//控制反转 //0011
                delay();
                delay();
                P2=0X02;//0110
                delay();
                delay();
                P2=0X04;//1100
                delay();
                delay();
                P2=0X08;//1001
                delay();
                delay();  P2=0x00;delay();
         }
      //}  
}
按下键盘后,正转结束紧接反转.供参考.共师兄习!!
回复

使用道具 举报

ID:578423 发表于 2020-9-11 17:42 | 显示全部楼层
本帖最后由 1AJ1987402 于 2020-9-11 17:54 编辑
青桑叶 发表于 2020-9-11 14:31
void SetpP()    //步进电机正转70度停止
{
        uint j,k;

stepmotor.c(95): warning C275: expression with possibly no effect
stepmotor.c(96): warning C275: expression with possibly no effect
stepmotor.c(96): warning C206: 'SetpN': missing function-prototyp安下键时电机正转,再反转,重复这样,我想要的是安键下来后转70度停下来,如果松开安键时才反转回原位,再安键下又正转70度,停下来等松开安键才反转70度停

回复

使用道具 举报

ID:10947 发表于 2020-9-11 18:20 | 显示全部楼层
能把流程描述出来,也就基本能写出源码了吧
回复

使用道具 举报

ID:578423 发表于 2020-9-11 18:28 | 显示全部楼层
lfc315 发表于 2020-9-11 18:20
能把流程描述出来,也就基本能写出源码了吧

功能就是用一个安键控制步进电机正反转:上电时电机不转,当有按键按下且长按正转50度,停止(就算一直安下安键也不转),当按键松开时电机反转50度回原位停止,等待下次同上安键操作。
回复

使用道具 举报

ID:280512 发表于 2020-9-12 17:32 | 显示全部楼层
说一下吧.你可以解决的.就是你在程序上加个判断条件:上升沿触发--正转;下降沿触发--反转;互相学习!!!
回复

使用道具 举报

ID:149799 发表于 2020-9-12 18:39 | 显示全部楼层
青桑叶 发表于 2020-9-12 17:32
说一下吧.你可以解决的.就是你在程序上加个判断条件:上升沿触发--正转;下降沿触发--反转;互相学习!!!

估计是按键按下的时间应该大于50°角用的时间。
回复

使用道具 举报

ID:553941 发表于 2020-9-17 16:44 | 显示全部楼层
感觉你对switch case有些误区,     case 1:KEY_Status==0;SetpP();break;    //步进电机正转70度停止
          case 2:KEY_Status==1;SetpN();break;    //步进电机反转70度回原位你这个感觉是要判断的,case里面只是执行,不判断
回复

使用道具 举报

ID:578423 发表于 2020-10-5 14:58 | 显示全部楼层
13303022280 发表于 2020-9-17 16:44
感觉你对switch case有些误区,     case 1:KEY_Status==0;SetpP();break;    //步进电机正转70度停止
    ...

非常感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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