找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键控制步进电机正反转程序,怎么不行呀

[复制链接]
跳转到指定楼层
楼主
ID:949074 发表于 2021-12-19 17:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <REGX51.H>
sbit key1=P1^0;
sbit key2=P1^1;
#define uchar unsigned char
#define uint unsigned int
uchar j;
uchar code steptr[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
uchar code steptl[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar *p;
void delayms(j)
{
        unsigned char i;
        TMOD=0X01;
        for(i=0;i<j;i++)
        {
                TH0=(65536-50000)/256;
                TL0=(65536-50000)%256;
                TR0=1;
                while(!TF0);
                        TF0=0;
        }
}

void key11()
{
        int flag=0;
                if(key1==0&&flag==0)
                {
                        flag=1;
                }
                        if(key1==1&&flag==1)
                        {
                                p=steptr;
                                flag=0;
                        }
}

void key22()
{
        int flag1=0;
                if(key2==0&&flag1==0)
                {
                        flag1=1;
                }
                        if(key2==1&&flag1==1)
                        {
                                p=steptl;
                                flag1=0;
                        }
}

void stepper()
{
        int i=0;
                for(i=0;i<8;i++,p++)
        {
                P2=*p;
                delayms(10);
        }
}

void main()
{
        while(1)
        {
                key11();
                key22();
                stepper();
        }
}

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

使用道具 举报

沙发
ID:993066 发表于 2021-12-19 19:26 | 只看该作者
/**************************************************************************************
*                         步进电机                                                                                  *

硬件连接:
           P0 -->矩阵键盘
                                         DOUT = P3^7;          //输出
                                         CLK  = P3^6;          //时钟
                                         DIN  = P3^4;          //输入
                                         CS   = P3^5;          //片选
                                         P10   = INA
                                         P11  =  INB
                                         P12  =  INC
                                         P13  =  INB
                                         
                                         OUT A+ A- B+ B-  连接电机  
                                         
                                         矩阵键盘:
                                         0      1      2       3
                                         
                                         4      5      6       7
                                         
                                       
注意事项:无                                                                                                                                                                  
***************************************************************************************/

#include "reg52.h"                       //此文件中定义了单片机的一些特殊功能寄存器
#include "lcd.h"
#include "key.h"
#include "XPT2046.h"
#include "42Motor.h"

#define u16 unsigned int           //对数据类型进行声明定义
#define u8 unsigned char


/*****************************************************************************/
void Display_rate();
/**************************************************************************

/*****************************************************************************/

u8 key_num;
u16 speed;
/*******************************************************************************/
bit dir,m_run;


/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       



       
        while(1)
                                {       
                                                        key_num=KeyDown();                    //读取键值
                                                        switch(key_num)
                                                                {
                                                                        case 0: m_run=~m_run; break;    //开/关
                                                                        case 1: dir=0;        break;    //正转
                                                                        case 2: dir=1;        break;                //反转
                                                                }
                                       
                                                        speed=Read_AD_Data(0x94)/4;       //取ad值
                                                        if(speed>200)      speed-=200;     
                                                        else               speed=1;        //
                                                               
                                                        if(m_run)                 Motor_Run(dir,speed);  //电机运行
                               
                                }       
                               
}
         
/*****************************************************************************/
/*32*/
/*******************************************************************************/
回复

使用道具 举报

板凳
ID:979299 发表于 2021-12-19 20:01 | 只看该作者
是什么不行啊,程序看上去没什么问题,配上电路图大家好分析啊
回复

使用道具 举报

地板
ID:949074 发表于 2021-12-19 20:25 | 只看该作者
兴安xa 发表于 2021-12-19 20:01
是什么不行啊,程序看上去没什么问题,配上电路图大家好分析啊

电路图没问题,p1.0,p1.1接按键接0v,p2.0-2.3接电机启动信号
回复

使用道具 举报

5#
ID:824490 发表于 2021-12-19 21:05 | 只看该作者
这个代码的结构,我坦白,我看不明白。。。

回复

使用道具 举报

6#
ID:949074 发表于 2021-12-19 21:35 | 只看该作者
akesking 发表于 2021-12-19 19:26
/**************************************************************************************
*                         ...

ok,谢谢
回复

使用道具 举报

7#
ID:883242 发表于 2021-12-19 22:43 | 只看该作者
硬件怎么接的?没硬件软件就是无根之草。
回复

使用道具 举报

8#
ID:739610 发表于 2021-12-19 23:03 | 只看该作者
p2.0-2.3是直接驱动步进电机么?需要加驱动电路的  没有电路图  没法具体分析  有条件的话用示波器看一下波形
回复

使用道具 举报

9#
ID:949074 发表于 2021-12-19 23:13 来自手机 | 只看该作者
00云梦泽00 发表于 2021-12-19 23:03
p2.0-2.3是直接驱动步进电机么?需要加驱动电路的  没有电路图  没法具体分析  有条件的话用示波器看一下波 ...

有驱动的,程序没问题吧
回复

使用道具 举报

10#
ID:949074 发表于 2021-12-19 23:14 来自手机 | 只看该作者
Hephaestus 发表于 2021-12-19 22:43
硬件怎么接的?没硬件软件就是无根之草。

电路图没问题,p1.0,p1.1接按键接0v,p2.0-2.3接电机驱动信号,接驱动板,控制步进电机
回复

使用道具 举报

11#
ID:799986 发表于 2021-12-19 23:28 | 只看该作者
有驱动的,程序没问题吧
回复

使用道具 举报

12#
ID:883242 发表于 2021-12-19 23:29 | 只看该作者
l156613673 发表于 2021-12-19 23:14
电路图没问题,p1.0,p1.1接按键接0v,p2.0-2.3接电机驱动信号,接驱动板,控制步进电机

电机驱动信号又是个啥?
回复

使用道具 举报

13#
ID:844772 发表于 2021-12-20 08:58 | 只看该作者
这程序是哪里抄来的啊,至少有2个问题。
1。 void key11()  int flag=0;  // 这个flag变量要改成 static ,否则按键无效的。另外的一个也要改。
2。 void stepper()
{
        int i=0;
                for(i=0;i<8;i++,p++) //删掉p++
        {
                P2=*p; // 改为 P2=*(p+i); 否则只能走8步。
                delayms(10);
        }
}
回复

使用道具 举报

14#
ID:979299 发表于 2021-12-20 14:02 | 只看该作者
电路没问题也可以用下面的程序试试
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code FFW[]=
{
        0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
};

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

sbit K1 = P1^0;
sbit K2 = P1^1;

void DelayMS(uint ms)
{
        uchar i;
        while(ms--)
        {
                 for(i=0;i<120;i++);
        }
}

void SETP_MOTOR_FFW(uchar n)
{
        uchar i,j;
        for(i=0;i<5*n;i++)
        {
                 for(j=0;j<8;j++)
                {
                        P2 = FFW[j];
                        DelayMS(25);
                }
        }
}

void SETP_MOTOR_REV(uchar n)
{
        uchar i,j;
        for(i=0;i<5*n;i++)
        {
                 for(j=0;j<8;j++)
                {
                        P2 = REV[j];
                        DelayMS(25);
                }
        }
}

void main()
{
        uchar N = 3;
        while(1)
        {
                 if(K1 == 0)
                {
                         P2 = 0xfe;
                        SETP_MOTOR_FFW(N);
                }
                else if(K2 == 0)
                {
                         P2 = 0xfd;
                        SETP_MOTOR_REV(N);
                }
        }
}
回复

使用道具 举报

15#
ID:994053 发表于 2021-12-24 14:01 | 只看该作者
这个程序看不明白
回复

使用道具 举报

16#
ID:407019 发表于 2021-12-25 14:18 | 只看该作者
void stepper()
{
        int i=0;
                for(i=0;i<8;i++,p++)
        {
                P2=*p;
                delayms(10);
        }
}


修改一下

void stepper()
{
        int i=0;
                for(i=0;i<8;i++)
        {
                P2=*p;
                 p++;
                delayms(5);
        }
}

尝试一下   
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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