单片机控制步进电机正、反转、步数等程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define uint unsigned int
#define uchar unsigned char
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
uchar FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
uchar k4_flag=0,k1_flag=0,k2_flag=0,k3_flag=0;
uchar step_num=3,a;
//=============================
void shezhi();
void DelayMS(uint ms);//延时函数
void zhengzhuan(uchar n);//正转
void fanzhuan(uchar n);//反转
void anjian(void);
//==================================================== void DelayMS(uint ms)//延时函数
{uchar i;
while(ms--)
{for(i=0;i<120;i++);
}
}
//==================================================== void zhengzhuan(uchar n)//正转
{uchar i,j;
for(i=0;i {for(j=0;j<8;j++) {if(k3 == 0) break; P1 = FFW[j]; DelayMS(25); } } } //============================= void fanzhuan(uchar n)//反转 {uchar i,j; for(i=0;i {for(j=0;j<8;j++) {if(k3 == 0) break; P1 = REV[j]; DelayMS(25); } } } //============================= void anjian(void) { if(k1==0) k1_flag=1; if(k2==0) k2_flag=1; if(k3==0) k3_flag=1; if(k4==0){k4_flag++;shezhi();} DelayMS(25); } //============================= void shezhi() {if(a==0) k1_flag=1; if(a==1) k2_flag=1; switch(k4_flag) {case 1:step_num=3;break; case 2:step_num=6;break; case 3:step_num=9;break; case 4:step_num=12;break; case 5:step_num=15;break; case 6:step_num=18;break; case 7:step_num=21;break; case 8:step_num=24;break; case 9:step_num=27;break; } } //============================= void main() { while(1) {anjian(); while(k1_flag==1) {a=0; zhengzhuan(step_num); P0=0xfe; if(P3!=0xff) {k1_flag=0;break;} } while(k2_flag==1) {a=1; fanzhuan(step_num); P0=0xfd; if(P3!=0xff) {k2_flag=0;break;} } if(k3_flag==1) {P0=0xfb; if(P3!=0xff) k3_flag=0; } }