找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2439|回复: 0
打印 上一主题 下一主题
收起左侧

这是的按键控制程序 现在需要改成独立按键控制电机45° 90°180°正转的程序 求教

[复制链接]
跳转到指定楼层
楼主
ID:77900 发表于 2015-4-24 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <REG51.H>                    /* 包含MCS51寄存器头文件 */
#define uchar unsigned char             /* 宏定义 */
#define uint unsigned int                /* 宏定义 */
uchar code CW[8]={ 0x08, 0x0C, 0x04, 0x06, 0x02, 0x03, 0x01,0x09};    /*正时钟旋转相序表*/
uchar code CCW[8]={0x09,0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08};   /*逆时钟旋转相序表*/
uchar speed;                                                /*电机转速调节参数*/
/*****************************函数声明*************************************/
void delay(uint k);                 /*延时子函数*/
void motor_cw(void);              /*电机正转子函数*/
void motor_ccw(void);             /*电机反转子函数*/
void motor_acc_cw(void);          /*电机加速正转子函数*/
void motor_acc_ccw(void);         /*电机加速反转子函数*/
void motor_dec_cw(void);          /*电机减速正转子函数*/
void motor_dec_ccw(void);         /*电机减速反转子函数*/
uchar scan_key(void);              /* 键值扫描子函数 */
void adm_key(void);               /* 键值管理子函数 */
void main(void)
{
delay(200);
while(1)
{
    adm_key();                   /* 调用键值管理子函数 */
}
}      
void motor_cw(void)                /*电机正转子函数*/
{
uchar i,keycode;
while(1)                          /*无限循环*/           
{
keycode= scan_key();
for(i=0;i<8;i++)                   /*旋转0.7*/
  {
   P2=CW;
   delay(5);                      /*调节转速*/
  }
  if(keycode!=0xfb)break;           /*如果有其它按键按下,则跳出while循环*/
}
}
void motor_ccw(void)               /*电机反转子函数*/
{
uchar i,keycode;
while(1)
{
keycode= scan_key();
for(i=0;i<8;i++)                    /*旋转0.7*/
{
   P2=CCW;
   delay(5);                       /*调节转速*/
  }
  if(keycode!=0xf7)break;            /*如果有其它按键按下,则跳出while循环*/
}
}
void motor_acc_cw(void)             /*电机加速正转子函数*/
{
  uchar i,j,keycode;
  while(1)
  {
        speed=20;
  while(--speed>5)
  {
   for(j=0;j<50;j++)                  /*控制每速度档的运行时间*/
   {
    for(i=0;i<8;i++)                  /*旋转0.7*/
    {
     P2=CW;
     delay(speed);                   /*调节转速*/
    }
                 keycode=scan_key();
     if(keycode!=0xef)break;          /*如果有其它按键按下,则跳出第二层for循环*/
   }
          keycode=scan_key();
    if(keycode!=0xef)break;           /*如果有其它按键按下,则跳出第一层while循环*/
  }
         keycode=scan_key();
   if(keycode!=0xef)break;            /*如果有其它按键按下,则跳出第二层while循环*/
}
}
void motor_acc_ccw(void)             /*电机加速反转子函数*/
{
  uchar i,j,keycode;
  while(1)
  {       
  speed=20;
  while(--speed>5)
  {
   for(j=0;j<50;j++)
   {
    for(i=0;i<8;i++)                  /*旋转0.7*/
    {
     P2=CCW;
     delay(speed);                   /*调节转速*/
    }
                 keycode=scan_key();
     if(keycode!=0xef)break;         /*如果有其它按键按下,则跳出第二层for循环*/
   }
          keycode=scan_key();
    if(keycode!=0xef)break;           /*如果有其它按键按下,则跳出第一层while循环*/
  }
  keycode= scan_key();
  if(keycode!=0xdf)break;             /*如果有其它按键按下,则跳出第二层while循环*/
}
}
void motor_dec_cw(void)               /*电机减速正转子函数*/
{
  uchar i,j,keycode;
  while(1)
  {       
  speed=5;
  while(++speed<20)
  {
   for(j=0;j<50;j++)
   {
    for(i=0;i<8;i++)                   /*旋转0.7*/
    {
     P2=CW;
     delay(speed);                 /*调节转速*/
    }
                 keycode=scan_key();
     if(keycode!=0xef)break;         /*如果有其它按键按下,则跳出第二层for循环*/
   }
          keycode=scan_key();
    if(keycode!=0xef)break;          /*如果有其它按键按下,则跳出第一层while循环*/
  }
  keycode= scan_key();
  if(keycode!=0xbf)break;             /*如果有其它按键按下,则跳出第二层while循环*/
}
}
void motor_dec_ccw(void)             /*电机减速反转子函数*/
{
  uchar i,j,keycode;
  while(1)
  {       
  speed=5;
  while(++speed<20)
  {
   for(j=0;j<50;j++)
   {
    for(i=0;i<8;i++)                  /*旋转0.7*/
    {
     P2=CCW;
     delay(speed);                  /*调节转速*/
    }
                 keycode=scan_key();
     if(keycode!=0xef)break;          /*如果有其它按键按下,则跳出第二层for循环*/
   }
          keycode=scan_key();
    if(keycode!=0xef)break;           /*如果有其它按键按下,则跳出第一层while循环*/
  }
   keycode= scan_key();        
   if(keycode!=0x7f)break;            /*如果有其它按键按下,则跳出第二层while循环*/
}
}
uchar scan_key(void)                  /* 键值扫描子函数 */
{
uchar keycode;
P3=0xff;
if(P3!=0xff)                             /* 是否有键按下 */
  {
   delay( 10 );                           /* 延时去抖*/
   if(P3!=0xff)keycode=P3;                 /* 确实有键按下,取键值 */
  }                              
return keycode;                                /* 返回键值 */
}                           
void adm_key(void)                         /* 键值管理子函数 */
{
        uchar t1,t2,t3,t4,t5,t6,keycode;
        keycode=scan_key();                     /*扫键值*/
        switch(keycode)
        {
                case 0xfb:                           /*如果S1按键按下*/
                        {
                                for(t1=0;t1<112;t1++)P2=0x00;  /*停机让电机稳定一下*/
                                motor_cw();                       /*调用正转子函数*/
                        }break;
                       
                        case 0xf7:                        /*如果S2按键按下*/
                        {
                                for(t2=0;t2<112;t2++)P2=0x00;   /*停机让电机稳定一下*/
                                motor_ccw();                        /*调用反转子函数*/
                        }        break;
                       
                        case 0xef:                         /*如果S3按键按下*/
                        {
                                for(t3=0;t3<112;t3++)P2=0x00;    /*停机让电机稳定一下*/
                                motor_acc_cw();                     /*调用加速正转子函数*/
                        }break;
                       
                        case 0xdf:                          /*如果S4按键按下*/
                        {
                                for(t4=0;t4<112;t4++)P2=0x00;     /*停机让电机稳定一下*/
                                motor_acc_ccw();                      /*调用加速反转子函数*/
                        }        break;
                       
                        case 0xbf:                          /*如果S5按键按下*/
                        {
                                for(t5=0;t5<112;t5++)P2=0x00;     /*停机让电机稳定一下*/
                                motor_dec_cw();                      /*调用减速正转子函数*/
                        }break;
                       
                        case 0x7f:                          /*如果S6按键按下*/
                        {
                                for(t6=0;t6<112;t6++)P2=0x00;     /*如果S5按键按下*/
                                motor_dec_ccw();                       /*调用减速反转子函数*/
                        }break;
                        default:break;
        }
}
void delay(uint k)               /* 定义延时子函数 */
{
        uint i,j;
        for(i=0;i<k;i++)
        {
                for(j=0;j<121;j++);
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表