步进电机程序2.docx
- 文档编号:8743446
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:24
- 大小:19.54KB
步进电机程序2.docx
《步进电机程序2.docx》由会员分享,可在线阅读,更多相关《步进电机程序2.docx(24页珍藏版)》请在冰豆网上搜索。
步进电机程序2
步进电机控制程序
步进电机(键盘控制可调速)
#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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 步进 电机 程序
