步进电机正反转控制C语言程序 只为初学者
89C51单片机对步进电动机的C语言控制程序

89C51单片机对步进电动机的控制程序啊?兄弟做的如何了?我也是不懂啊,真是有点同病相怜了这个程序是课程设计的,现在老师要复杂点的,不让用延时程序了,因为浪费CPU时间,改为定时器扫描防抖,还有显示是用四个数码管,用四个键控制,其中一个起停,一个正反转,两个加减速。
我只能写到这些了,你有何进展,交流一下吧#define uchar unsigned char //定义一下方便使用#define uint unsigned int#define ulong unsigned long#include <reg52.h> //包括一个52标准内核的头文件sbit P10 = P1^0; //头文件中没有定义的IO就要自己来定义了sbit P11 = P1^1;sbit P12 = P1^2;sbit P13 = P1^3;sbit K1 = P3^2;sbit K2 = P3^5;sbit K3 = P3^6;sbit K4 = P3^7;sbit P20=P2^0;sbit P21=P2^1;bit ldelay=0; //长定时溢出标记,预置是0uchar a,m=50;uchar result;uint b,n;uint i,j;char code dx516[3] _at_ 0x003b;//这是为了仿真设置的/*********************************************************************** ***********///电机正转void zheng_z(){ uchar code ledp1[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};//预定的写入P1的值正转uchar ledi1; //用来指示正转显示顺序P1=ledp1[ledi1];//读出一个值送到P1口ledi1++;//指向下一个if(ledi1==8)ledi1=0; //到了最后一个灯就换到第一个}//电机反转void fan_z(){ uchar code ledp2[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe};//预定的写入P1的值反转uchar ledi2; //用来指示反转显示顺序P1=ledp2[ledi2];//读出一个值送到P1口ledi2++; //指向下一个if(ledi2==8)ledi2=0; //到了最后一个灯就换到第一个}//减速void jian_s(){m+=5;if(m>=50)m=50;}//加速void jia_su(){ m-=5;if(m<=10)m=10;}/*******************************************************************/ void delay(uint j){j=100;for(i=0;i<j;i++){;}}void display(uint x){switch(x){case 0: P0=0xC0;break;case 1: P0=0xF9;break;case 2: P0=0xA4;break;case 3: P0=0xB0;break;case 4: P0=0x99;break;case 5: P0=0x92;break;case 6: P0=0x82;break;case 7: P0=0xF8;break;case 8: P0=0x80;break;case 9: P0=0x90;break;}}void sudu(uint c){switch(c){case 50: result=15;break;case 45: result=17;break;case 40: result=19;break;case 35: result=21;break;case 30: result=25;break;case 25: result=30;break;case 20: result=38;break;case 15: result=50;break;case 10: result=75;break;}}/*******************************************************************/ //主程序void main(void){TMOD = 0x01; //设定时器0为16位模式TH0 =0xdb; //赋T0的预置值0xdbTL0 =0xff;TR0=1; //启动定时器ET0=1; //打开定时器0中断EA=1; //打开总中断while(1) //主程扫描各键值{if(ldelay) //发现有时间溢出标记,进入处理{ldelay=0; //清除标记zheng_z();if(!K3)a=1; //如果读到K3为0if(!K4)a=0; //如果读到K4为0if(a==1)zheng_z();elsefan_z();if(!K1) //如果读到K1为0jian_s(); //减速if(!K2) //如果读到K2为0jia_su(); //加速/*********************************************************************** ************/sudu(m);b=result/10;n=result%10;P20=1;P21=0;display(b);delay (2);P20=~P20;P21=~P21;display(n);delay (2);}}}//定时器0中断timer0() interrupt 1{static uchar t;TH0 =0xdb; //赋T0的预置值0xdbTL0 =0xff;//TF0=0;t++;if(t==m){ t=0;ldelay=1;}}//定时器1中断/*timer1() interrupt 3{static uchar t;TF0=0;t++;if(t==20) { t=0; ldelay=1; } }*/。
步进电机【C语言驱动程序】

