/*****************************************************
程序说明
通过改变脉冲个数改变步进电机的角度,通过按键可以让步进
电机停在任意角度及正反转 并在数码管显示,正转显示1,反转显示2
单片机 :STC12C5A60S2
晶振 :11.0592MHZ
步进电机驱动芯片:ULN2003A
作者 :苏义江
时间 :2015年6月5日
八拍方式驱动 :顺序为A AB B BC C CD D DA
zhengzhuan[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
fanzhuan[] ={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
*****************************************************/
#include<12c5a.H>
//#include <reg52.h>
//#define uchar unsigned char
//#define uint unsigned int
sbit key=P1^0; //按键控制步进电机的正转方向
sbit key1=P1^1; //按键控制步进电机的反转方向
sbit dula =P0^7; //段锁存使能
sbit wela =P0^6; //位锁存使能
uchar code zhengzhuan[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar code fanzhuan[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
//共阳段码
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
0xa1,0x86,0x8e,0x89};
uchar code tab_f[]={0x0c,0x06,0x03,0x09,
0x0c,0x06,0x03,0x09};//2相励磁 反传
uchar code tab_z[]={0x09,0x03,0x06,0x0c,
0x09,0x03,0x06,0x0c};//2相励磁 正传
void Delay( uint i)//延时
{
uint x,y;
for(x=i;x>0;x--)
for(y=300;y>0;y--);
}
void display()
{
wela=1;
P2=0xfe;
wela=0;
dula =1;
P2=0xf9;//正转显示1
Delay( 10);
P2=0xff;
dula =0;
}
void display1()
{
wela=1;
P2=0xf7;
wela=0;
dula =1;
P2=0xa4;//反转显示2
Delay( 10);
P2=0xff;
dula =0;
}
void main()
{
uint i,j;//j代表脉冲.i代表数据
P0M1=0; //设置P0口为强推免输出模式,下同
P0M0=0XFF;
while(1)
{
//j等于13个脉冲,电机旋转一周。改变j的值就会改变电机的角度
for(j=3;j>0;j--)//正转4分之一周
{
for(i=0;i<8;i++)
{
display();
P0=zhengzhuan[i];//正转数组
Delay(5);//5秒旋转一周 改变延时改变速度
}
}
Delay(200);//正反转之间延时
for(j=3;j>0;j--)//反转4分之一周
{
for(i=0;i<8;i++)
{
display1();
P0=fanzhuan[i];//反转数组
Delay(5);//5秒旋转一周 改变延时改变速度
}
}
Delay(200);
}
/********下面程序都正常控制步进电机状态*****************/
/* while(1)
{
if(!key)
Delay(10);
{
if(!key)
{
display();
Delay(10);
for(j=7;j>0;j--)//j=7个脉冲,正转半周
{
for(i=0;i<8;i++)
{
P0=zhengzhuan[i];//正转数组
Delay(10);
}
}
}
while(!key);
}
if(!key1)
Delay(10);
{
if(!key1)
{
display1();
Delay(10);
for(j=7;j>0;j--)//j=7个脉冲,反转半周
{
for(i=0;i<8;i++)
{
P0=fanzhuan[i];//反转数组
Delay(10);
}
}
}
while(!key1);
}
}*/
/* while(1)
{
//j等于13个脉冲,电机旋转一周。改变j的值就会改变电机的角度
for(j=13;j>0;j--)//正转一周
{
for(i=0;i<8;i++)
{
display();
P0=zhengzhuan[i];//正转数组
Delay(5);//6秒旋转一周
}
}
Delay(2000);
for(j=13;j>0;j--)//反转一周
{
for(i=0;i<8;i++)
{
display1();
P0=fanzhuan[i];//反转数组
Delay(5);//6秒旋转一周
}
}
Delay(2000);
}
*/
/* while(1)
{
//j等于13个脉冲,电机旋转一周。改变j的值就会改变电机的角度
for(j=25;j>0;j--)//正转二周
{
for(i=0;i<8;i++)
{
display();
P0=zhengzhuan[i];//正转数组
Delay(3);
}
}
Delay(2000);
for(j=25;j>0;j--)//反转一周
{
for(i=0;i<8;i++)
{
display1();
P0=fanzhuan[i];//反转数组
Delay(3);
}
}
Delay(2000);
}*/
/* while(1)
{
//j等于13个脉冲,电机旋转一周。改变j的值就会改变电机的角度
for(j=250;j>0;j--)//正转二十周
{
for(i=0;i<8;i++)
{
display();
P0=zhengzhuan[i];//正转数组
Delay(6); //延时控制转速不能小于500
}
}
Delay(2000);
for(j=250;j>0;j--)//反转二十周
{
for(i=0;i<8;i++)
{
display1();
P0=fanzhuan[i];//反转数组
Delay(6); //延时控制转速不能小于500
}
}
Delay(20000);
}*/
/* while(1)
{
for(i=0;i<8;i++)
{
if(key) //按键未按下,正转
{
P0=zhengzhuan[i];//正转数组
Delay(8);
}
else //按键按下,反转
{
P0=fanzhuan[i];//反转数组
Delay(8);
}
}
}*/
}