我的本意是当输入"Start.E"后系统开启工作, 此时输入"Stop.E"后系统停止工作. 可实际上系统无法停止工作. 对于这其中的原因, 我也做了一定量的实验, 分析得出, 问题出在变量en上, 但是我还没找到方法去解决它. 还请各位大牛帮忙解决, 万分感谢.
#include <STC89C5xRC.H>
char buf[30];//存放串口传来的数据
int steps_A = 0;//记录串口传来要求主电机走的步数
int steps_B = 0;//记录主电机走过的步数(走过的步数=step_B/2)
bit en = 0;//记录系统的工作状态,若为0,则系统停止工作
int i = 0;
void delay()//为针臂步进电机提供时延
{
int i, j;
for(i = 0; i < 25; i++)
for(j = 0; j < 40 ; j++)
{
;
}
}
void delay2()//针臂在底部停留时延
{
int i, j;
for(i = 0;i < 800; i++)
for(j = 0;j < 900; j++)
{
;
}
}
void delay3()//为主步进电机的转动提供时延
{
int i, j;
for(i = 0; i < 130; i++)
for(j = 0; j < 300; j++)
{
;
}
}
void motor_Control(char steps)//控制主转盘电机转动指定步数
{
int i;
P21 = 0;//主转盘方向
for(i = 0; i < steps; i++)
{
P20 = 0;
delay();
P20 = 1;
delay();
}
}
void UART_INT() interrupt 4//串行通信中断处理程序
{
int len = 0;
if(RI == 1)//如果收到数据
{
if(i == 30)
{
i = 0;//防止越界访问
}
RI = 0;
buf[i++] = SBUF;//将数据接收下来
if(buf[i - 1] == 'E')//到达结尾
{
len = i - 1;//记录数据长度
i = 0;
if(len == 6)
{
if(buf[0] == 'S' && buf[1] == 't' && buf[2] == 'a' && buf[3] == 'r' && buf[4] == 't' && buf[5] == '.')
{
//Start命令(开机)
P20 = 0;
en = 1;//系统开始工作
while(1)
{
while(en == 0);//当处于停机状态时,在此等候
delay3();
P20 = ~P20;
steps_B ++;
if(steps_B / 2 == 8)
{
steps_B =0;//将步数归零
P03 = 1;//针臂电机往下转
while(P02 == 1)//若未到下限位置
{
P22 = 0;
delay();
P22 = 1;
delay();
}
delay2();//针臂在底部停留片刻
P03 = 0;//针臂电机往上转
while(P01 == 1)//若未到上限位置
{
P22 = 0;
delay();
P22 = 1;
delay();
}
}
}
}
else if(buf[0] == 'R' && buf[1] == 'e' && buf[2] == 's' && buf[3] == 'e' && buf[4] == 't' && buf[5] == '.')//主转盘回到原始位置,针臂抬到最高位置
{
//Reset命令(复位命令)
//先抬针臂
while(P01 == 1)//若未到上限位置,P0.1接单片机P01
{
P22 = 0;
delay();
P22 = 1;
delay();
}
//走出循环后便意味着针臂已到达上限位置
//接下来转盘复位至0号瓶
P21 = 0;//主转盘方向
P20 = 0;
while(P00 == 1)//未转到0号瓶时就一直转
{
delay();
P20 = ~P20;
}
//走出循环后便意味着主转盘以到达0号瓶位置
en = 0;//重置后处于停机状态
}
}
else if(len == 5)//停机命令
{
if(buf[0] == 'S' && buf[1] == 't' && buf[2] == 'o' && buf[3] == 'p' && buf[4] == '.')
{
//Stop命令(停机命令)
en = 0;
}
}
else if(len == 18)//要求主转盘转动相应格数
{
if(buf[0] == 'M' && buf[1] == 'a' && buf[2] == 'i' && buf[3] == 'n' && buf[4] == ' ' && buf[5] == 'm' && buf[6] == 'o' && buf[7] == 't' && buf[8] == 'o' && buf[9] == 'r' && buf[10] == ' ' && buf[11] == 'r' && buf[12] == 'u' && buf[13] == 'n' && buf[14] == ' ')
{
//Main motor run命令,比如Main motor run 22.
if(buf[15] >= '1' && buf[15] <= '9' && buf[16] >= '1' && buf[16] <= '9')//确定发来的步数是数字
{
steps_A = (buf[15] - 48) * 10 + (buf[16] - 48);//记录步数
motor_Control(8 * steps_A);//步进电机每8步走一格
en = 0;//系统处于停机状态
}
}
}
}
}
}
int main()
{
RI = 0;
TI = 0;
TMOD = 0x21;
SCON = 0x50;
TH1 = 0xe6;
TL1 = 0xe6;
TR1 = 1;
IE = 0x90;
while(1)
{
;//采用前后台系统架构实现二自由度自动进样器的控制
}
}
/*
P1.0:转盘电机Pulse信号 -> P20
P1.1:转盘电机Dir -> P21(还未连接)
P1.2:针臂电机Pulse -> P22
P1.3:针臂电机Dir -> P03
P0.1:针臂上限位信号 -> P01
P0.2:针臂下限位信号 -> P02
*/