/*C语言代码:*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar code CCW[4]={0xFC,0xF6,0xF3,0xF9}; //逆时钟旋转相序表 uchar code CW[4]={0xFC,0xF9,0xF3,0xF6}; //正时钟旋转相序表sbit K1=P1^5; //反转按键sbit K2=P1^6; //正转按键sbit K3=P1^7; //停止按键sbit FMQ=P1^4; // 蜂鸣器void delaynms(uint aa){uchar bb;while(aa--){for(bb=0;bb<110;bb++) //1ms基准延时程序{;}}}void delay500us(void){int j;for(j=0;j<57;j++){;}}void beep(void){uchar t;for(t=0;t<100;t++){delay500us();FMQ=!FMQ; //产生脉冲}FMQ=1; //关闭蜂鸣器}void motor_ccw(void){uchar i,j;for(j=0;j<4;j++) //电机旋转一周,不是外面所看到的一周,是里面的传动轮转了一周{if(K3==0){break; //如果K3按下,退出此循环}for(i=0;i<8;i++) //旋转45度{P0=CCW[i];delaynms(10); //调节转速}}}void motor_cw(void){uchar i,j;for(j=0;j<4;j++){if(K3==0){break; //如果K3按下,退出此循环}for(i=0;i<8;i++) //旋转45度{P0=CW[i];delaynms(2); //调节转速}}}void main(void){uchar r;uchar N=64; //因为步进电机是减速步进电机,减速比的1/64 , //所以N=64时,步进电机主轴转一圈while(1){if(K1==0){beep();for(r=0;r<N;r++){motor_ccw(); //电机逆转if(K3==0){beep();break;}}}else if(K2==0){beep();for(r=0;r<N;r++){motor_cw(); //电机反转if(K3==0){beep();break;}}}elseP0=0x00; //电机停止}}。
步进电机c程序

步进电机控制程序(2008-06-05 19:07:55)转载分类:程序设计标签:it步进电机(键盘控制可调速)#include <reg51.h>#define uchar unsigned charstatic unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越大,最小值为1,速度最慢static int spcount; //步进电机转速参数计数void ddelay(void); //键盘扫描延时函数void delay(unsigned int endcount); //延时函数,延时为endcount*1毫秒void gorun(); //步进电机控制步进函数sbit P10=P2^0 ; //电机端口定义sbit P11=P2^1 ;sbit P12=P2^2;sbit P13=P2^3 ;void ddelay(void){uchar i;for (i=300;i>0;i--);}uchar keyscan(void){uchar scancode;uchar tmpcode;P1 = 0xf8; // 发全0行扫描码if ((P1&0xf8)!=0xf8) // 若有键按下{ddelay(); // 延时去抖动if ((P1&0xf8)!=0xf8) // 延时后再判断一次,去除抖动影响{scancode = 0xfe;while((scancode&0x08)!=0) // 逐行扫描{P1 = scancode; // 输出行扫描码if ((P1&0xf8)!=0xf8) // 本行有键按下tmpcode = (P1&0xf8)|0x07;return((~scancode)+(~tmpcode)); // 返回特征字节码,为1的位即对应于行和列 }else scancode = (scancode<<1)|0x01; // 行扫描码左移一位}}}return(0); // 无键按下,返回值为0}void main(void){uchar key;count = 0;step_index = 0;spcount = 0;P10 = 0;P11 = 0;P12 = 0;P13 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFc;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数stop_flag = 0;turn=0;speedlevel = 20;while(1){key = keyscan();switch(key){case 0x09: //按键#,正转以speedlevel = 1的速度转1000*0.5MS=0.5Sstop_flag=0;turn = 0;speedlevel =10;gorun();delay(1000);break;case 0x0c: //按键*,停止2000*0.5MS=0.5Sstop_flag=1;break;case 0x0a: //按键0,反转以speedlevel = 1的速度转1000*0.5MS=0.5Sstop_flag=0;turn=1;speedlevel =10;gorun();delay(1000);break;case 0x11: // 按键9,以--speedlevel的加速转1000*0.5MS=0.5Sstop_flag=0;if (speedlevel==1){ speedlevel=1;}else { --speedlevel;}gorun();delay(1000);break;case 0x12: // 按键8,以++speedlevel的减速转1000*0.5MS=0.5Sstop_flag=0;++speedlevel;gorun();delay(1000);break;}}}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFc;TL0=0x18; //设定时每隔1ms中断一次count++;spcount--;if(spcount<=0) //速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL),{ // 频率越小,速度越慢spcount = speedlevel;gorun();}}void delay(unsigned int endcount)//延时函数,延时为endcount*0.5毫秒{count=0;do{}while(count<endcount);void gorun(){if (stop_flag==1) {P10 = 0;P11 = 0;P12 = 0;P13 = 0;return;}switch(step_index) {case 0: //0P10 = 1;P11 = 0;P12 = 0;P13 = 0;break;case 1: //0、1P10 = 1;P11 = 1;P12 = 0;P13 = 0;break;case 2: //1P10 = 0;P11 = 1;P12 = 0;P13 = 0;break;case 3: //1、2P10 = 0;P11 = 1;P12 = 1;P13 = 0;break;case 4: //2P10 = 0;P11 = 0;P12 = 1;P13 = 0;break;case 5: //2、3P10 = 0;P11 = 0;P12 = 1;P13 = 1;break;case 6: //3P10 = 0;P11 = 0;P12 = 0;P13 = 1;break;case 7: //3、0P10 = 1;P11 = 0;P12 = 0;P13 = 1;}if (turn==0) //正转{step_index++;if (step_index>7)step_index=0;}else{ //反转step_index--;if (step_index<0)step_index=7;}}步进电机(键盘控制可调速加显示)#include <reg51.h>#define uchar unsigned charstatic unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越大,最小值为1,速度最慢static int spcount; //步进电机转速参数计数void ddelay(void); //键盘扫描延时函数void delay(unsigned int endcount); //延时函数,延时为endcount*1毫秒void gorun(); //步进电机控制步进函数void Delay400Ms(void);void LCMInit(void); //LCM初始化void WriteCommandLCM(unsigned char WCLCM,BuysC); //BuysC为0时忽略忙检测void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar *DData,uchar n);sbit P10=P3^0 ; //电机端口定义sbit P11=P3^1 ;sbit P12=P3^2;sbit P13=P3^3 ;uchar code speed[]={ 0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30};uchar code stop[] = {"stop"};uchar code go[] = {"go:"};uchar code back[] = {"back:"};uchar code max[] = {"max:8"};void ddelay(void){uchar i;for (i=300;i>0;i--);}uchar keyscan(void){uchar scancode;uchar tmpcode;P1 = 0xf8; // 发全0行扫描码if ((P1&0xf8)!=0xf8) // 若有键按下{ddelay(); // 延时去抖动if ((P1&0xf8)!=0xf8) // 延时后再判断一次,去除抖动影响{scancode = 0xfe;while((scancode&0x08)!=0) // 逐行扫描{P1 = scancode; // 输出行扫描码if ((P1&0xf8)!=0xf8) // 本行有键按下{tmpcode = (P1&0xf8)|0x07;return((~scancode)+(~tmpcode)); // 返回特征字节码,为1的位即对应于行和列 }else scancode = (scancode<<1)|0x01; // 行扫描码左移一位}}}return(0); // 无键按下,返回值为0}void main(void){uchar key;count = 0;step_index = 0;spcount = 0;P10 = 0;P11 = 0;P12 = 0;P13 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFc;TL0 = 0x18; //设定时每隔1ms中断一次TR0 = 1; //开始计数P0=0XFF;P3 &=0XEF; //573片选LCMInit(); //LCM初始化Delay400Ms();stop_flag = 0;turn=0;speedlevel = 5;DisplayListChar(0,0,3,go,1); //每次扫描键盘显示更新一次uchar code go[] DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次while(1){key = keyscan();switch(key){case 0x09: //按键#,正转以speedlevel = 1的速度转1000*0.5MS=0.5S stop_flag=0;turn = 0;speedlevel =5;gorun();WriteCommandLCM(0x01,1);//显示清屏,DisplayListChar(0,0,3,go,0); //每次扫描键盘显示更新一次uchar code go[] DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次delay(1000);break;case 0x0c: //按键*,停止2000*0.5MS=0.5Sstop_flag=1;WriteCommandLCM(0x01,1);//显示清屏,DisplayListChar(0,0,4,stop,0); //每次扫描键盘显示更新一次break;case 0x0a: //按键0,反转以speedlevel = 1的速度转1000*0.5MS=0.5S stop_flag=0;turn=1;speedlevel =5;gorun();WriteCommandLCM(0x01,1);//显示清屏,DisplayListChar(0,0,5,back,0); //每次扫描键盘显示更新一次DisplayOneChar(0,1,0x35); //每次扫描键盘显示更新一次delay(1000);break;case 0x11: // 按键9,以--speedlevel的加速转1000*0.5MS=0.5Sstop_flag=0;if (speedlevel==2){ speedlevel=2;}else { speedlevel--;}gorun();if(speedlevel==2){ DisplayListChar(0,1,5,max,0);}else {DisplayOneChar(0,1, speed[speedlevel]);} //每次扫描键盘显示更新一次 delay(1000);break;case 0x12: // 按键8,以++speedlevel的减速转1000*0.5MS=0.5Sstop_flag=0;speedlevel++;gorun();WriteCommandLCM(0x01,1);//显示清屏,if(turn==0){DisplayListChar(0,0,3,go,0); //每次扫描键盘显示更新一次uchar code go[] DisplayOneChar(0,1, speed[speedlevel]);} //每次扫描键盘显示更新一次else {DisplayListChar(0,0,5,back,0); //每次扫描键盘显示更新一次DisplayOneChar(0,1,speed[speedlevel]);} //每次扫描键盘显示更新一次delay(1000);break;}}}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFc;TL0=0x18; //设定时每隔1ms中断一次count++;spcount--;if(spcount<=0) //速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL),{ // 频率越小,速度越慢spcount = speedlevel;gorun();}}void delay(unsigned int endcount)//延时函数,延时为endcount*0.5毫秒{count=0;do{}while(count<endcount);}void gorun(){if (stop_flag==1){P10 = 0;P11 = 0;P12 = 0;P13 = 0;return;}switch(step_index){case 0: //0P10 = 1;P11 = 0;P12 = 0;P13 = 0;break;case 1: //0、1P10 = 1;P11 = 1;P12 = 0;P13 = 0;break;case 2: //1P10 = 0;P11 = 1;P12 = 0;P13 = 0;break;case 3: //1、2P10 = 0;P11 = 1;P12 = 1;P13 = 0;break;case 4: //2P10 = 0;P11 = 0;P12 = 1;P13 = 0;break;case 5: //2、3P10 = 0;P11 = 0;P12 = 1;P13 = 1;break;case 6: //3P10 = 0;P11 = 0;P12 = 0;P13 = 1;break;case 7: //3、0P10 = 1;P11 = 0;P12 = 0;P13 = 1;}if (turn==0) //正转 {step_index++;if (step_index>7)step_index=0; }else{ //反转step_index--;if (step_index<0)step_index=7;}}步进电机(自动循环调速)#include <reg51.h>sbit P00=P2^0 ;sbit P01=P2^1 ;sbit P02=P2^2;sbit P03=P2^3 ;static unsigned int count; //计数static int step_index; //步进索引数,值为0-7static bit turn; //步进电机转动方向static bit stop_flag; //步进电机停止标志static int speedlevel; //步进电机转速参数,数值越大速度越快,最小值为1,速度最慢static int spcount; //步进电机转速参数计数void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒void gorun(); //步进电机控制步进函数void main(void){count = 0;step_index = 0;spcount = 0;stop_flag = 0;P00 = 0;P01 = 0;P02 = 0;P03 = 0;EA = 1; //允许CPU中断TMOD = 0x11; //设定时器0和1为16位模式1ET0 = 1; //定时器0中断允许TH0 = 0xFE;TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数turn = 0;do{speedlevel =4;delay(10000); //以speedlevel = 4的速度转2000*0.5MS=1Sspeedlevel =4;delay(10000); //以speedlevel = 4的速度转2000*0.5MS=1Sstop_flag=1;delay(6000);//停止,2000*0.5MS=3Sstop_flag=0;}while(1);}//定时器0中断处理void timeint(void) interrupt 1{TH0=0xFE;TL0=0x0C; //设定时每隔0.5ms中断一次count++;spcount--;if(spcount<=0){spcount = speedlevel;gorun();}}void delay(unsigned int endcount){count=0;do{}while(count<endcount);}void gorun(){if (stop_flag==1){P00 = 0;P01 = 0;P02 = 0;P03 = 0;return;}switch(step_index){case 0: //0P00 = 1;P01 = 0;P02 = 0;P03 = 0;break;case 1: //0、1P00 = 1;P01 = 1;P02 = 0;P03 = 0; break;case 2: //1P00 = 0;P01 = 1;P02 = 0;P03 = 0; break;case 3: //1、2P00 = 0;P01 = 1;P02 = 1;P03 = 0; break;case 4: //2P00 = 0;P01 = 0;P02 = 1;P03 = 0; break;case 5: //2、3P00 = 0;P01 = 0;P02 = 1;P03 = 1; break;case 6: //3P00 = 0;P01 = 0;P02 = 0;P03 = 1; break;case 7: //3、0P00 = 1;P01 = 0;P02 = 0;P03 = 1;}if (turn==0){step_index++;if (step_index>7) step_index=0; }else{step_index--;if (step_index<0)step_index=7;}}步进电机控制Link - Thu, 17 Jan 2008 12:41:32 +0800Description:本设计采用的步进电机为35BYJ46型四相八拍电机,电压为DC12V。
【精品】步进电机驱动电路+C语言驱动程序

/**********************************************/ /*********兰州交通大学电子电工实验中心*********/ /*******************2009-8-2********************/ /*********************************************/ #include"reg51.h"#include"intrins.h"#include"math.h"#include"absacc.h"#definePORTAXBYTE[0x8500]#definePORTBXBYTE[0x8502]#definePORTCXBYTE[0x8504]#definePORTC0XBYTE[0x8506]#definenop_nop_()#defineRight_RUN1#defineLeft_RUN0unsignedlongRunSpeed=76;unsignedcharRUNState=1;sbitRS=P2^0;sbitRW=P2^1;sbitE=P2^2;sbitP17=P1^7;bitflag=0;unsignedcharxx[]="speed(n/min):";unsignedcharSD[]="76";charstate[2][14]={"direction:cw","direction:ccw"}; unsignedcharFLG,INMA=0;unsignedchart,s=0x01; unsignedinta;main(){voidOPJIAN(); unsignedcharJIAN(); unsignedcharJIANZHI(); voidspeed(); voidSHOW_LCD(); voidshow_state(); voidwrite1();voidwrit2(unsignedchari); voiddelay();voidtime();voidbusy(); unsignedchari;i=0x90;PORTC0=i;i=0x01;TMOD=i;t=0x10;a=0x0f;TH0=0x10;TL0=0x0f;FLG=INMA;SHOW_LCD();show_state();EA=1;ET0=1;TR0=1;while(1){i=JIAN();if(i!=0){time();time();}i=JIAN();if(i!=0){INMA=JIANZHI();OPJIAN();time();}if(FLG!=INMA||flag==1){FLG=INMA;SHOW_LCD();show_state();flag=0;}}}voidSHOW_LCD()/*lcd设置程序*/ {P1=0x38;write1();delay();P1=0x38;write1();delay();P1=0x38;write1();delay();P1=0x01;write1();delay();P1=0x0f;write1();delay();write1(); delay(); P1=0x0c;}voidshow_state()/*状态显示程序*/ {unsignedchari=0;P1=0x80;write1();while(xx[i]!='\0'){writ2(xx[i]);i++;delay();}i=0;while(SD[i]!='\0'){writ2(SD[i]);delay();i++;}P1=0xc0;write1();i=0;if(RUNState==Right_RUN)while(state[0][i]!='\0'){writ2(state[0][i]);i++;}elseif(RUNState==Left_RUN)while(state[1][i]!='\0'){writ2(state[1][i]);i++;}}voidwrite1()/*lcd写控制字*/{RS=0;RW=0;E=0;busy();E=1;}voidwrit2(unsignedchari)/*lcd写数据*/ {P1=i;RS=1;E=0;busy();E=1;}voiddelay()/*延时程序*/{unsignedchari;for(i=0;i<100;i++){i=i;}}voidtime(){unsignedchari,j;for(i=0;i<100;i++){for(j=0;j<30;j++){j=j;}}}voidbusy()//判断LCD是否忙{do{P1=0xff;RS=0;RW=1;E=0;nop;E=1;}while(P17==1);}unsignedcharJIAN()/*判断是否有键按下*/ {unsignedchari,j;i=0xff;PORTA=i;time();i=0x00;PORTB=i;j=PORTA;j=~j;returnj;}unsignedcharJIANZHI()/*读键值程序*/{unsignedi,j,d,k,m=1;i=0xfe;k=0x01;do{PORTB=i;j=PORTA;m=j&(0x01);if(m==0)d=k/2;else{m=j&(0x02);if(m==0)d=k/2+4;else{m=j&(0x04);if(m==0)d=k/2+8;else{m=j&(0x08);if(m==0)d=k/2+12;}}}k=k+2;i=i<<1;i=i|(0x01);}while(m!=0);returnd;}voidOPJIAN()/*键值处理程序*/{switch(INMA){case0x08:{RUNState=Right_RUN;s=0xf7;}break; case0x09:{RUNState=Left_RUN;s=0x01;}break; case0x0b:{flag=1;t=t-2;RunSpeed=5000000/(65536-t*256-a);speed();}break;case0x0f:{flag=1;t=t+2;RunSpeed=5000000/(65536-t*256-a);speed();}}}voidspeed()/*速度处理程序*/{unsignedchari=0;SD[0]=RunSpeed/100+48;SD[1]=RunSpeed%100/10+48;SD[2]=RunSpeed%10+48;}voidtime1(void)interrupt1using2{TR0=0;PORTC=s;if(RUNState==0){s=(s<<1);if(s==0x10)s=0x01;}else{s=s>>1;if(s==0x0f)s=0xf7;}TH0=t;TL0=a;TR0=1;}。
步进电机控制(单片机C语言)

