兩相5、6線步進(jìn)電機(jī)C語言程序
//兩相5、6線步進(jìn)電機(jī),分為四拍和八拍,這里介紹輸出八拍方式:A-AC-C-CB-B-BD-D-DA
//四拍:A-C-B-D,因此在八拍的基礎(chǔ)上減去中間的就可以了,不過步距角要大一倍
#include
#include
sbit la=P2^0; //定義兩相電機(jī)的四組線,從板上設(shè)計(jì)來分配,選擇P2口的低四位輸出,相應(yīng)的輸出也可以反應(yīng)在LED燈上
//P2。0為A相,P2。1為B相,P2。2為C相,P2。3為D相
sbit lb=P2^1;
sbit lc=P2^2;
sbit ld=P2^3;
#define uchar unsigned char
code unsigned int lhj[]={1,50,100,1,50,80,1,100,50,0,120,40,0,30,80,0,50,100,
1,50,120,0,200,80,1,400,20,1,50,130,0,200,90,0,50,150};
//定義電機(jī)動(dòng)作的參數(shù),每三個(gè)數(shù)為一組,第一個(gè)是方向(1、正轉(zhuǎn),0、反轉(zhuǎn))
//第二個(gè)是步進(jìn)量,第三個(gè)是轉(zhuǎn)速
unsigned char key();//鍵盤動(dòng)作,這里的鍵盤掃描只用到四個(gè)按鍵有效(板上標(biāo)的0,4,8,C)
unsigned char right(unsigned int Speed,unsigned int road); //正轉(zhuǎn)
unsigned char left(unsigned int Speed,unsigned int road); //反轉(zhuǎn)
void mDelay(unsigned int DelayTime); //延時(shí)函數(shù)
void main()
{
uchar i=0;
while(1){
if(key()==0xde){//8的按鍵按下
for(i=0;i<34;i+=3){//循環(huán)輸出我們定義好的動(dòng)作數(shù)據(jù)
if(lhj[i]) //調(diào)入數(shù)組,先判斷正反轉(zhuǎn)
right(lhj[i+1],lhj[i+2]); //兩個(gè)參數(shù)代表步進(jìn)量和轉(zhuǎn)速
else
left(lhj[i+1],lhj[i+2]);
if(key()==0xee)//C的按鍵按下
break;
}
}
}
}
unsigned char right(unsigned int Speed,unsigned int road)//兩個(gè)參數(shù)代表步進(jìn)量和轉(zhuǎn)速
{
//步進(jìn)節(jié)拍:A-AC-C-CB-B-BD-D-DA
while(1){
if(!Speed) //判斷步進(jìn)量走完沒?以下都是,每走一步,判斷一次
break;
ld=1;
la=0; //a
mDelay(road);//這里的延時(shí)就可控制轉(zhuǎn)速
if(!Speed--)
break;
lc=0; //ac
mDelay(road);
if(!Speed--)
break;
la=1; //c
mDelay(road);
if(!Speed--)
break;
lb=0; //cb
mDelay(road);
if(!Speed--)
break;
lc=1; //b
mDelay(road);
if(!Speed--)
break;
ld=0; //bd
mDelay(road);
if(!Speed--)
break;
lb=1; //d
mDelay(road);
if(!Speed--)
break;
la=0; //da
mDelay(road);
Speed--;
}
P3=P3|0x0f;//將四個(gè)腳輸出置高
}
unsigned char left(unsigned int Speed,unsigned int road)//兩個(gè)參數(shù)代表步進(jìn)量和轉(zhuǎn)速
{
//步進(jìn)節(jié)拍 A-AD-D-DB-B-BC-C-CA
while(1){
if(!Speed)//判斷步進(jìn)量走完沒?以下都是,每走一步,判斷一次
break;
lc=1;
la=0; //a
mDelay(road);
if(!Speed--)
break;
ld=0; //ad
mDelay(road);
if(!Speed--)
break;
la=1; //d
mDelay(road);
if(!Speed--)
break;
lb=0; //db
mDelay(road);
if(!Speed--)
break;
ld=1; //b
mDelay(road);
if(!Speed--)
break;
lc=0; //bc
mDelay(road);
if(!Speed--)
break;
lb=1; //c
mDelay(road);
if(!Speed--)
break;
la=0; //ca
mDelay(road);
Speed--;
}
P3=P3|0x0f;//將四個(gè)腳輸出置高
}
void mDelay(unsigned int DelayTime) //延時(shí)函數(shù)
{
unsigned char j=0;
while(DelayTime--){
for(j=0;j<10;j++){}
}
}
unsigned char key()//鍵盤掃描是否有鍵按下,這里只掃描一列四個(gè)鍵,其它不用
{
uchar KeyV;
P0=0xfe;
KeyV=P0;
if(KeyV==0xfe)//只掃描一列
return(0);
mDelay(100);
KeyV=P0;
if(KeyV==0xfe)
return(0);
else
return(KeyV);
}
//兩相5、6線步進(jìn)電機(jī),分為四拍和八拍,這里介紹輸出八拍的第二種方式:A-AC-C-CB-B-BD-D-DA
//四拍:A-C-B-D,因此在八拍的基礎(chǔ)上減去中間的就可以了,不過步距角要大一倍
#include
#include
#define uchar unsigned char
code unsigned int lhj[]={1,50,100,1,50,80,1,100,50,0,120,40,0,30,80,0,50,100,
1,50,120,0,200,80,1,400,20,1,50,130,0,200,90,0,50,150};
//定義電機(jī)動(dòng)作的參數(shù),每三個(gè)數(shù)為一組,第一個(gè)是方向(1、正轉(zhuǎn),0、反轉(zhuǎn))
//第二個(gè)是步進(jìn)量,第三個(gè)是轉(zhuǎn)速
unsigned char dataout[8]={0xfe,0xfa,0xfb,0xf9,0xfd,0xf5,0xf7,0xf6};
//這里我們定義8組數(shù),分別對(duì)應(yīng)八拍:A-AC-C-CB-B-BD-D-DA 從板上設(shè)計(jì)來分配,選擇P2口的低四位輸出
//相應(yīng)的輸出也可以反應(yīng)在LED燈上
//P2。0為A相,P2。1為B相,P2。2為C相,P2。3為D相,將高四位都置1,也就是F。
//我們用索引的方式輸出,比如正轉(zhuǎn),元素由0到8這樣的循環(huán),反轉(zhuǎn)則由8到0的循環(huán)
//程序中我們保存索引號(hào),比如上次轉(zhuǎn)在第4元素停下,則下次的正轉(zhuǎn)由5開始向后計(jì)數(shù),反轉(zhuǎn)則由3開始向前計(jì)數(shù)
//這樣,電機(jī)的轉(zhuǎn)角度就會(huì)很準(zhǔn)確
unsigned char datac=0;//定義這個(gè)為存放索引號(hào)(元素號(hào))
unsigned char key();//鍵盤動(dòng)作,這里的鍵盤掃描只用到四個(gè)按鍵有效(板上標(biāo)的0,4,8,C)
unsigned char right(unsigned int Speed,unsigned int road); //正轉(zhuǎn)
unsigned char left(unsigned int Speed,unsigned int road); //反轉(zhuǎn)
void mDelay(unsigned int DelayTime); //延時(shí)函數(shù)
void main()
{
uchar i=0;
while(1){
if(key()==0xde){//8的按鍵按下
for(i=0;i<34;i+=3){
if(lhj[i]) //調(diào)入數(shù)組
right(lhj[i+1],lhj[i+2]); //兩個(gè)參數(shù)代表步進(jìn)量和轉(zhuǎn)速
else
left(lhj[i+1],lhj[i+2]);
if(key()==0xee)//C的按鍵按下
break;
}
}
if(key()==0x7e) //1的按鍵接下,正轉(zhuǎn)1步
right(1,20);
if(key()==0xbe) //4的按鍵接下,反轉(zhuǎn)1步
left(1,20);
}
}
unsigned char right(unsigned int Speed,unsigned int road)//兩個(gè)參數(shù)代表步進(jìn)量和轉(zhuǎn)速
{
//步進(jìn)節(jié)拍:A-AC-C-CB-B-BD-D-DA
do{//循環(huán)步進(jìn)到指定角位
if(datac==7)//索引號(hào)超出8回到0
datac=0;
else
datac++;
P2=dataout[datac];//這里就在P2口輸出我們定義好的相序步進(jìn),P2。0為A相,P2。1為B相,P2。2為C相,P2。3為D相
//這里我們不考虛P(yáng)2的高四位,如果不影響高四位,可以用P2&=0xf0;P2+=dataout[datac];要兩句
//這樣就不引影響到高四位了
mDelay(road);
}
while(Speed--);
P2=0xff; //這里也一樣,如果不影響高四位就得用P3|=0x0f
}
unsigned char left(unsigned int Speed,unsigned int road)
{
//步進(jìn)節(jié)拍 A-AD-D-DB-B-BC-C-CA
do{//循環(huán)步進(jìn)到指定角位
if(datac==0)//索引號(hào)超出0回到8
datac=7;
else
datac--;
P2=dataout[datac];///這里就在P2口輸出我們定義好的相序步進(jìn),P2。0為A相,P2。1為B相,P2。2為C相,P2。3為D相
//這里我們不考虛P(yáng)2的低四位,如果不影響高四位,可以用P2&=0xf0;P2+=dataout[datac];要兩句
//這樣就不引影響到高四位了
mDelay(road);
}
while(Speed--);
P2=0xff;//這里也一樣,如果不影響高四位就得用P2|=0x0f;
}
void mDelay(unsigned int DelayTime) //延時(shí)函數(shù)
{
unsigned char j=0;
while(DelayTime--){
for(j=0;j<10;j++){}
}
}
unsigned char key()//鍵盤掃描是否有鍵按下,這里只掃描一列四個(gè)鍵,其它不用
{
uchar KeyV;
P0=0xfe;
KeyV=P0;
if(KeyV==0xfe)//只掃描一列
return(0);
mDelay(100);
KeyV=P0;
if(KeyV==0xfe)
return(0);
else
return(KeyV);
}