请教各位大神一下,有关步进电机程序的问题
时间:10-02
整理:3721RD
点击:
请教各位大神,求大神们帮我看看程序,
想用单片机控制步进电机,步进电机有启动器,单片机上电步进电机正转,单片机上连接了一个激光接收器。
当激光照射到激光接收器第一次触发后,(激光为闪烁状态,不是常亮)步进电机停止转动1秒。
当在电机停止的1秒内,激光接收器第二次触发后,电机反转2秒。如果激光接收器没触发,电机正转,重新开始检测。
当在反转的2秒内,激光接收器再次触发,电机继续反转,直到激光接收器没有接收到激光信号不触发时,电机变回正转,再次等待激光接收器触发
小弟程序写到电机可以反转2秒,再往后就不会了,还请大神们指点指点,小弟写的程序如下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned charsbit
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;
}
}
}
想用单片机控制步进电机,步进电机有启动器,单片机上电步进电机正转,单片机上连接了一个激光接收器。
当激光照射到激光接收器第一次触发后,(激光为闪烁状态,不是常亮)步进电机停止转动1秒。
当在电机停止的1秒内,激光接收器第二次触发后,电机反转2秒。如果激光接收器没触发,电机正转,重新开始检测。
当在反转的2秒内,激光接收器再次触发,电机继续反转,直到激光接收器没有接收到激光信号不触发时,电机变回正转,再次等待激光接收器触发
小弟程序写到电机可以反转2秒,再往后就不会了,还请大神们指点指点,小弟写的程序如下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned charsbit
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;
}
}
}