步进电机控制(单⽚机C语⾔)模块⼆简单应⽤实例调试任务2 步进电机控制(H22)⼀、任务要求⽤单⽚机P1端⼝控制步进电机,编写程序输出脉冲序列到P1⼝,控制步进电机正转、反转,加速,减速。
⼆、任务⽬的1.了解步进电机控制的基本原理。
2.掌握控制步进电机转动的编程⽅法。
三、电路连线框图步进电机电流⼩于0.5A时可采⽤ULN2003A进⾏驱动(反相)四、原理控制说明步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。
切换是通过单⽚机输出脉冲信号来实现的。
所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转⽅向。
步进电机的转速应由慢到快逐步加速。
电机驱动⽅式可以采⽤双四拍(AB→BC→CD→DA→AB)⽅式,也可以采⽤单四拍(A→B→C→D→A)⽅式,或单、双⼋拍(A→AB→B→BC→C→CD→D→DA→A)⽅式。
控制时公共端是接在VCC上的,所以实际控制脉冲是低电平有效。
单⽚机的P1⼝输出的脉冲信号经(MC1413或ULN2003A)倒相驱动后,向步进电机输出脉冲信号序列。
五、程序框图# include#define Astep 0x01#define Bstep 0x02#define Cstep 0x04#define Dstep 0x08unsigned char dly_c;void delay(){unsigned char tt,cc;cc = dly_c; //外循环次数tt = 0x0; //内循环次数do{do {}while(--tt);}while(--cc);}void main(){dly_c = 0x10;// 双四拍⼯作⽅式while(1){P1= Astep+Bstep;delay();P1= Bstep+Cstep;delay();P1= Cstep+Dstep;delay();P1= Dstep+Astep;delay();if (dly_c>3) dly_c --; // 加速控制};。
C语言实现控制电机加减速正反转(飞思卡尔C代码)

