標(biāo)題:
求助STC89C52控制28BYJ-48步進電機
[打印本頁]
作者:
renliang55
時間:
2016-7-25 09:38
標(biāo)題:
求助STC89C52控制28BYJ-48步進電機
我想用4個獨立按鍵控制步進電機實現(xiàn)正傳反轉(zhuǎn),加速減速,但是把程序下載進去電機不轉(zhuǎn),求大神給看看指導(dǎo)一下.
#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}; //反轉(zhuǎn)順序
uchar code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正轉(zhuǎn)順序
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
發(fā)一個我自己修改的切割機程序 用的就是28BYJ48步進電機 長度可調(diào)節(jié) 速度程序內(nèi)調(diào)整
/*************** 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; //正轉(zhuǎn)
sbit K2 = P3^1; //反轉(zhuǎn)
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); //正轉(zhuǎn)速度調(diào)整
}
}
}
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); //反轉(zhuǎn)速度調(diào)整
}
}
}
void delayB(uchar x)
{
uint k;
while(x--)
{
for(k=0; k<10000; k++)
{ }
}
}
void beep()
{
BEEP=0;
delayB(20); //切刀電磁閥時間設(shè)定
BEEP=1; //關(guān)閉切刀電磁閥
}
void main()
{
uchar N =1; //默認圈數(shù)
while(1)
{
if(K1 == 0)
{ DelayMS(125);
if(K1==0) {
P0 = 0xfe; //P0.0正轉(zhuǎn)指示
SETP_MOTOR_FFW(N);
if(K3 == 0) break;
}
delayB(5);//轉(zhuǎn)動停止間隔時間
beep();
}
else if(K2 == 0)
{ DelayMS(125);
if(K2==0){
P0 = 0xfd; //P0.1反轉(zhuǎn)指示
SETP_MOTOR_REV(N);
if(K3 == 0) break;
}
delayB(5);//轉(zhuǎn)動停止間隔時間
beep();
}
else if(K4==0)//步數(shù)加一按鍵按下
{ DelayMS(125);
if(K4==0)
while(K4==0);
N=N+1;//步數(shù)加一
if(N>50)//如果步數(shù)大于10
{
N=50;//步數(shù)最大設(shè)置到10
}
}
else if(K5==0)//步數(shù)減一按鍵按下
{ DelayMS(125);
if(K5==0)
while(K5==0);
N=N-1;//步數(shù)減一
if(N<1)//如果步數(shù)小于1
{
N=1;//步數(shù)設(shè)置最少1
}
}
else
{
P1 = 0x00;
P0= 0xfb; //P0.2停止指示
}
}
}
作者:
cyy998
時間:
2016-7-28 20:01
定時器0函數(shù)應(yīng)該是interrupt 1吧。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1