请教各位大神,有关步进电机程序
时间:10-02
整理:3721RD
点击:
请教各位大神,小弟初学,还望各位大神指教!
想用51单片机控制步进电机,步进电机有驱动器。单片机上连接了一个激光接收器,单片机上电后步进电机正转。
当激光照射到激光接收器,(激光为闪烁状态,不是常亮)接收器第一次触发,步进电机停止转动1秒。
当在电机停止的1秒时间内,激光接收器第二次被触发,电机反转2秒。如果1秒后激光接收器没有触发,电机正转,重新检测
当电机在反转的2秒时间内,激光接收器再次被触发,电机继续反转,直到激光接收器没有再被触发,电机开始正转,重新开始检测
小弟程序写到能反转了,再往后就不会了,实在想不出,特来请教各位大神指点指点。小弟写的程序如下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit zhuan=P1^2;
sbit fangxiang=P1^3;
sbit jieshou=P2^2; //激光接收器
uchar flag1,flag2,flag3,flag4,t0,jsnum1;
uint k;
void yanshi(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=200;y>0;y--);
}
void qianjin() //步进电机正转
{
fangxiang=0;
zhuan=1;
yanshi(1);
zhuan=0;
yanshi(1);
}
void houtui() //步进电机反转
{
fangxiang=1;
zhuan=0;
yanshi(1);
zhuan=1;
yanshi(1);}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
jsnum1=0; //激光接收次数
flag1=0; //步进电机1标志位
while(1)
{
if(flag1==0)
{
jsnum1=0;
qianjin();
}
if(jieshou==0) //激光接收器第一次触发
{
jsnum1++;
flag1=1;
TR0=1;
flag2=1;
while(!jieshou);
}
}
}
void dingshi() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(flag2==1)
{ flag1=1;
if(t0==20)
{
t0=0;
if(jieshou==0) //激光接收器第二次触发
{
jsnum1++;
while(!jieshou);
}
else //没有触发重新开始
TR0=0;
flag1=0;
if(jsnum1==2) //电机开始反转
{
uint i;
for(i=5000;i>0;i--)
houtui();
jsnum1=0;
}
flag1=0
}
}
}
想用51单片机控制步进电机,步进电机有驱动器。单片机上连接了一个激光接收器,单片机上电后步进电机正转。
当激光照射到激光接收器,(激光为闪烁状态,不是常亮)接收器第一次触发,步进电机停止转动1秒。
当在电机停止的1秒时间内,激光接收器第二次被触发,电机反转2秒。如果1秒后激光接收器没有触发,电机正转,重新检测
当电机在反转的2秒时间内,激光接收器再次被触发,电机继续反转,直到激光接收器没有再被触发,电机开始正转,重新开始检测
小弟程序写到能反转了,再往后就不会了,实在想不出,特来请教各位大神指点指点。小弟写的程序如下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit zhuan=P1^2;
sbit fangxiang=P1^3;
sbit jieshou=P2^2; //激光接收器
uchar flag1,flag2,flag3,flag4,t0,jsnum1;
uint k;
void yanshi(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=200;y>0;y--);
}
void qianjin() //步进电机正转
{
fangxiang=0;
zhuan=1;
yanshi(1);
zhuan=0;
yanshi(1);
}
void houtui() //步进电机反转
{
fangxiang=1;
zhuan=0;
yanshi(1);
zhuan=1;
yanshi(1);}
void main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
jsnum1=0; //激光接收次数
flag1=0; //步进电机1标志位
while(1)
{
if(flag1==0)
{
jsnum1=0;
qianjin();
}
if(jieshou==0) //激光接收器第一次触发
{
jsnum1++;
flag1=1;
TR0=1;
flag2=1;
while(!jieshou);
}
}
}
void dingshi() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(flag2==1)
{ flag1=1;
if(t0==20)
{
t0=0;
if(jieshou==0) //激光接收器第二次触发
{
jsnum1++;
while(!jieshou);
}
else //没有触发重新开始
TR0=0;
flag1=0;
if(jsnum1==2) //电机开始反转
{
uint i;
for(i=5000;i>0;i--)
houtui();
jsnum1=0;
}
flag1=0
}
}
}