用单片机控制直流电动机的正反转、加减速的程序如何用C语言写参考一下这个例子吧。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit PW1=P2^0 ;sbit PW2=P2^1 ; //控制电机的两个输入sbit accelerate=P2^2 ; //调速按键sbit stop=P2^3 ; //停止按键sbit left=P2^4 ; //左转按键sbit right=P2^5 ; //右转按键#define right_turn PW1=0;PW2=1 //顺时针转动#define left_turn PW1=1;PW2=0 //逆向转动#define end_turn PW1=1;PW2=1 //停转uint t0=25000,t1=25000; //初始时占空比为50%uint a=25000; // 设置定时器装载初值 25ms 设定频率为20Hz uchar flag=1; //此标志用于选择不同的装载初值uchar dflag; //左右转标志uchar count; //用来标志速度档位void keyscan(); //键盘扫描void delay(uchar z);void time_init(); //定时器的初始化void adjust_speed(); //通过调整占空比来调整速度//**********************************//void main(){time_init(); //定时器的初始化while(1){keyscan(); //不断扫描键盘程序,以便及时作出相应的响应}}//*************************************//void timer0() interrupt 1 using 0{if(flag){flag=0;end_turn;a=t0; //t0的大小决定着低电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}else{flag=1; //这个标志起到交替输出高低电平的作用if(dflag==0){right_turn; //右转}else{left_turn; //左转}a=t1; //t1的大小决定着高电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}}void time_init(){TMOD=0x01; //工作方式寄存器软件起动定时器定时器功能方式1 定时器0TH0=(65536-a)/256;TL0=(65536-a)%256; //装载初值ET0=1; //开启定时器中断使能EA=1; // 开启总中断TR0=0;}//****************************************//void delay(uchar z) //在12M下延时z毫秒{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//******************************//void keyscan(){if(stop==0){TR0=0; //关闭定时器0 即可停止转动 end_turn;}if(left==0){TR0=1;dflag=1; //转向标志置位则左转}if(right==0){TR0=1;dflag=0; //转向标志复位则右转}if(accelerate==0){delay(5) ; //延时消抖if(accelerate==0){while(accelerate==0) ; //等待松手count++;if(count==1){t0=20000;t1=30000; //占空比为百分之60}if(count==2){t0=15000;t1=35000; //占空比为百分之70}if(count==3){t0=10000;t1=40000; //占空比为百分之80}if(count==4){t0=5000;t1=45000; //占空比为百分之90}if(count==5){count=0;}}}}功能特点:1)总线速度高达40 M Hz,CAN总线:3个1Mbps的CAN总线,兼容CAN2.0 A/B;2)128 KB程序Flash和8 KB DataFlash,用于实现程序和数据存储,均带有错误校正码(E CC);3)可配置A/D:16通道模数转换器;可选8位10位和12位精度,3μs的转换时间4)内嵌MS CAN模块用于CAN节点应用,内嵌支持LIN协议的增强型SIC模块和SPI模块;5)4通道16位计数器,CRG时钟和复位发生器:锁相环、看门狗、实时中断;增强型捕捉定时器;6)出色的低功耗特性,带有中断唤醒功能的10,实现唤醒休眠系统的功能;7)通道PWM:8位8通道或16位4通道PWM,易于实现电机控制。
控制电机的c语言程序

