步进电机C语言程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

break; lb=1; //d mDelay(road); if(!Speed--) break; la=0; //da mDelay(road); Speed--; } P3=P3|0x0f;//将四个脚输出置高 } unsigned char left(unsigned int Speed,unsigned int road)//两个参数代表步进量和转速 { //步进节拍 A-AD-D-DB-B-BC-C-CA while(1){ if(!Speed)//判断步进量走完没?以下都是,每走一步,判断一次 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--)
//这里我们不考虚 P2 的高四位,如果不影响高四位,可以用 P2&=0xf0;P2+=dataout[datac];要两句
//这样就不引影响到高四位了 mDelay(road); } while(Speed--); P2=0xff; //这里也一样,如果不影响高四位就得用 P3|=0x0f } unsigned char left(unsigned int Speed,unsigned int road) { //步进节拍 A-AD-D-DB-B-BC-C-CA do{//循环步进到指定角位
while(DelayTime--){ for(j=0;j<10;j++){} } } unsigned char key()//键盘扫描是否有键按下,这里只扫描一列四个键,其它不用 { uchar KeyV; P0=0xfe; KeyV=P0; if(KeyV==0xfe)//只扫描一列
return(0); mwk.baidu.comelay(100); KeyV=P0; if(KeyV==0xfe)
unsigned char dataout[8]={0xfe,0xfa,0xfb,0xf9,0xfd,0xf5,0xf7,0xf6}; //这里我们定义 8 组数,分别对应八拍:A-AC-C-CB-B-BD-D-DA 从板上设计来分配,
选择 P2 口的低四位输出 //相应的输出也可以反应在 LED 灯上 //P2。0 为 A 相,P2。1 为 B 相,P2。2 为 C 相,P2。3 为 D 相,将高四位都置 1,也
return(0); else return(KeyV); }
//两相 5、6 线步进电机,分为四拍和八拍,这里介绍输出八拍的第二种方式: A-AC-C-CB-B-BD-D-DA //四拍:A-C-B-D,因此在八拍的基础上减去中间的就可以了,不过步距角要大一倍 #include <reg52.h> #include <intrins.h>
void main() { uchar i=0; while(1){
if(key()==0xde){//8 的按键按下 for(i=0;i<34;i+=3){ if(lhj[i]) //调入数组
right(lhj[i+1],lhj[i+2]); //两个参数代表步进量和转速 else left(lhj[i+1],lhj[i+2]); if(key()==0xee)//C 的按键按下 break; } } if(key()==0x7e) //1 的按键接下,正转 1 步 right(1,20); if(key()==0xbe) //4 的按键接下,反转 1 步 left(1,20); }
if(key()==0xee)//C 的按键按下 break; } } }
} unsigned char right(unsigned int Speed,unsigned int road)//两个参数代表步进量和转速 { //步进节拍:A-AC-C-CB-B-BD-D-DA while(1){
if(datac==0)//索引号超出 0 回到 8 datac=7; else datac--; P2=dataout[datac];///这里就在 P2 口输出我们定义好的相序步进,P2。0 为 A 相,P2。1 为 B 相,P2。2 为 C 相,P2。3 为 D 相
//这里我们不考虚 P2 的低四位,如果不影响高四位,可以用 P2&=0xf0;P2+=dataout[datac];要两句
#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}; //定义电机动作的参数,每三个数为一组,第一个是方向(1、正转,0、反转) //第二个是步进量,第三个是转速 unsigned char key();//键盘动作,这里的键盘扫描只用到四个按键有效(板上标的 0,4,8, C) unsigned char right(unsigned int Speed,unsigned int road); //正转 unsigned char left(unsigned int Speed,unsigned int road); //反转 void mDelay(unsigned int DelayTime); //延时函数
void main() { uchar i=0; while(1){
if(key()==0xde){//8 的按键按下 for(i=0;i<34;i+=3){//循环输出我们定义好的动作数据 if(lhj[i]) //调入数组,先判断正反转
right(lhj[i+1],lhj[i+2]); //两个参数代表步进量和转速 else left(lhj[i+1],lhj[i+2]);
//这样就不引影响到高四位了 mDelay(road); } while(Speed--); P2=0xff;//这里也一样,如果不影响高四位就得用 P2|=0x0f; } void mDelay(unsigned int DelayTime) //延时函数 { unsigned char j=0;
就是 F。 //我们用索引的方式输出,比如正转,元素由 0 到 8 这样的循环,反转则由 8 到 0 的循环 //程序中我们保存索引号,比如上次转在第 4 元素停下,则下次的正转由 5 开始向后计数,
反转则由 3 开始向前计数 //这样,电机的转角度就会很准确
unsigned char datac=0;//定义这个为存放索引号(元素号)
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;//将四个脚输出置高 } void mDelay(unsigned int DelayTime) //延时函数 { unsigned char j=0;
return(0); else return(KeyV); }
} unsigned char right(unsigned int Speed,unsigned int road)//两个参数代表步进量和转速 { //步进节拍:A-AC-C-CB-B-BD-D-DA do{//循环步进到指定角位
if(datac==7)//索引号超出 8 回到 0 datac=0; else datac++; P2=dataout[datac];//这里就在 P2 口输出我们定义好的相序步进,P2。0 为 A 相,P2。1 为 B 相,P2。2 为 C 相,P2。3 为 D 相
if(!Speed) //判断步进量走完没?以下都是,每走一步,判断一次 break; ld=1; la=0; //a mDelay(road);//这里的延时就可控制转速 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--)
步进电机 C 语言程序
2009-04-18 20:20:42| 分类: 单片机|字号 订阅
//两相 5、6 线步进电机,分为四拍和八拍,这里介绍输出八拍方式:A-AC-C-CB-B-BD-D-DA //四拍:A-C-B-D,因此在八拍的基础上减去中间的就可以了,不过步距角要大一倍 #include <reg51.h> #include <intrins.h>
sbit la=P2^0; //定义两相电机的四组线,从板上设计来分配,选择 P2 口的低四位输出,相 应的输出也可以反应在 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;
unsigned char key();//键盘动作,这里的键盘扫描只用到四个按键有效(板上标的 0,4,8, C) unsigned char right(unsigned int Speed,unsigned int road); //正转 unsigned char left(unsigned int Speed,unsigned int road); //反转 void mDelay(unsigned int DelayTime); //延时函数
#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}; //定义电机动作的参数,每三个数为一组,第一个是方向(1、正转,0、反转) //第二个是步进量,第三个是转速
while(DelayTime--){ for(j=0;j<10;j++){} } } unsigned char key()//键盘扫描是否有键按下,这里只扫描一列四个键,其它不用 { uchar KeyV; P0=0xfe; KeyV=P0; if(KeyV==0xfe)//只扫描一列
return(0); mDelay(100); KeyV=P0; if(KeyV==0xfe)
相关文档
最新文档