历史上的今天
返回首页

历史上的今天

今天是:2024年12月05日(星期四)

正在发生

2019年12月05日 | STC89C52RC单片机控制步进电机仿真与程序

2019-12-05 来源:51hei

本单片机是STC89C52RC,本程序应用于step motor--28BYJ,小型步进电机,供电电压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)

                                        su_du--;                 //速度减

                        break;

                        case 0x07:                                         //第四个按键按下按键状态取反,方向转换

                                fang_xiang=!fang_xiang;          

                                P34=fang_xiang;            //方向指示灯

                        break;

                }

        

                if(qi_dong)                                                 //启动按钮为1

推荐阅读

史海拾趣

Harvatek Corporation公司的发展小趣事

背景:在电子产品领域,品质是企业生存和发展的基石。Hantronix深知这一点,因此始终将品质保证放在首位。

发展:公司所有生产设施都通过了ISO 9001等国际质量管理体系认证,部分设施还通过了ISO/TS 16949等更高标准的认证。这些认证不仅证明了Hantronix在品质管理方面的卓越能力,也为其赢得了更多客户的信任和合作机会。

博众电气(BOZHONG ELECTRIC)公司的发展小趣事

博众电气始终坚信,品质是企业生存和发展的根本。因此,公司始终将品质管理放在首位,并严格执行ISO9001等国际质量管理体系标准。

为了进一步提升产品品质和管理水平,博众电气还积极申请并通过了多项国际认证。这些认证不仅证明了博众电气的产品品质和管理水平达到了国际先进水平,还为公司的国际化发展提供了有力保障。

Atlantic Microwave Ltd公司的发展小趣事

随着电子行业的快速发展,Atlantic Microwave Ltd公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。公司投入大量研发资金,吸引了一批优秀的科研人才,专注于微波技术的研发与创新。经过数年的努力,公司成功推出了一款具有颠覆性的微波产品,凭借其卓越的性能和稳定性,迅速获得了市场的认可,为公司带来了可观的收益。

广州盛炬(GZSJ)公司的发展小趣事

随着电子行业的快速发展,Atlantic Microwave Ltd公司意识到,只有不断创新才能在激烈的市场竞争中立于不败之地。公司投入大量研发资金,吸引了一批优秀的科研人才,专注于微波技术的研发与创新。经过数年的努力,公司成功推出了一款具有颠覆性的微波产品,凭借其卓越的性能和稳定性,迅速获得了市场的认可,为公司带来了可观的收益。

Electronic公司的发展小趣事

华为,作为中国的科技巨头,其在电子行业的发展历程中展现出了强大的技术实力和全球视野。华为在通信领域取得了多项技术突破,如5G技术的领先和智能手机拍照技术的创新。同时,华为还积极拓展全球市场,与全球运营商建立了广泛的合作关系。然而,面对国际市场的复杂环境和竞争压力,华为也面临着诸多挑战和不确定性。

GC Electronics公司的发展小趣事
如发现传感器、报警装置或电路中的其他部件损坏,应及时更换,以确保报警电路的可靠性。

问答坊 | AI 解惑

dxp中的一些基本知识,与大家分享一下

文件夹中包含以下内容 PCB设计技巧百问.pdf PROTEL 软件使用的误区及几个不易搞清的概念.pdf Protel同类修改.pdf 在Protel DXP中建造自己的原理图库.doc …

查看全部问答>

AD620资料

本帖最后由 paulhyde 于 2014-9-15 09:27 编辑 AD620资料,希望对大家有用!!  …

查看全部问答>

设备的驱动器正防止机器进入待机状态

系统待机 恢复的时候暴这个错  怎么编写驱动不出现这个提示?…

查看全部问答>

WinCE 系统下WinCE 自导recorder.exe 文件录音功能无法实现

WinCE 系统下WinCE 自导recorder.exe 文件录音功能无法实现。 问题描述如下 WinCE系统能够启动,我在NK里面添加了一个MP3文件,(把mp3文件编译到内核)能播放,说明音频驱动加载成功,耳机的输出口硬件也没有问题,可是打开那个recorder文件的时 ...…

查看全部问答>

各位帮忙看看这段代码存在的内存泄漏,谢谢啦

void CRS2USBDlg::OnTimer(UINT nIDEvent) {         // TODO: Add your message handler code here and/or call default         HKEY hKey = HKEY_LOCAL_MACHINE;         D ...…

查看全部问答>

转让95成新 Fusion StartKit FPGA开发平台套间+FlashPro3 Actel FPGA USB下载器

RT,带发票,原价  1480 + 680 = 2160元,现700出了  交易爽快的赠送《我和LabVIEW一本》和包邮,不多说,上图。QQ282484887   官方的介绍: http://www.embedtools.com/pro_kaifa/FPGA/Flash ...…

查看全部问答>

求教 可用于测量播种的种子的精确位置的技术

      如题,本人菜鸟,专业不是测控或者传感器,今年考上了农业机械化的研究生,导师给我一个任务就是寻找可以测量种子的具体位置的技术或者装置。      我有过的一些想法:      1、类似蝙蝠或者海 ...…

查看全部问答>

不急的,用430板子 做个 模拟 键盘几个连续按键操作 谁指点下啊

用430板子 做个 模拟 键盘几个连续按键操作 谁指点下啊…

查看全部问答>

提问+STC的51单片机到底稳定不稳定?

STC的51单片机到底稳定不稳定? 听说抗干扰能力差,做东西玩玩还行,用在工业领域就不行了,但是STC的芯片基本上都有工业级的,到底靠不靠谱? …

查看全部问答>