加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

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

2小时前
89
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

功能:

控制步进电机实现加速、减速、正转,反转,停止,并用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);

 

  • 有需要资料的可了解一下.docx

相关推荐

电子产业图谱