单片机控制步进电机要求:有加速、减速、停止、正转、反转按钮,电机是四相五线,控制两个步进电机,c程序

最好带有硬件电路,驱动最好是L297和L298,谢谢各位大侠啊
芯片是AT89c52,要付费的不要来,俺穷得很

我用的是控制一个步进电机的,这个是我以前写的,你的要求在下面的程序做修改就行了;程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

//uchar table[]={0x18,0x30,0x60,0x48,0x48,0x60,0x30,0x18}; //二相励磁
uchar table[]={0x08,0x10,0x20,0x40,0x40,0x20,0x10,0x08}; //一相励磁
uchar num=0,maichong,zhengfan;

sbit add_key=P3^2; //加速键
sbit reduce_key=P3^3; //减速键
sbit zhengfan_key=P3^4; //正反转按键

void delay(uint z) //延时1ms
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}

void only_key() //按键处理
{
static uchar flag; //定义成静态只被定义一次
if(zhengfan_key==0) //检测正反按键是否被按下
{
delay(5);
if(zhengfan_key==0)
{
flag=~flag; //取反
if(flag==0)
zhengfan=0; //正转,取数组前四位
else
zhengfan=4; //反转,取数组后四位
while(!zhengfan_key);
}
}
if(add_key==0) //检测加按键是否被按下
{
delay(5);
if(add_key==0) //消抖
{
num++; //加速键按下,速度标志加1
if(num==4) //已达到最大值3
num=3;
while(!add_key);
}
}
if(reduce_key==0) //检测减按键是否被按下
{
delay(5);
if(reduce_key==0)
{
if(num!=0)
num--; //减速键按下,速度标志减1
else
num=0; //减速到0则保持
while(!reduce_key);
}
}

}

void deal() //根据速度标志进行数据处理
{
switch(num)
{
case 0: P0=0x06; //数据管显示1
maichong=5; //转速最慢
break;
case 1: P0=0x5b; //数据管显示2
maichong=4;
break;
case 2: P0=0x4f; //数据管显示3
maichong=3;
break;
case 3: P0=0x66; //数据管显示4
maichong=2; //转速最快
break;
}

}

void start() //电机速度和正反控制处理
{
uchar i,j;
for(i=zhengfan;i<4+zhengfan;i++)
{
P1=table[i];
for(j=0;j<maichong;j++) //延时越小,转速越快,但也不得太小
delay(2);
}
}

void main()
{
while(1)
{
only_key();
deal();
start();
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-07-24
#include <reg52.h> //52芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
sbit K1 = P3^2; //正转
sbit K2 = P3^3; //反转
sbit K3 = P3^4; //停止
sbit BEEP = P3^6; //蜂鸣器

/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}

/**********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}

/**********************************************************/
void beep()
{
uchar i;
for (i=0;i<100;i++)
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}

/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw()
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1*n圈
{
if(K3==0)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P1 = FFW[i]; //取数据
delay(2); //调节转速
}
}
}

/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void motor_rev()
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1×n圈
{
if(K3==0)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P1 = REV[i]; //取数据
delay(2); //调节转速
}
}
}

/********************************************************
*
* 主程序
*
*********************************************************/

main()
{

uchar r,N=64; //N 步进电机运转圈数 因为我们的步进电机是减速步进电机 减速比是1/64 所以这里N=64时 步进电机外部的主轴转1圈
while(1)
{
if(K1==0)
{
beep();
for(r=0;r<N;r++)
{
motor_ffw(); //电机正转
if(K3==0)
{beep();break;} //退出此循环程序
}
}
else if(K2==0)
{
beep();
for(r=0;r<N;r++)
{
motor_rev(); //电机反转
if(K3==0)
{beep();break;} //退出此循环程序
}
}
else
P1 = 0xf0;
}
}

/********************************************************/追问

还需要加速、减速,硬件电路图,谢谢大侠啦

第2个回答  2011-08-03
主要还有电压的转换芯片7805