以串口中断为主线的二自由度自动进样器控制(有一定问题)(程序架构不可取, 只供研究)

我的本意是当输入"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

*/
 

猜你喜欢

转载自blog.csdn.net/weixin_42048463/article/details/93655916