}
voidgorun()
{
if(stop_flag==1)
{
P10=0;
P11=0;
P12=0;
P13=0;
return;
}
switch(step_index)
{
case0:
//0
P10=1;
P11=0;
P12=0;
P13=0;
break;
case1:
//0、1
P10=1;
P11=1;
P12=0;
P13=0;
break;
case2:
//1
P10=0;
P11=1;
P12=0;
P13=0;
break;
case3:
//1、2
P10=0;
P11=1;
P12=1;
P13=0;
break;
case4:
//2
P10=0;
P11=0;
P12=1;
P13=0;
break;
case5:
//2、3
P10=0;
P11=0;
P12=1;
P13=1;
break;
case6:
//3
P10=0;
P11=0;
P12=0;
P13=1;
break;
case7:
//3、0
P10=1;
P11=0;
P12=0;
P13=1;
}
if(turn==0)//正转
{
step_index++;
if(step_index>7)
step_index=0;
}
else
{//反转
step_index--;
if(step_index<0)
step_index=7;
}
}
步进电机(键盘控制可调速加显示)
#include
#defineucharunsignedchar
staticunsignedintcount;//计数
staticintstep_index;//步进索引数,值为0-7
staticbitturn;//步进电机转动方向
staticbitstop_flag;//步进电机停止标志
staticintspeedlevel;//步进电机转速参数,数值越大速度越大,最小值为1,速度最慢
staticintspcount;//步进电机转速参数计数
voidddelay(void);//键盘扫描延时函数
voiddelay(unsignedintendcount);//延时函数,延时为endcount*1毫秒
voidgorun();//步进电机控制步进函数
voidDelay400Ms(void);
voidLCMInit(void);//LCM初始化
voidWriteCommandLCM(unsignedcharWCLCM,BuysC);//BuysC为0时忽略忙检测
voidDisplayOneChar(ucharX,ucharY,ucharDData);
voidDisplayListChar(ucharX,ucharY,ucharListLength,uchar*DData,ucharn);
sbitP10=P3^0;//电机端口定义
sbitP11=P3^1;
sbitP12=P3^2;
sbitP13=P3^3;
ucharcodespeed[]={0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30};
ucharcodestop[]={"stop"};
ucharcodego[]={"go:
"};
ucharcodeback[]={"back:
"};
ucharcodemax[]={"max:
8"};
/*键消抖延时函数*/
voidddelay(void)
{
uchari;
for(i=300;i>0;i--);
}
/*键扫描函数*/
ucharkeyscan(void)
{
ucharscancode;
uchartmpcode;
P1=0xf8;//发全0行扫描码
if((P1&0xf8)!
=0xf8)//若有键按下
{
ddelay();//延时去抖动
if((P1&0xf8)!
=0xf8)//延时后再判断一次,去除抖动影响
{
scancode=0xfe;
while((scancode&0x08)!
=0)//逐行扫描
{
P1=scancode;//输出行扫描码
if((P1&0xf8)!
=0xf8)//本行有键按下
{
tmpcode=(P1&0xf8)|0x07;
return((~scancode)+(~tmpcode));//返回特征字节码,为1的位即对应于行和列
}
elsescancode=(scancode<<1)|0x01;//行扫描码左移一位
}
}
}
return(0);//无键按下,返回值为0
}
voidmain(void)
{
ucharkey;
count=0;
step_index=0;
spcount=0;
P10=0;
P11=0;
P12=0;
P13=0;
EA=1;//允许CPU中断
TMOD=0x11;//设定时器0和1为16位模式1
ET0=1;//定时器0中断允许
TH0=0xFc;
TL0=0x18;//设定时每隔1ms中断一次
TR0=1;//开始计数
P0=0XFF;
P3&=0XEF;//573片选
LCMInit();//LCM初始化
Delay400Ms();
stop_flag=0;
turn=0;
speedlevel=5;
DisplayListChar(0,0,3,go,1);//每次扫描键盘显示更新一次ucharcodego[]
DisplayOneChar(0,1,0x35);//每次扫描键盘显示更新一次
while
(1)
{
key=keyscan();
switch(key)
{
case0x09:
//按键#,正转以speedlevel=1的速度转1000*0.5MS=0.5S
stop_flag=0;
turn=0;
speedlevel=5;
gorun();
WriteCommandLCM(0x01,1);//显示清屏,
DisplayListChar(0,0,3,go,0);//每次扫描键盘显示更新一次ucharcodego[]
DisplayOneChar(0,1,0x35);//每次扫描键盘显示更新一次
delay(1000);
break;
case0x0c:
//按键*,停止2000*0.5MS=0.5S
stop_flag=1;
WriteCommandLCM(0x01,1);//显示清屏,
DisplayListChar(0,0,4,stop,0);//每次扫描键盘显示更新一次
break;
case0x0a:
//按键0,反转以speedlevel=1的速度转1000*0.5MS=0.5S
stop_flag=0;
turn=1;
speedlevel=5;
gorun();
WriteCommandLCM(0x01,1);//显示清屏,
DisplayListChar(0,0,5,back,0);//每次扫描键盘显示更新一次
DisplayOneChar(0,1,0x35);//每次扫描键盘显示更新一次
delay(1000);
break;
case0x11:
//按键9,以--speedlevel的加速转1000*0.5MS=0.5S
stop_flag=0;
if(speedlevel==2)
{speedlevel=2;}
else{speedlevel--;}
gorun();
if(speedlevel==2)
{DisplayListChar(0,1,5,max,0);}
else{DisplayOneChar(0,1,speed[speedlevel]);}//每次扫描键盘显示更新一次
delay(1000);
break;
case0x12:
//按键8,以++speedlevel的减速转1000*0.5MS=0.5S
stop_flag=0;
speedlevel++;
gorun();
WriteCommandLCM(0x01,1);//显示清屏,
if(turn==0)
{DisplayListChar(0,0,3,go,0);//每次扫描键盘显示更新一次ucharcodego[]
DisplayOneChar(0,1,speed[speedlevel]);}//每次扫描键盘显示更新一次
else{DisplayListChar(0,0,5,back,0);//每次扫描键盘显示更新一次
DisplayOneChar(0,1,speed[speedlevel]);}//每次扫描键盘显示更新一次
delay(1000);
break;
}
}
}
//定时器0中断处理
voidtimeint(void)interrupt1
{
TH0=0xFc;
TL0=0x18;//设定时每隔1ms中断一次
count++;
spcount--;
if(spcount<=0)//速度调整,SPEEDLEVEL越大,延时越长(延时约为1MS*SPEEDLEVEL),
{//频率越小,速度越慢
spcount=speedlevel;
gorun();
}
}
voiddelay(unsignedintendcount)//延时函数,延时为endcount*0.5毫秒
{
count=0;
do{}
while(count}
voidgorun()
{
if(stop_flag==1)
{
P10=0;
P11=0;
P12=0;
P13=0;
return;
}
switch(step_index)
{
case0:
//0
P10=1;
P11=0;
P12=0;
P13=0;
break;
case1:
//0、1
P10=1;
P11=1;
P12=0;
P13=0;
break;
case2:
//1
P10=0;
P11=1;
P12=0;
P13=0;
break;
case3:
//1、2
P10=0;
P11=1;
P12=1;
P13=0;
break;
case4:
//2
P10=0;
P11=0;
P12=1;
P13=0;
break;
case5:
//2、3
P10=0;
P11=0;
P12=1;
P13=1;
break;
case6:
//3
P10=0;
P11=0;
P12=0;
P13=1;
break;
case7:
//3、0
P10=1;
P11=0;
P12=0;
P13=1;
}
if(turn==0)//正转
{
step_index++;
if(step_index>7)
step_index=0;
}
else
{//反转
step_index--;
if(step_index<0)
step_index=7;
}
}
步进电机(自动循环调速)
#include
sbitP00=P2^0;
sbitP01=P2^1;
sbitP02=P2^2;
sbitP03=P2^3;
staticunsignedintcount;//计数
staticintstep_index;//步进索引数,值为0-7
staticbitturn;//步进电机转动方向
staticbitstop_flag;//步进电机停止标志
staticintspeedlevel;//步进电机转速参数,数值越大速度越快,最小值为1,速度最慢
staticintspcount;//步进电机转速参数计数
voiddelay(unsignedintendcount);//延时函数,延时为endcount*0.5毫秒
voidgorun();//步进电机控制步进函数
voidmain(void)
{
count=0;
step_index=0;
spcount=0;
stop_flag=0;
P00=0;
P01=0;
P02=0;
P03=0;
EA=1;//允许CPU中断
TMOD=0x11;//设定时器0和1为16位模式1
ET0=1;//定时器0中断允许
TH0=0xFE;
TL0=0x0C;//设定时每隔0.5ms中断一次
TR0=1;//开始计数
turn=0;
do{
speedlevel=4;
delay(10000);//以speedlevel=4的速度转2000*0.5MS=1S
speedlevel=4;
delay(10000);//以speedlevel=4的速度转2000*0.5MS=1S
stop_flag=1;
delay(6000);//停止,2000*0.5MS=3S
stop_flag=0;
}while
(1);
}
//定时器0中断处理
voidtimeint(void)interrupt1
{
TH0=0xFE;
TL0=0x0C;//设定时每隔0.5ms中断一次
count++;
spcount--;
if(spcount<=0)
{
spcount=speedlevel;
gorun();
}
}
voiddelay(unsignedintendcount)
{
count=0;
do{}while(count}
voidgorun()
{
if(stop_flag==1)
{
P00=0;
P01=0;
P02=0;
P03=0;
return;
}
switch(step_index)
{
case0:
//0
P00=1;
P01=0;
P02=0;
P03=0;
break;
case1:
//0、1
P00=1;
P01=1;
P02=0;
P03=0;
break;
case2:
//1
P00=0;
P01=1;
P02=0;
P03=0;
break;
case3:
//1、2
P00=0;
P01=1;
P02=1;
P03=0;
break;
case4:
//2
P00=0;
P01=0;
P02=1;
P03=0;
break;
case5:
//2、3
P00=0;
P01=0;
P02=1;
P03=1;
break;
case6:
//3
P00=0;
P01=0;
P02=0;
P03=1;
break;
case7:
//3、0
P00=1;
P01=0;
P02=0;
P03=1;
}
if(turn==0)
{
step_index++;
if(step_index>7)
step_index=0;
}
else
{
step_index--;
if(step_index<0)
step_index=7;
}
}