分享

STC89C52RC单片机控制步进电机仿真与程序

 共同成长888 2019-12-17

供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,是初学者的好例程。

实物图:
仿真原理图如下

单片机源程序如下:

/*本单片机是STC89C52RC,本程序应用于step motor--28BYJ,小型步进电机,

   供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,*/

#include

#define uchar unsigned char//数据宏定义

#define uint unsigned int

#define A P10 //

#define _A P11 //步进电机脉冲接口

#define B P12 //

#define _B P13 //步进电机脉冲接口

uchar su_du=0;       //转速

bit fang_xiang=0;    //方向

bit qi_dong=0;       //启动标志

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

#include//包含移位标准库函数头文件

sbit DU = P2^6;//数码管段选

sbit WE = P2^7;//数码管段选

//共阴数码管段选表0-9

uchar  code shu_ma[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};

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

/*====================================

函数        : delay(uint z)

参数        :z 延时毫秒设定,取值范围0-65535

返回值        :无

描述        :12T/Fosc11.0592M毫秒级延时

====================================*/

void delay(uint z)

{

        uint x,y;

        for(x = z; x > 0; x--)

                for(y = 114; y > 0 ; y--);                 

/*====================================

函数        :display(uchar i)

参数        :i 显示数值,取值范围0-255

返回值        :无

描述        :三位共阴数码管动态显示

====================================*/

void display(uchar i)                                                 //数据处理

{

        uchar bai, shi, ge;

//        bai = i / 100; //236 / 100  = 2

//        shi = i % 100 / 10;        //236 % 100 / 10 = 3

        ge  = i;// % 10;//236 % 10 =6

/*  第一位数码管                  

        P0 = 0XFF;//清除断码

        WE = 1;//打开位选锁存器

        P0 = 0XFE; //1111 1110

        WE = 0;//锁存位选数据

        DU = 1;//打开段选锁存器

        P0 = shu_ma[bai];//

        DU = 0;//锁存段选数据

        delay(5);

        //第二位数码管

        P0 = 0XFF;//清除断码

        WE = 1;//打开位选锁存器

        P0 = 0XFD; //1111 1101

        WE = 0;//锁存位选数据

        DU = 1;//打开段选锁存器

        P0 = shu_ma[shi];//

        DU = 0;//锁存段选数据

        delay(5);*/

/*********        第三位数码管 */

        P0 = 0XFF;//清除断码

        WE = 1;//打开位选锁存器

        P0 = 0XFB; //1111 1011

        WE = 0;//锁存位选数据

        DU = 1;//打开段选锁存器

        P0 = shu_ma[ge];//

        DU = 0;//锁存段选数据

        delay(5);

}

void yanshi2(uint a)          //延时程序

{

        while(a--);

}

uchar an_jian()         //按键检测,P3.0,P3.1,P3.2,P3.3分别接4个按键

{

        if((P3&0x0f)!=0x0f)//判断 P3只要有一个按键按下,就延时返回按键值。

        {

                yanshi2(20000);

                if((P3&0x0f)!=0x0f)

                {

                        return P3&0x0f;

                }

        }

        return P3&0x0f;

}

void yanshi()                        //步进电机延时时间

{

        uint sd1=0;

        sd1=8000+5753*(10-su_du);//        su_du值越大,周期越短,频率越高

        while(sd1--)

        {

                if((P3&0x0f)!=0x0f)return;  //在延时里面判断有没有按键按下,有就直接返回主函数

        }

}

void bu_jin()                     //每调用一次步进电机向指定方向走一步

{

        static char j=1;         //把起始速度设置为1。

        if(fang_xiang)                 //判断方向位,为1则按正相序循环,

        {

                j++;

                if(j==5)j=1;

        }

        else

        {

                j--;

                if(j==0)j=4;         //否则,按反相序循环

        }

        switch(j)                         //根据拍数选择不同的电压组合

        {

                case 1:

                        A=1;B=1;_A=0;_B=0;yanshi(); //ab  1100

                break;

                case 2:

                        A=0;B=1;_A=1;_B=0;yanshi(); //a~b 0110

                break;

                case 3:

                        A=0;B=0;_A=1;_B=1;yanshi(); //a~b~0011

                break;

                case 4:

                        A=1;B=0;_A=0;_B=1;yanshi(); //ab~ 1001

                break;

        }

}

void main()

{

        P14=0;//方向标志

        P15=0;//启动 标志

        while(1)

        {

                switch(an_jian())                         //按键处理

                {

                        case 0x0e:                                   //第一个按键按下按键状态取反,启动/停止

                                qi_dong=!qi_dong;

                                P15=qi_dong;            //状态指示

                        break;

                        case 0x0d:                                        //第二个按键按下,速度加

                                if(su_du<9)

                                        su_du++;                 //速度加

                        break;

                        case 0x0b:                                   //第三个按键按下,速度减

                                if(su_du>0)


关键字:STC89C52RC  单片机控制  步进电机 编辑:什么鱼 引用地址:http://news./mcu/ic482102.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多