基于51单片机的步进电机控制性系统

功能:

控制步进电机实现加速、减速、正转,反转,停止,并用LCD12864显示相关信息。

#define KEY_GLOBAL  1

#include "Key.h"

static uchar keyValueBuff;             //读取键值的缓冲区

static uchar keyValueOld;              //前一次的键值

static uchar keyValueTemp;                        //键值中间交换变量

static uint  stillTimes;               //键按下保持次数

static uint  stillTimesMax;

static uchar get_data_1_count(uchar number);

static void read_all_key(uchar *buff);

/**********************************************************

*函数名称:keyDelay(uint us)

*函数功能:毫秒级延时

*函数入口:延时计数变量us

*函数出口:无

***********************************************************/

void keyDelay(uint us)

{

   uchar delayi;

   while(--us)

   {

          for(delayi=0;delayi<10;delayi++);

   }

}                                                                                                                                   

/*******************************************

*函数名称:key_init(void)

*函数功能:初始化按键扫描

*函数入口:无

*函数出口:无

*******************************************/

void key_init(void)

{

    keyValueBuff = 0x00;

    keyValueOld = 0x00;

    keyValueTemp = 0x00;

    stillTimes = 0;

    stillTimesMax = FIRST_TIMES;

}

/******************************************************

*函数名称:read_all_key(uchar *buff)

*函数功能:扫描按键下的键,将按下的键的位置存入变量buff

*函数入口:buff

*函数出口:无

*******************************************************/

void read_all_key(uchar *buff)

{

   if(IN_PRESS_FRONT==KEY_FORCE_VALUE)   //检测按下的键

          READ_KEY(1,KEY_FRONT,*buff);

   else

     READ_KEY(0,KEY_FRONT,*buff);

   if(IN_PRESS_QUEEN==KEY_FORCE_VALUE)   //检测按下的键

     READ_KEY(1,KEY_QUEEN,*buff);

   else

     READ_KEY(0,KEY_QUEEN,*buff);

  

   if(IN_PRESS_ADD==KEY_FORCE_VALUE)        //检测按下的键

     READ_KEY(1,KEY_ADD,*buff);

   else

     READ_KEY(0,KEY_ADD,*buff);

   if(IN_PRESS_REDUCE==KEY_FORCE_VALUE) //检测按下的键

     READ_KEY(1,KEY_REDUCE,*buff);

   else

     READ_KEY(0,KEY_REDUCE,*buff);

   if(IN_PRESS_STOP==KEY_FORCE_VALUE)  //检测按下的键

     READ_KEY(1,KEY_STOP,*buff);

   else

     READ_KEY(0,KEY_STOP,*buff);

}

/******************************************************

*函数名称:get_key_value(void)

*函数功能:读取键值

*函数入口:无

*函数出口:返回按下的有效键值

*******************************************************/

uchar get_key_value(void)

{

    keyValueBuff = 0x00;

    read_all_key(&keyValueBuff);

    keyValueTemp = keyValueBuff;

    keyDelay(KEY_DELAY_TIME);

    read_all_key(&keyValueBuff);

    /* 两次读到的键盘值相同 则为有效键盘值 */

    if( keyValueTemp == keyValueBuff )

    {

        if(keyValueTemp == 0)

        {

            keyValueOld = 0;

            stillTimes = 0;

            stillTimesMax = FIRST_TIMES;

            return 0;

        }

        else if(keyValueOld != keyValueTemp)

        {

            stillTimes = 0;

            keyValueOld = keyValueTemp;

            #if CAN_MORE_PRESS

                return keyValueTemp;

            #else

                if( 1 == get_data_1_count(keyValueTemp) )

                {

                    return keyValueTemp;

                }

                else

                {

                    return 0;

                }

            #endif

        }

        else if(keyValueOld == keyValueTemp)

        {

            #if CAN_MORE_PRESS == 0

                if( 1 != get_data_1_count(keyValueTemp) )

                {

                    stillTimes = 0;

                    return 0;

                }

            #endif

            #if CAN_REPEAT

                stillTimes ++;

                if(stillTimes > stillTimesMax)

                {

                    stillTimes = 0;

                    #if REPEAT_MODE

                        if(FIRST_TIMES == stillTimesMax)

                        {

                            stillTimesMax = OTHER_TIMES;

                        }

                    #endif

                    return keyValueTemp;

                }

            #else

                stillTimes = 0;

                return 0;

            #endif

        }

    }

    else

    {

        stillTimes = 0;

        return 0;

    }

    return 0;

}

