Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据测试

89c52单片机控制两个步进电机正反转加减速(程序+仿真)

89c52单片机控制两个步进电机正反转加减速(程序+仿真)

先上图:
在这里插入图片描述
源代码:

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

* 实 验 名: 步进电机实验

* 使用的IO: 电机用P2口,按键使用P1.0、P1.1、P1.2、P1.3、P1.4、P1.5

* 按键功能:K1;正转  K2;反转  K3;低速转动  K4;高速转动  K5:电机切换  K6;停止

* 实验效果: 按下K1键,顺时针转,按下K2键,逆时针转,按下K3键,低速,按下K4键,高速。
                        按下K5键,转动的电机停止,并切换到控制另一个电机
                        按下K6键,转动的电机停止,按下K1或K2时,刚才停止的电机继续转动


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

#include "reg52.h"


//电机IO

#define GPIO_MOTOR P2            //宏定义 对端口进行操作,定义电机接口为P1

//sbit F1 = P2^0;

//sbit F2 = P2^1;

//sbit F3 = P2^2;

//sbit F4 = P2^3;

//sbit F5 = P2^4;

//sbit F6 = P2^5;

//sbit F7 = P2^6;

//sbit F8 = P2^7;                //另种操作,位操作,定义电机接口为P1.0~p1.7

//按键IO

sbit K1=P1^0;          //正转

sbit K2=P1^1;          //反转

sbit K3=P1^2;          // 减速

sbit K4=P1^3;          // 加速

sbit K5=P1^4;          // 电机切换

sbit K6=P1^5;          // 停止

unsigned char code FFW_X[8]= {0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //X反转顺序

unsigned char code FFZ_X[8]= {0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //X正转顺序

unsigned char code FFW_Y[8]= {0x1f,0x3f,0x2f,0x6f,0x4f,0xcf,0x8f,0x9f}; //Y反转顺序

unsigned char code FFZ_Y[8]= {0x9f,0x8f,0xcf,0x4f,0x6f,0x2f,0x3f,0x1f}; //Y正转顺序

unsigned char Direction,Speed,X_Y=0,stop=0;           //  Direction  转向标志位,Speed 延时函数的参数,通过改变它大小来控制电机转速
//X_Y 电机的参数  X_Y=0为Y电机 X_Y=1为X电机
void Delay(unsigned int t);                                           //stop为控制电机停止的标志位,但它为1时,电机停止

void Motor();                                                                   //电机旋转函数


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

* 函 数 名 : main

* 函数功能 : 主函数

* 输    入 : 无

* 输    出 : 无

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


void main(void)

{

    unsigned char i;

    Speed=20;                   //Speed 延时函数的参数,通过改变它大小来控制电机转速

    while(1)

    {

        /********************检测按键K1是否按下***********************/
        if(K1==0) //检测按键K1是否按下

        {

            Delay(1); //消除抖动

            if(K1==0)

            {

                Direction=1;           //Direction 转向标志位,为1时为正转
                stop=0;                   //按下K1时,对stop停止标志位清零,如果之前按下停止键,清零之后才能启动

            }

            while((i<200)&&(K1==0))//检测按键是否松开

            {

                Delay(1);

                i++;

            }

            i=0;

        }

        /********************检测按键K2是否按下***********************/

        if(K2==0) //检测按键K2是否按下

        {

            Delay(1); //消除抖动

            if(K2==0)

            {

                Direction=2;                  //Direction 转向标志位,为2时为反转
                stop=0;                          //按下K1时,也对stop停止标志位清零,如果之前按下停止键,清零之后才能启动

            }

            while((i<200)&&(K2==0))//检测按键是否松开

            {

                Delay(1);

                i++;

            }

            i=0;

        }

        /********************检测按键K3是否按下***********************/
        if(K3==0)//检测按键K3是否按下

        {

            Delay(1);//消除抖动

            if(K3==0)

            {

                Speed=60;                                   //Speed 延时函数的参数,通过改变它大小来控制电机转速
                //87行代码定义Speed=30;但按键K3按下后,Speed=60,这时转速就会降下来
            }

            while((i<200)&&(K3==0))//检测按键是否松开

            {

                Delay(1);

                i++;

            }

            i=0;

        }


        /********************检测按键K3是否按下***********************/

        if(K4==0) //检测按键K4是否按下

        {

            Delay(1); //消除抖动

            if(K4==0)

            {

                Speed=30;                         //Speed 延时函数的参数,通过改变它大小来控制电机转速
                //87行代码定义Speed=30;但按键K4按下后,Speed=20,这时转速就会降下来升上去
            }

            while((i<200)&&(K4==0))//检测按键是否松开

            {

                Delay(1);

                i++;

            }

            i=0;

        }

        if(K5==0)//检测按键K1是否按下

        {

            Delay(1);//消除抖动

            if(K5==0)

            {
                Direction=0;                                   //X_Y 电机的参数  X_Y=0为Y电机 X_Y=1为X电机
                if(X_Y==0)                                   //当切换电机时,对Direction=0;对标志位清零,防止上个电机的转向影响本次所控电机
                    X_Y=1;
                else
                    X_Y=0;

            }

            while((i<200)&&(K5==0))//检测按键是否松开

            {

                Delay(1);

                i++;

            }

            i=0;

        }

        if(K6==0)//检测按键K1是否按下

        {

            Delay(1);//消除抖动

            if(K6==0)

            {
                stop=1;                                   //stop为控制电机停止的标志位,但它为1时,电机停止

            }

            while((i<200)&&(K6==0))//检测按键是否松开

            {

                Delay(1);

                i++;

            }

            i=0;

        }

        Motor();

    }

}

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

* 函 数 名: Motor

* 函数功能: 电机旋转函数

* 输    入: 无

* 输    出: 无

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


void Motor()

{

    unsigned char i;

    for(i=0; i<8; i++)

    {

        if(Direction==1&&X_Y==0&&stop==0)                 //正转&Y电机&电机没按下停止

            GPIO_MOTOR = FFW_Y[i]&0xf0;//取数据,‘&’按位与

        if(Direction==2&&X_Y==0&&stop==0)                 //反转&Y电机&电机没按下停止

            GPIO_MOTOR = FFZ_Y[i]&0xf0;

        if(Direction==1&&X_Y!=0&&stop==0)                 //正转&X电机&电机没按下停止

            GPIO_MOTOR = FFW_X[i]&0x0F;//取数据

        if(Direction==2&&X_Y!=0&&stop==0)                 //反转&X电机&电机没按下停止

            GPIO_MOTOR = FFZ_X[i]&0x0f;

        Delay(Speed); //调节转速

    }

}

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

* 函 数 名  : Delay

* 函数功能  : 延时

* 输    入  : t

* 输    出  : 无

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

void Delay(unsigned int t)

{

    unsigned int k;

    while(t--)

    {

        for(k=0; k<45; k++)

        { }

    }

}

代码就只有一个主文件就不上传文件了,直接新建一个,c,文件复制粘贴进去就可以了。

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 内容搜索排序表达式的最佳实践

下一篇: (一)Jetson Nano开发:JetPack下载安装(很多细节)

精华推荐