51单片机控制步进电机正反转

用51单片机控制步进电机,在程序中把正转角度定好,然后通过串口输入正转结束后等待的时间,等待时间结束后再反转回原来的位置。。。。
我程序下载后发现步进电机正反转2次。。。。看了半天也没发现哪里出了问题
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void TrunMotor1(unsigned long angle);
void TrunMotor2(unsigned long angle1);
uint aa;
static unsigned char index = 0;
static uint bb=0;
void yanshi(uchar z)
{
uint cc,dd;
for(cc=z;cc>0;cc--)
for(dd=115;dd>0;dd--);
}

void chuankou()
{
TMOD=0x20;
TH1=0XFD;
TL1=0XFD;
EA=1;
TR1=1;
ET1=1;
SM0=0;
SM1=1;
REN=1;
}

//void tonxun() interrupt 4
//{
// aa=SBUF;
// bb=1;
// RI=0;
//}

void main()
{
chuankou();
while(1)
{
if(RI==1)
{
RI=0;
bb=SBUF;
TrunMotor1(1);
yanshi(bb);
TrunMotor2(1);
// ES=1;
}
}

//
//while(1);
}

void delay()
{
unsigned int i = 200;
while(i--);
}

void TrunMotor1(unsigned long angle)
{
unsigned char tmp;

unsigned long beats = 0;
unsigned char code BeatCode[8] = {
0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06};

beats = (angle*4096)/360;
while(beats--)
{
tmp = P1;
tmp = tmp & 0xF0;
tmp = tmp | BeatCode[index];
P1 = tmp;
index++;
index = index & 0x07;
delay();
}
}

void TrunMotor2(unsigned long angle1)
{
unsigned char tmp1;
// unsigned char index1 = 0;
unsigned long beats1 = 0;
unsigned char code BeatCode[8] = {
0x0E, 0x0C, 0x0D, 0x09, 0x0B, 0x03, 0x07, 0x06};

beats1 = (angle1*4096)/360;
while(beats1--)
{
tmp1 = P1;
tmp1 = tmp1 & 0xF0;
tmp1 = tmp1 | BeatCode[index-1];
P1 = tmp1;
index--;
if(index==0)
{
index=8;
}
delay();
}
}

第1个回答  2018-02-12
主循环里那个bb你在哪里定义过?
第2个回答  2018-01-29
看不清楚你现在想要解决的问题是什么吗?追问

我写的程序是步进电机先正转,然后等待一定时间,再反转,而等待的时间是通过uart发送的,但是实际中我发送等待时间后,步进电机会正转然后马上反转,然后再正反转一次

第3个回答  2018-02-03
这个问题好像遇到过,其实是不够了解单片机的原因。
相似回答