两相四线步进电机控制
原理图:
控制代码:
#include <REGX52.H>
#define uc unsigned char
#define ui unsigned int
sbit E=P3^5;
sbit RW=P3^4;
sbit RS=P3^2;
sbit L=P3^1;
sbit R=P3^0;
sbit zhengzhuan=P1^0;
sbit stopm=P1^1;
sbit fanzhuan=P1^2;
sbit speedup1=P1^3;
sbit speeddown1=P1^4;
static step_index;
ui count1,count2; //定时
uc speed; //速度参数
uc tag=0;
uc run=0;
void ground(step);
void stop();
void delay(ui time);
void main(void)
{
P2=0xff;
P1=0xff;
P0=0;
EX1=1;
EA=1;
speed=60;
while(1)
{
if((run==1)) // 正转
{
ground(step_index);
delay(speed);
step_index++; //大于7,从头再来
if(step_index>7)
step_index=0;
}
if((run==2)) //反转
{
ground(step_index);
delay(speed);
step_index--;
if(step_index<0) //小于0,从头再来。
step_index=7;
}
if(tag==2)
{
speed=speed+10;
if(speed>=200)
{ speed=200;
}
tag=0;
}
if(tag==1)
{
speed=speed-10;
if(speed<=30)
{ speed=30;
}
tag=0;
}
}
}
void delay(ui time) ///延时程序
{
char i=1;
while(time--)
for( i=113;i>0;i--);
}
void key(void) interrupt 2
{
uc i;
if(speedup1==0)
tag=1;
if(speeddown1==0)
tag=2;
if(zhengzhuan==0)
run=1;
if(fanzhuan==0)
run=2;
if(stopm==0)
run=0;
for(i=0;i<200;i++); //延时防抖
P1=0XFF;
}
void ground(step_index) //转步
{
switch(step_index)
{
case 0://0
P0_0 = 1;
P0_1 = 0;
P0_2 = 0;
P0_3 = 0;
break;
case 1://0,1
P0_0 = 1;
P0_1 = 1;
P0_2 = 0;
P0_3 = 0;
break;
case 2://1
P0_0 = 0;
P0_1 = 1;
P0_2 = 0;
P0_3 = 0;
break;
case 3://1,2
P0_0 = 0;
P0_1 = 1;
P0_2 = 1;
P0_3 = 0;
break;
case 4://2
P0_0 = 0;
P0_1 = 0;
P0_2 = 1;
P0_3 = 0;
break;
case 5://2,3
P0_0 = 0;
P0_1 = 0;
P0_2 = 1;
P0_3 = 1;
break;
case 6://3
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 1;
break;
case 7://3,0
P0_0 = 0;
P0_1 = 0;
P0_2 = 0;
P0_3 = 1;
}
}
有哪里不懂的留言问我奥,我主页里面还有另外一份代码,也是我自己写的