//水位5
if(shuiman==1&&sw5==0&&sw4==1&&sw3==1&&sw2==1&&sw1==1)//当唯一的闭合一个传感器单元:水位5时发生
{
P0=table[5];//显示水位深度:5
}
//水位4
if(shuiman==1&&sw5==1&&sw4==0&&sw3==1&&sw2==1&&sw1==1)//当唯一的闭合一个传感器单元:水位4时发生
#include<reg51.h>
//定义一个数组,使数码管显示的数字和数组元素的下标相等
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
sbit shuiman=P1^0;//水满
sbit sw5=P1^1;//水位5
{
P0=table[2];//显示水位深度:2
}
//水位低
if(shuiman==1&&sw5==1&&sw4==1&&sw3==1&&sw2==1&&sw1==0)//当唯一的闭合一个传感器单元:水位1时发生
{
dianji=0;//开电机
state=0;//电机工作指示灯打开
P0=table[1];//显示水位深度:1
}
//手工上水
if(shougong==0)//当按手工上水按钮时发生
{
dianji=0;//开电机
步进电机控制程序(c语言51单片机)

// pri_dj = Pme );
if( i == set_pwm_width ) { P1 = 0xff; i = 0; one _round_flg = 0; while ( !one_round_flg & key_puse );}
if(!key_puse) { delay(4ms); if(!key_puse) break; }
while ( key_puse & key_clear ); delay ( 8ms );
if ( !key_clear ) { round_num = 0; display(); }
if ( !key_puse ) break; }
while( !key_puse ); delay(8ms);
while( !key_puse ); }
set_display_num(); for(i = 0; i < LEDLen ; i ++){
P0 = 0xf0; P0 = P0 | LEDBuf[i] ; if(i==0) led_1000 = 0; //P0^4 if(i==1) led_100 = 0; //P0^5 if(i==2) led_10 = 0; //P0^6 if(i==3) led_1 = 0; //P0^7
delay ( 1ms ); tmp = (~(P2 | 0xF0)); P2 = 0x7F; // 0111 1111
delay ( 1ms ); tmp = (~(P2 | 0xF0)) * 10 + tmp; set_round_num = set_round_num + tmp * 100; set_round_num = set_round_num * Chilun_Num;