51单片机控制步进电机的转动,加减速,停止,反转,单双八拍工作方式:A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)- #include <reg52.h>
- sbit inc=P3^2;
- sbit dec=P3^3;
- sbit zhzhd=P3^6;
- sbit fazhd=P3^7;
-
- bit flag=1;
- unsigned char t=0x00; //表正反速度
- void delay(unsigned int t);
- void motor_ffw();
-
- unsigned char code led7code[]=
- {0x81,0xe7,0x92,0xc2,0xe4,0xc8,0x88,0xe3,0x00,0xc0};
- unsigned int num=0;
-
- unsigned char code FFW[8]={0x40,0x60,0x20,0x30,0x10,0x18,0x08,0x48};
- unsigned char code FFZ[8]={0x48,0x08,0x18,0x10,0x30,0x20,0x60,0x40}; //反转
-
- void main()
- {
-
- EA=1;
- IT0=1;
- EX0=1;
- IT1=1;
- EX1=1;
-
- TMOD=0x06;
- TL0=0xff;
- TH0=0xff;
- TR0=1;
- ET0=1;
-
- P3=0x3f;
- P0=led7code[num%10];
- while(1)
- {
- motor_ffw();
- }
-
- }
-
- void motor_ffw() /* 步进电机驱动*/ //
- {
- unsigned char i;
- int j;
- while(1)
- {
-
- for(j=0;j<12;j++) //12个周期转一圈
- { for (i=0; i<8; i++) //一个周期转30度
- {
- if(flag==1)
- P2 = FFW[i]; //取数据
- else
- P2 = FFZ[i];
- delay(t); //t调节转速
- }
- }
- }
- }
-
- void int0(void) interrupt 0
- {
- EX0=0;
- delay(10);
- if(inc==0)
- {
- num++;
-
- P0=led7code[num%10];
- if(num%10!=0&&flag){zhzhd=0;fazhd=1;}
- else if (num%10==0){zhzhd=0;fazhd=0;}
- else {zhzhd=1;fazhd=0;}
-
- switch(num%10)
- {
- case 0:t=0x00;break;
- case 1:t=0x12;break;
- case 2:t=0x11;break;
- case 3:t=0x10;break;
- case 4:t=0x09;break;
- case 5:t=0x08;break;
- case 6:t=0x07;break;
- case 7:t=0x06;break;
- case 8:t=0x05;break;
- case 9:t=0x04;break;
-
- }
-
- }
- while(!inc);
- EX0=1;
- }
-
- void int1(void) interrupt 2
- {
- EX1=0;
- delay(10);
- if(dec==0)
- {
- num--;
- if(num==65535)num=65529;
- P0=led7code[num%10];
- if(num%10!=0&&flag){zhzhd=0;fazhd=1;}
- else if (num%10==0){zhzhd=0;fazhd=0;}
- else {zhzhd=1;fazhd=0;}
-
-
- if(num==65535)num=65529;
- switch(num%10)
- {
- case 0:t=0x00;break;
- case 1:t=0x12;break;
- case 2:t=0x11;break;
- case 3:t=0x10;break;
- case 4:t=0x09;break;
- case 5:t=0x08;break;
- case 6:t=0x07;break;
- case 7:t=0x06;break;
- case 8:t=0x05;break;
- case 9:t=0x04;break;
-
- }
- }
- while(!dec);
- EX1=1;
- }
-
-
- void huanx(void) interrupt 1
- {
- ET0=0;
- TR0=0;
- delay(10);
- if(P3^4==0)
- {
- if(flag==1) {flag = 0;zhzhd=1;delay(500);fazhd=0;}
- else {flag = 1;fazhd=1;delay(500);zhzhd=0;}
- }
-
- while(!(P3^4));
- ET0=1;
- TR0=1;
- }
-
-
- // 延时程序
- void delay(unsigned int t)
- {
- unsigned int k;
- while(t--)
- {
- for(k=0; k<80; k++);
-
- }
- }
复制代码 |