步進電機任意角度控制并顯示- /*****************************************************
- 程序說明
- 通過改變脈沖個數改變步進電機的角度,通過按鍵可以讓步進
- 電機停在任意角度及正反轉 并在數碼管顯示,正轉顯示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);
- }
- }
- }*/
- }
復制代碼
|