/***********************************************************************************
* *
*; 单双八拍工作方式: *
*; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度) *
**************************************************************************************/
#include <reg52.h>
//sbit flag=P3^4; //正反转标志
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++);
}
}