标题:
求助STC89C52控制28BYJ-48步进电机
[打印本页]
作者:
renliang55
时间:
2016-7-25 09:38
标题:
求助STC89C52控制28BYJ-48步进电机
我想用4个独立按键控制步进电机实现正传反转,加速减速,但是把程序下载进去电机不转,求大神给看看指导一下.
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define GPIO_MOTOR P1
sbit key1 = P3^0;
sbit key2 = P3^1;
sbit key3 = P3^2;
sbit key4 = P3^3;
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反转顺序
uchar code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正转顺序
uchar keyvalue;
uint g,d;
void delay(uchar z);
void main()
{
uint i=0;
TMOD = 0x01;
TH0 = 0xba;
TL0 = 0xc3;
ET0 = 1;
EA = 1;
TR0 = 1;
while(1)
{
if(key1==0)
{
delay(10);
if(key1==0)
{
keyvalue=1;
g=0xba;
d=0xc3;
}
while((i>200)&&(key1==0))
{
delay(1);
i++;
}
i=0;
}
if(key2==0)
{
delay(10);
if(key2==0)
{
keyvalue=2;
g=0xba;
d=0xc3;
}
while((i>200)&&(key2==0))
{
delay(1);
i++;
}
i=0;
}
if(key3==0)
{
delay(1);
if(key3==0)
{
g = 0xf9;
d = 0x75;
}
while((i<200)&&(key3==0))
{
delay(1);
i++;
}
i=0;
}
if(key4==0)
{
delay(1);
if(key4==0)
{
g = 0x9d;
d = 0xdb;
}
while((i<200)&&(key4==0))
{
delay(1) ;
i++;
}
i=0;
}
}
}
void timer() interrupt 0
{
uint i=0,j;
uchar SJB[8];
TH0 = g;
TL0 = d;
if(keyvalue==1)
{
for(j=0;j<8;j++)
{
SJB[j]=FFZ[j];
}
}
if(keyvalue==2)
{
for(j=0;j<8;j++)
{
SJB[j] = FFW[j];
}
}
GPIO_MOTOR = SJB[i]&0x1f;
i++;
if(i==7)
{
i=0;
}
}
void delay(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
作者:
DIY电子
时间:
2016-7-27 09:11
发一个我自己修改的切割机程序 用的就是28BYJ48步进电机 长度可调节 速度程序内调整
/*************** writer:shopping.w ******************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code FFW[]=
{
0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09
};
uchar code REV[]=
{
0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01
};
sbit K1 = P3^0; //正转
sbit K2 = P3^1; //反转
sbit K3 = P3^2; //停止
sbit K4 = P3^5; //增加N
sbit K5 = P3^4; //减少N
sbit BEEP = P1^7;//切刀电磁阀
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void SETP_MOTOR_FFW(uchar n)
{
uchar i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(K3 == 0) break;
P1 = FFW[j];
DelayMS(25); //正转速度调整
}
}
}
void SETP_MOTOR_REV(uchar n)
{
uchar i,j;
for(i=0;i<5*n;i++) //
{
for(j=0;j<8;j++)
{
if(K3 == 0) break;
P1 = REV[j];
DelayMS(25); //反转速度调整
}
}
}
void delayB(uchar x)
{
uint k;
while(x--)
{
for(k=0; k<10000; k++)
{ }
}
}
void beep()
{
BEEP=0;
delayB(20); //切刀电磁阀时间设定
BEEP=1; //关闭切刀电磁阀
}
void main()
{
uchar N =1; //默认圈数
while(1)
{
if(K1 == 0)
{ DelayMS(125);
if(K1==0) {
P0 = 0xfe; //P0.0正转指示
SETP_MOTOR_FFW(N);
if(K3 == 0) break;
}
delayB(5);//转动停止间隔时间
beep();
}
else if(K2 == 0)
{ DelayMS(125);
if(K2==0){
P0 = 0xfd; //P0.1反转指示
SETP_MOTOR_REV(N);
if(K3 == 0) break;
}
delayB(5);//转动停止间隔时间
beep();
}
else if(K4==0)//步数加一按键按下
{ DelayMS(125);
if(K4==0)
while(K4==0);
N=N+1;//步数加一
if(N>50)//如果步数大于10
{
N=50;//步数最大设置到10
}
}
else if(K5==0)//步数减一按键按下
{ DelayMS(125);
if(K5==0)
while(K5==0);
N=N-1;//步数减一
if(N<1)//如果步数小于1
{
N=1;//步数设置最少1
}
}
else
{
P1 = 0x00;
P0= 0xfb; //P0.2停止指示
}
}
}
作者:
cyy998
时间:
2016-7-28 20:01
定时器0函数应该是interrupt 1吧。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1