步进电机键盘控制可调速.docx
- 文档编号:25885538
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:24
- 大小:20.40KB
步进电机键盘控制可调速.docx
《步进电机键盘控制可调速.docx》由会员分享,可在线阅读,更多相关《步进电机键盘控制可调速.docx(24页珍藏版)》请在冰豆网上搜索。
步进电机键盘控制可调速
步进电机(键盘控制可调速)1.2.3转载专业文档2008-04-0422:
52:
35阅读779评论0字号:
大中小
步进电机(键盘控制可调速)
#include
#defineucharunsignedchar
staticunsignedintcount;//计数
staticintstep_index;//步进索引数,值为0-7
staticbitturn;//步进电机转动方向
staticbitstop_flag;//步进电机停止标志
staticintspeedlevel;//步进电机转速参数,数值越大速度越大,最小值为1,速度最慢
staticintspcount;//步进电机转速参数计数
voidddelay(void);//键盘扫描延时函数
voiddelay(unsignedintendcount);//延时函数,延时为endcount*1毫秒
voidgorun();//步进电机控制步进函数
sbitP10=P2^0;//电机端口定义
sbitP11=P2^1;
sbitP12=P2^2;
sbitP13=P2^3;
/*键消抖延时函数*/
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;//开始计数
stop_flag=0;
turn=0;
speedlevel=20;
while
(1)
{
key=keyscan();
switch(key)
{
case0x09:
//按键#,正转以speedlevel=1的速度转1000*0.5MS=0.5S
stop_flag=0;
turn=0;
speedlevel=10;
gorun();
delay(1000);
break;
case0x0c:
//按键*,停止2000*0.5MS=0.5S
stop_flag=1;
break;
case0x0a:
//按键0,反转以speedlevel=1的速度转1000*0.5MS=0.5S
stop_flag=0;
turn=1;
speedlevel=10;
gorun();
delay(1000);
break;
case0x11:
//按键9,以--speedlevel的加速转1000*0.5MS=0.5S
stop_flag=0;
if(speedlevel==1)
{speedlevel=1;}
else{--speedlevel;}
gorun();
delay(1000);
break;
case0x12:
//按键8,以++speedlevel的减速转1000*0.5MS=0.5S
stop_flag=0;
++speedlevel;
gorun();
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 #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; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 步进 电机 键盘 控制 调速