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

发布时间:2023-02-09  

功能:

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

*函数出口:无

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


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)


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()

{


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>