/******************************************************************/
/*****************************************************************/
/*
/* 步进电机加减速运行程序
/* 步进电机启动时,转速由慢到快逐步加速。
/* 步进电机匀速运行
/* 步进电机由快到慢逐步减速到停止
/*
/******************************************************************/
#include <reg52.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
sbit addr0 = P1^4;
sbit addr1 = P1^5;
sbit addr2 = P1^6;
sbit addr3 = P1^7;
uchar code FFW[8]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06};//正转数组
uchar code REV[8]={0x06,0x07,0x03,0x0b,0x09,0x0d,0x0c,0x0e};//反转数组
uchar rate ;
/********************************************************/
/*
/* 延时
/* 11.0592MHz时钟,
/*
/********************************************************/
void delay()
{
uchar k;
uint s;
k = rate;
do
{
for(s = 0 ; s <200 ; s++) ;
}while(--k);
}
void delay2(uchar k)
{
uchar s;
for(s = 0 ; s <k ; s++) ;
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw()
{
uchar i;
for (i=0; i<8; i++) //一个周期转30度
{
P0 = FFW[i];//取数据
addr0 = 1;
addr1 = 0;
addr2 = 1;
addr3 = 1;
addr3 = 0;
delay(); //调节转速
}
}
/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void motor_rev()
{
uchar i;
for (i=0; i<8; i++) //一个周期转30度
{
P0 = REV[i]; //取数据
addr0 = 1;
addr1 = 0;
addr2 = 1;
addr3 = 1;
addr3 = 0;
delay(); //调节转速
}
}
/********************************************************
*
*步进电机运行
*
*********************************************************/
void motor_turn()
{
uchar x;
rate=0x30;
x=0xf0;
do
{
motor_ffw(); //正转加速
rate--;
}while(rate!=0x0a);
do
{
motor_ffw(); //正转匀速
x--;
}while(x!=0x01);
do
{
motor_ffw(); //正转减速
rate++;
}while(rate!=0x30);
do
{
motor_rev(); //反转加速
rate--;
}while(rate!=0x0a);
do
{
motor_rev(); //反转匀速
x--;
}while(x!=0x01);
do
{
motor_rev(); //反转减速
rate++;
}while(rate!=0x30);
}
/********************************************************
*
* 主程序
*
*********************************************************/
main()
{
P1=0xf0;
while(1)
{
P0 = 0x00;//ULN2003输出高电平
addr0 = 1;
addr1 = 0;
addr2 = 1;
addr3 = 1;
addr3 = 0;
delay2(255);
motor_turn();
}
}