51单片机 步进电机旋转角度控制
扫描二维码
随时随地手机看文章
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
typedefunsignedlongulong;
ucharcodebeatCode[8]={
0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6
};
ulongbeats=0;
ucharT0RH=0,T0RL=0;
voidturnMotor(ulongangle){
EA=0;
beats=angle*4076/360;
EA=1;
}
voidsetTimer0(uintms){
ulongtmp;
tmp=11059326/12;
tmp=tmp*ms/1000;
tmp=65536-tmp;
tmp+=28;
T0RL=tmp;
T0RH=tmp>>8;
}
voidinterruptTimer0()interrupt1{
staticucharindex=0;
TH0=T0RH;
TL0=T0RL;
if(beats){
uchartmp=P1;
tmp&=0xF0;
tmp|=beatCode[index];
P1=tmp;
index=++index&0x07;
beats--;
}
else{
P1|=0x0F;
}
}
voidmain(){
EA=1;
TMOD=0x01;
setTimer0(2);
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
turnMotor(2*360+180);
while(1);
}
下面是使用库函数循环左移实现的:
#include
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
typedefunsignedlongulong;
ulongbeats=0;
ucharT0RH=0,T0RL=0;
voidturnMotor(ulongangle){
EA=0;
beats=angle*4076/360;
EA=1;
}
voidsetTimer0(uintms){
ulongtmp;
tmp=11059326/12;
tmp=tmp*ms/1000;
tmp=65536-tmp;
tmp+=28;
T0RL=tmp;
T0RH=tmp>>8;
}
voidinterruptTimer0()interrupt1{
staticucharbeatCode=0x33;
TH0=T0RH;
TL0=T0RL;
if(beats){
uchartmp=P1;
tmp&=0xF0;
beatCode=_crol_(beatCode,1);
tmp|=beatCode;
P1=tmp;
beats--;
}
else{
P1|=0x0F;
}
}
voidmain(){
EA=1;
TMOD=0x01;
setTimer0(2);
TH0=T0RH;
TL0=T0RL;
ET0=1;
TR0=1;
turnMotor(2*360+180);
while(1);
}