本单片机是STC89C52RC,本程序应用于step motor--28BYJ,小型步进电机,
供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,
控制步进电机启动/停止,正反转,加减速,并有运行,及转换状态显示。
是初学者的好例程。
实物图:
大家好,我是智成电子DIY,我会不定时写一下简单实用的源码分享给大家,
当然是分享给初学单片机的,大神请自觉飘过。原创首发的当然会在我们的《51黑电子论坛》网址:http://www.51hei.com/bbs/ 偶尔也会发到我的新浪博客(附件里面有地址)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*本单片机是STC89C52RC,本程序应用于step motor--28BYJ,小型步进电机,
- 供电电压DC5V,可直接接于单片机通过ul2003驱动芯片驱动,数码管是共阴极接口,*/
- #include <STC89C5xRC.H>
- #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 <intrins.h>//包含移位标准库函数头文件
- 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
- {
- bu_jin(); //步进电机
- }
- else P1=0X0F; //停止状态,脉冲输出端口全部停止输出
- display(su_du); //数码管显示函数
- }
-
- }
复制代码 下面插个小广告:
在这里会有精彩有趣的单片机DIY套件产品和优质原创的源码。
包括淘宝最低价的微型激光雕刻机支持脱机打印的,用51单片机打造(原创哦)。
6足4足蜘蛛仿生机器人,同样是用51单片机打造,控制18路舵机完成各个动作
还可以手机wifi控制,提供所有资料(单片机源码,APP源码,电路,PCB等)
还会有其他强大有趣的设计,如解魔法机器人,智能小车等。
您有好的想法也可以联系我,我们一起开发更多有用的产品!
此附件由于多人回帖说代码有错误,已经被管理员删除,无法下载
单片机控制步进电机.rar
(361.69 KB, 下载次数: 299)
|