步进电机任意角度控制并显示- /*****************************************************
- 程序说明
- 通过改变脉冲个数改变步进电机的角度,通过按键可以让步进
- 电机停在任意角度及正反转 并在数码管显示,正转显示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);
- }
- }
- }*/
- }
复制代码
|