本单片机是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
上一篇:单片机四层电梯控制系统设计最终版(含仿真+报告+程序源码)
下一篇:单片机全自动洗衣机程序+仿真+原理图设计调试与分析
推荐阅读最新更新时间:2024-11-19 22:37
设计资源 培训 开发板 精华推荐
- LTC3526BEDC 2 节至 5V 升压转换器的典型应用电路
- 【PSVitaLCD】一台普普通通的显示器
- 使用 Richtek Technology Corporation 的 RT7240 的参考设计
- 65W,交流转直流单输出笔记本电源
- LT3748 演示板,30V 至 75V 输入至隔离式 12V @ 1A
- 使用 Analog Devices 的 ADuM4160BRWZ 的参考设计
- Cube-507_1.54寸IPS模块
- 使用 Infineon Technologies AG 的 OM1320NMM 的参考设计
- 具有双输入的 LTC3126EFE 5V、2MHz 降压转换器的典型应用电路
- LT8601EUJ 同步降压型稳压器的典型应用电路