/**********************************************************

*函数名称:get_data_1_count(uchar number)

*函数功能:计算uchar类型变量中1的数量,用于检测是否多键按下

*函数入口:number,需要检测1数量的变量

*函数出口:返回变量bumber中1的数量

***********************************************************/

uchar get_data_1_count(uchar number)

{

    register uchar i,j = 0;

    for(i = 0; i < 8; i ++)

    {

        if( (number&_BV(i)) )

        {

            j ++;

        }

    }

    return j;

}

         case MOTER_FRONT_LOWER:      //正转低速运行

         {

           display_state(0x02);

           display_speed(0x02);

           break;

         }

         case MOTER_QUEEN_ADD:  //反转加速运行

         {

           display_state(0x03);

           display_speed(0x03);

           break;

         }

         case MOTER_QUEEN_REDUCE: //反转减速运行

         {

           display_state(0x03);

           display_speed(0x04);

           break;

         }

         case MOTER_QUEEN_NOMAL: //反转正常运行

         {

           display_state(0x03);

           display_speed(0x01);

           break;

         }

         case MOTER_QUEEN_LOWER: //反转低速运行

         {

           display_state(0x03);

           display_speed(0x02);

           break;

         }

         default:

           break;

  }

  if(moterState!=MOTER_STOP)

  {

    Lcd_Character_16X16(1,60,64,SPEED_STATE[6]); //运

         Lcd_Character_16X16(1,60,80,SPEED_STATE[7]); //行

  }

}

/************************************************************

*实例名称:步进电机

*实例说明:实现步进电机的正反转以及加减速控制,并在LCD屏上实时

显示步进电机的状态

*作者:yd

*时间:09.06.20

************************************************************/

#include "target.h"

#include "key.h"

#define MOTER_SPEED_NORMAL 10   //电机正常运行上限

#define MOTER_SPEED_MIN    25   //电机低速运行下限

uchar timer0Count;              //timer0中断溢出计数 

uchar moterStep;               //电机步数         (0x00~0x07)

uint  moterSpeed;                     //速度值变化量    (0~moterSpeedMax)

uint  moterSpeedMax;            //速度最快值

uchar moterState;               //电机运行状态

uchar moterDirect;              //电机运转方向,静止/0x00;正转/0x01;反转/0x02

uchar moterAddReduce;           //电机加速及减速量

uchar speedDirect;              //0x01,电机加速;0x02,电机减速

bit display_is_ok;              //显示屏是否需要更新

/**********************************************************

MOTER_STOP,停止;MOTER_FRONT_ADD,正转加速

MOTER_FRONT_REDUCE,正转减速;MOTER_FRONT_NORMAL,正转正常

MOTER_FRONT_LOWER,正转低速;MOTER_QUEEN_ADD,反转加速

MOTER_QUEEN_REDUCE,反转减速,MOTER_QUEEN_NOMAL,反转正常

MOTER_QUEEN_LOWER,反转低速

***********************************************************/

void main()

{

  uchar keyValueRead;

  target_init();

  moterState=MOTER_STOP;

  timer0Count=0x00;

  moterAddReduce=0x00;

  moterStep=0x00;

  moterSpeed=0x00;  

  moterSpeedMax=0x00;  //默认停止

  moterDirect=0x00;        //默认停止

  moter_state_display(MOTER_STOP);

  display_is_ok=1;

  sei();

  while(1)

  {

    keyValueRead=get_key_value();

         switch(keyValueRead)

         {

           case KEY_FRONT:         //正转

           {

             moterState=MOTER_FRONT_LOWER;

                  moterDirect=0x01;

                  moterSpeedMax=MOTER_SPEED_MIN;

                  display_is_ok=0;

                  //moter_state_display(MOTER_FRONT_LOWER);

                  break;

           }

           case KEY_QUEEN:        //反转

           {

             moterState=MOTER_QUEEN_LOWER;

                  moterDirect=0x02;

                  moterSpeedMax=MOTER_SPEED_MIN;

                  display_is_ok=0;

                  //moter_state_display(MOTER_QUEEN_LOWER);

                  break;

           }

        

   if(moterSpeed<moterSpeedMax)

     moterSpeed++;

   else

   {

     moterSpeed=0x00;

          if(moterDirect==0x01) //正转

          {

            if(moterStep>0x00)

              moterStep--;

            else

              moterStep=0x07;

          }

          else if(moterDirect==0x02)  //反转

               {

                      if(moterStep<0x07)

                   moterStep++;

                 else

                   moterStep=0x00;

               }

          ground(moterStep);

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值