历史上的今天
今天是: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
史海拾趣
|
文件夹中包含以下内容 PCB设计技巧百问.pdf PROTEL 软件使用的误区及几个不易搞清的概念.pdf Protel同类修改.pdf 在Protel DXP中建造自己的原理图库.doc … 查看全部问答> |
|
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、类似蝙蝠或者海 ...… 查看全部问答> |
|
STC的51单片机到底稳定不稳定? 听说抗干扰能力差,做东西玩玩还行,用在工业领域就不行了,但是STC的芯片基本上都有工业级的,到底靠不靠谱? … 查看全部问答> |




