51单片机驱动步进电机程序问题
时间:10-02
整理:3721RD
点击:
程序如下通过共阳接法接俩个驱动器分别驱动步进电机
![](../imgqa/ele/mcu/mcu-3721rd.com-35689llzre1wys5m.jpg)
![](../imgqa/ele/mcu/mcu-3721rd.com-35690moj2eg3louv.jpg)
![](../imgqa/ele/mcu/mcu-3721rd.com-35691ry5urizbx4d.jpg)
通过这俩个驱动板驱动步进实现后面的时序,不知道哪里不对了,请大师指点~
#include<reg52.h>#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CP1=P1^0;
sbit EN1=P1^1;
sbit DR1=P1^2;
sbit CP2=P1^3;
sbit EN2=P1^4;
sbit DR2=P1^5;
sbit run=P1^6;
sbit stop=P1^7;
sbit shoudong=P2^0;
uint a=0;
uchar cishu=0;
uint t=0;
uint t1=0;
uchar flag=0;
uchar x=0;
uchar y=0;
void delay_10ms(void)
{
unsigned char a,b,c;
for(c=5;c>0;c--)
for(b=4;b>0;b--)
for(a=248;a>0;a--);
}
void delay_3s(void)
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=96;b>0;b--)
for(a=60;a>0;a--);
_nop_();
}
void init_I0()
{
CP1=0;
EN1=0;
DR1=1;
CP2=0;
EN2=0;
DR2=0;
run=1;
stop=1;
shoudong=1;
TMOD=0x11;
TH0=0x0ff;
TL0=0x9c;
EA=1;
ET0=1;
TR0=0;
TH1=0xff;
TL1=0x9c;
//EA = 1;
ET1 = 1;
TR1 = 0;
}
void dianjiyunxin()
{
if(t==18000&&flag==0&&cishu<10)
{
EN1=0;
DR1=0;
EN2=1;
delay_3s();
EN2=0;
TR0=0;
EN1=1;
flag=1;
t=0;
cishu++;//cishu=1
}
if(t==18000&&flag==1&&cishu<10)
{
EN1=0;
DR1=1;
EN2=1;
delay_3s();
EN2=0;
TR0=0;
EN1=1;
flag=0;
t=0;//
cishu++; //cishu=2
}
if(cishu==10)
{
cishu=10;
}
if(t==18000&&flag==0&&cishu==10)
{
EN1=0;
DR1=0;
delay_3s();
EN1=1;
flag=1;
t=0;
}
if(t==18000&&flag==1&&cishu==10)
{
EN1=0;
DR1=1;
delay_3s();
EN1=1;
flag=0;
t=0;
}
}
void main()
{
init_I0();
//InitTimer0();
//InitTimer1();
while(1)
{
if(shoudong==0)
{
delay_10ms();
if(shoudong==0)
{
for(cishu;cishu>0;cishu--)
{
TR0=1;
EN2=1;
DR2=1;
delay_3s();
}
EN2=0;
while(a)
{
TR1=1;
EN1=1;
DR1=0;
}
EN1=0;
DR1=1;
}
EN2=0;
DR2=0;
TR0=0;
TR1=0;
a=0;
t=0;
flag=0;
CP1=0;
CP2=0;
}
if(run==0)
{
delay_10ms();
if(run==0)
{
while(stop)
{
TR0=1;
EN1=1;
dianjiyunxin();
}
}
}
if(stop==0)
{
delay_10ms();
if(stop==0)
{
if(DR1==1)
a=t;
if(DR1==0)
a=(18000-t);
// TR0=1;
// while(!stop)
// {
// EN1=;
// }
EN1=0;
//DR1=;
}
EN2=0;
DR2=0;
TR0=0;
CP1=0;
CP2=0;
}
}
}
void Timer0() interrupt 1 using 1 // 定时器中断
{
TH0 = 0x0ff;
TL0 = 0x9c;
t1++;
x++;
y++;
if(y==10)//提供2电机的脉冲
{
CP2=~CP2;
y=0;
}
if(x==5) //提供1电机的脉冲
{
CP1=~CP1;
x=0;
}
if(t1==10)
{
t++;
t1=0;
}
}
void Timer1() interrupt 3 using 2 // 定时器中断
{
TH1 = 0x0ff;
TL1 = 0x9c;
t1++;
x++;
y++;
if(y==10)//提供2电机的脉冲
{
CP2=~CP2;
y=0;
}
if(x==5) //提供1电机的脉冲
{
CP1=~CP1;
x=0;
}
if(t1==10)
{
a--;
t1=0;
} }
![](../imgqa/ele/mcu/mcu-3721rd.com-35689llzre1wys5m.jpg)
![](../imgqa/ele/mcu/mcu-3721rd.com-35690moj2eg3louv.jpg)
![](../imgqa/ele/mcu/mcu-3721rd.com-35691ry5urizbx4d.jpg)
通过这俩个驱动板驱动步进实现后面的时序,不知道哪里不对了,请大师指点~
#include<reg52.h>#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CP1=P1^0;
sbit EN1=P1^1;
sbit DR1=P1^2;
sbit CP2=P1^3;
sbit EN2=P1^4;
sbit DR2=P1^5;
sbit run=P1^6;
sbit stop=P1^7;
sbit shoudong=P2^0;
uint a=0;
uchar cishu=0;
uint t=0;
uint t1=0;
uchar flag=0;
uchar x=0;
uchar y=0;
void delay_10ms(void)
{
unsigned char a,b,c;
for(c=5;c>0;c--)
for(b=4;b>0;b--)
for(a=248;a>0;a--);
}
void delay_3s(void)
{
unsigned char a,b,c;
for(c=254;c>0;c--)
for(b=96;b>0;b--)
for(a=60;a>0;a--);
_nop_();
}
void init_I0()
{
CP1=0;
EN1=0;
DR1=1;
CP2=0;
EN2=0;
DR2=0;
run=1;
stop=1;
shoudong=1;
TMOD=0x11;
TH0=0x0ff;
TL0=0x9c;
EA=1;
ET0=1;
TR0=0;
TH1=0xff;
TL1=0x9c;
//EA = 1;
ET1 = 1;
TR1 = 0;
}
void dianjiyunxin()
{
if(t==18000&&flag==0&&cishu<10)
{
EN1=0;
DR1=0;
EN2=1;
delay_3s();
EN2=0;
TR0=0;
EN1=1;
flag=1;
t=0;
cishu++;//cishu=1
}
if(t==18000&&flag==1&&cishu<10)
{
EN1=0;
DR1=1;
EN2=1;
delay_3s();
EN2=0;
TR0=0;
EN1=1;
flag=0;
t=0;//
cishu++; //cishu=2
}
if(cishu==10)
{
cishu=10;
}
if(t==18000&&flag==0&&cishu==10)
{
EN1=0;
DR1=0;
delay_3s();
EN1=1;
flag=1;
t=0;
}
if(t==18000&&flag==1&&cishu==10)
{
EN1=0;
DR1=1;
delay_3s();
EN1=1;
flag=0;
t=0;
}
}
void main()
{
init_I0();
//InitTimer0();
//InitTimer1();
while(1)
{
if(shoudong==0)
{
delay_10ms();
if(shoudong==0)
{
for(cishu;cishu>0;cishu--)
{
TR0=1;
EN2=1;
DR2=1;
delay_3s();
}
EN2=0;
while(a)
{
TR1=1;
EN1=1;
DR1=0;
}
EN1=0;
DR1=1;
}
EN2=0;
DR2=0;
TR0=0;
TR1=0;
a=0;
t=0;
flag=0;
CP1=0;
CP2=0;
}
if(run==0)
{
delay_10ms();
if(run==0)
{
while(stop)
{
TR0=1;
EN1=1;
dianjiyunxin();
}
}
}
if(stop==0)
{
delay_10ms();
if(stop==0)
{
if(DR1==1)
a=t;
if(DR1==0)
a=(18000-t);
// TR0=1;
// while(!stop)
// {
// EN1=;
// }
EN1=0;
//DR1=;
}
EN2=0;
DR2=0;
TR0=0;
CP1=0;
CP2=0;
}
}
}
void Timer0() interrupt 1 using 1 // 定时器中断
{
TH0 = 0x0ff;
TL0 = 0x9c;
t1++;
x++;
y++;
if(y==10)//提供2电机的脉冲
{
CP2=~CP2;
y=0;
}
if(x==5) //提供1电机的脉冲
{
CP1=~CP1;
x=0;
}
if(t1==10)
{
t++;
t1=0;
}
}
void Timer1() interrupt 3 using 2 // 定时器中断
{
TH1 = 0x0ff;
TL1 = 0x9c;
t1++;
x++;
y++;
if(y==10)//提供2电机的脉冲
{
CP2=~CP2;
y=0;
}
if(x==5) //提供1电机的脉冲
{
CP1=~CP1;
x=0;
}
if(t1==10)
{
a--;
t1=0;
} }
为什么延时3秒呀,这么长时间里,不知道中断了多少次了。不知道你要表达的是什么问题?