ARM课程设计步进电机键盘控制可调速.docx

上传人:b****4 文档编号:12111056 上传时间:2023-04-17 格式:DOCX 页数:17 大小:17.01KB
下载 相关 举报
ARM课程设计步进电机键盘控制可调速.docx_第1页
第1页 / 共17页
ARM课程设计步进电机键盘控制可调速.docx_第2页
第2页 / 共17页
ARM课程设计步进电机键盘控制可调速.docx_第3页
第3页 / 共17页
ARM课程设计步进电机键盘控制可调速.docx_第4页
第4页 / 共17页
ARM课程设计步进电机键盘控制可调速.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

ARM课程设计步进电机键盘控制可调速.docx

《ARM课程设计步进电机键盘控制可调速.docx》由会员分享,可在线阅读,更多相关《ARM课程设计步进电机键盘控制可调速.docx(17页珍藏版)》请在冰豆网上搜索。

ARM课程设计步进电机键盘控制可调速.docx

ARM课程设计步进电机键盘控制可调速

步进电机(键盘控制可调速)

#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{}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1