51单片机控制步进电机正反转
#include <>
#include <>
unsigned char code z[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03//315,270,225......360(0)
};//八拍
unsigned char code f[]={0x01,0x09,0x08,0x0c,0x04,0x06,0x02,0x03//45,90,145......360(0)
};
sbit K1 = P3^0;//定义正转按钮
sbit K2 = P3^1;//定义反转按钮
sbit K3 = P3^2;//定义停止按钮
void zz(unsigned char n);
void fz(unsigned char n);
void delay();
void step();
void main()
{
unsigned char N = 1;//由于设定好了转一圈的数据,所以N在此设定为转多少圈。
TMOD=0X10;
TL1=0XF0;
TH1=0XD8;
EA=0;
ET1=0;//这里没有使用定时器中断,这里只是使用定时器的定时功能。
zz(N);
delay();
fz(N);
while(1)
{
if(K1 == 0)
{
while(1)
{
P0 = 0xfe;
zz(N);
if(K3 == 0||K2==0) break;
}
}
else if(K2 == 0)
{
while(1)
{
P0 = 0xfd;
fz(N);
if(K3 == 0||K1==0) break;
}
}
else
{
P0 = 0xfb;
P1 = 0x03;
}
}
}
void zz(unsigned char n)//正转
{
unsigned char i,j;
for(i=0;i<n;i++)
{
for(j=0;j<8;j++)//整个for循环,正转一个步距角,因为四相八拍,所以是半个步距角,即半步。
{
if(K3 == 0) break;
P1 = z[j];
step();
}
}
}
void fz(unsigned char n)//反转
{
unsigned char i,j;
for(i=0;i<n;i++)
{
for(j=0;j<8;j++)
{
if(K3 == 0) break;
P1 = f[j];
step();
}
}
}
void delay()//定义1s
{
unsigned char i,j,k;
_nop_();
i=8;
j=154;
k=122;
do
{
do
{
while(--k);
}while(--j);
}while(--i);
}
void step()//定时器计时10ms
{
TF1=0;
TR1=1;
while(TF1==0);
TR1=0;
TL1=0XF0;
TH1=0XD8;
}