/**************************************************************************************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
实验名称:四线双极性步进电机实验
接线说明:
实验现象:下载程序后,ps2的x轴控制方向,y轴控制速度大小
注意事项:
***************************************************************************************/
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
//定义TC1508S控制步进电机管脚
sbit IN_A=P1^0;
sbit IN_B=P1^1;
sbit IN_C=P1^2;
sbit IN_D=P1^3;
//定义独立按键控制脚
sbit URX=P3^5;
sbit URY=P3^6;
sbit SW=P3^7;
#define URX_PRESS1 1
#define URX_PRESS2 2
#define URY_PRESS1 3
#define URY_PRESS2 4
#define SW_PRESS 5
#define NO_PRESS 0
// 定义步进电机速度,值越小,速度越快
// 最小不能小于1
#define STEPMOTOR_MAXSPEED 1
#define STEPMOTOR_MINSPEED 5
/*******************************************************************************
* 函 数 名 : delay_10us
* 函数功能 : 延时函数,ten_us=1时,大约延时10us
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_10us(u16 ten_us)
{
while(ten_us--);
}
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时函数,ms=1时,大约延时1ms
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************************
* 函 数 名 : step_motor_send_pulse
* 函数功能 : 输出一个数据给TC1508S从而实现向步进电机发送一个脉冲
* 输 入 : step:指定步进序号,可选值0~7
dir:方向选择,1:顺时针,0:逆时针
* 输 出 : 无
*******************************************************************************/
void step_motor_send_pulse(u8 step,u8 dir)
{
u8 temp=step;
if(dir==0) //如果为逆时针旋转
temp=7-step;//调换节拍信号
switch(temp)//8个节拍控制:(A+)->(A+B+)->(B+)->(B+A-)->(A-)->(A-B-)->(B-)>(B-A+)
{
case 0: IN_A=1;IN_B=0;IN_C=0;IN_D=0;break;
case 1: IN_A=1;IN_B=0;IN_C=1;IN_D=0;break;
case 2: IN_A=0;IN_B=0;IN_C=1;IN_D=0;break;
case 3: IN_A=0;IN_B=1;IN_C=1;IN_D=0;break;
case 4: IN_A=0;IN_B=1;IN_C=0;IN_D=0;break;
case 5: IN_A=0;IN_B=1;IN_C=0;IN_D=1;break;
case 6: IN_A=0;IN_B=0;IN_C=0;IN_D=1;break;
case 7: IN_A=1;IN_B=0;IN_C=0;IN_D=1;break;
default: IN_A=0;IN_B=0;IN_C=0;IN_D=0;break;//停止相序
}
}
/*******************************************************************************
* 函 数 名 : key_scan
* 函数功能 : 检测独立按键是否按下,按下则返回对应键值
* 输 入 : mode=0:单次扫描按键
mode=1:连续扫描按键
* 输 出 : KEY1_PRESS:K1按下
KEY2_PRESS:K2按下
KEY3_PRESS:K3按下
KEY4_PRESS:K4按下
KEY_UNPRESS:未有按键按下
*******************************************************************************/
//u8 key_scan(u8 mode)
//{
// static u8 key=1;
//
// if(mode)key=1;//连续扫描按键
// if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))//任意按键按下
// {
// delay_10us(1000);//消抖
// key=0;
// if(KEY1==0)
// return KEY1_PRESS;
// else if(KEY2==0)
// return KEY2_PRESS;
// else if(KEY3==0)
// return KEY3_PRESS;
// else if(KEY4==0)
// return KEY4_PRESS;
// }
// else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //无按键按下
// {
// key=1;
// }
// return KEY_UNPRESS;
//}
/*******************************************************************************
* 函 数 名 : sp2_scan
* 函数功能 : 检测sp2是否转动,转动则返回对应值
* 输 入 : mode=0:单次扫描sp2
mode=1:连续扫描sp2
* 输 出 : URX_PRESS1: X轴正向转动
URX_PRESS2: X轴负向转动
URY_PRESS1: Y轴正向转动
URY_PRESS2: Y轴负向转动
SW_PRESS: Z键按下
NO_PRESS:没有操作
*******************************************************************************/
u8 sp2_scan(u8 mode)
{
static u8 sp2=1;
if(mode)sp2=1;//连续扫描SP2
if(sp2==1&&(URX==0||URY==0||SW==0))//任意值改变
{
delay_10us(1000);//消抖
sp2=0;
if(URX==0)
return URX_PRESS1;
else if(URX==1)
return URX_PRESS2;
else if(URY==0)
return URY_PRESS1;
else if(URY==1)
return URY_PRESS2;
else if(SW==0)
return SW_PRESS;
}
else if(URX==1&&URY==1&&SW==1) //无操作
{
sp2=1;
}
return NO_PRESS;
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 sp2=0;
u8 dir=0;//默认逆时针方向
u8 speed=STEPMOTOR_MAXSPEED;//默认最大速度旋转
u8 step=0;
while(1)
{
sp2=sp2_scan(0);
if(sp2==URX_PRESS1)//换向
{
dir=!dir;
}
else if(sp2==URY_PRESS1)//加速
{
if(speed>STEPMOTOR_MAXSPEED)
speed-=1;
}
else if(sp2==SW_PRESS)//减速
{
if(speed<STEPMOTOR_MINSPEED)
speed+=1;
}
step_motor_send_pulse(step++,dir);
if(step==8)step=0;
delay_ms(speed);
}
}