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