带命令启动功能的二自由度自动进样器(2019.6.26修改完毕)

上位机发出'1'命令, 系统开始工作. 但发出'0'命令后, 系统并未停止工作.

这里我想通过改变IE的值(0x92/0x90), 来控制timer0中断的屏蔽与否, 继而实现系统停止功能.

#include <STC89C5xRC.h>
char tcount = 0;
char step = 0;//记录主电机走过的步数(走过的步数=step/2)
char buf;//存放命令
bit en = 0;//en = 1 -> 系统工作, en = 0 -> 系统停止
void delay()
{
    int i,j;
    for(i = 0; i < 40; i++)
        for(j = 0; j < 40 ; j++)
        {
            ;//为针臂步进电机提供时延
        }
}
void delay2()//针臂在底部停留时延
{
    int i,j;
    for(i=0;i<800;i++)
        for(j=0;j<800;j++)
        {
            ;
        }
}
void motor_Control(char steps)//控制主转盘电机转动指定步数
{
    int i;
    P21 = 0;//主转盘方向
    for(i = 0; i < steps; i++)
    {
        P20 = 0;
        delay();
        P20 = 1;
        delay();
    }
}
void timer0() interrupt 1
{
    TR0 = 0;//关闭定时器0
    TH0 = 0x3c;
    TL0 = 0xB0;//50ms
    tcount++;
    if(tcount == 2)//100ms = 0.1s
    {
        P20 = ~P20;//P20翻转,相当于发送脉冲
        tcount = 0;
        step ++;
        if(step / 2 == 8)//电机走了8步(经历了8次高低电平的转换)
        {
            step = 0;//将步数归零
            //P1.3=1代表向下,P1.3=0代表向上
            P03 = 1;//往下转,P13接单片机P03
            while(P02 == 1)//若未到下限位置,P0.2接单片机P02
            {
                P22 = 0;
                   delay();
                P22 = 1;
                delay();
            }
            delay2();//针臂在底部停留片刻
            P03 = 0;//往上转
            while(P01 == 1)//若未到上限位置,P0.1接单片机P01
            {
                P22 = 0;
                delay();
                P22 = 1;
                delay();
            }
        }
    }//1000ms = 1s 发送一个完整的脉冲
    TR0 = 1;//开启定时器0
}

void UART_Communication() interrupt 4//UART中断
{
    if(RI == 1)//接收到数据
    {
        buf = SBUF;//将接收到的数据获取到buf中
        if(buf == '1')
        {
            //系统启动
            en = 1;
        }
        else if(buf == '0')
        {
            //系统停止
            en = 0;
        }
    }

}

int main()
{
    TMOD = 0x21;
    TH0 = 0x3C;
    TL0 = 0xB0;
    IE = 0x92;
    P20 = 0;//给虚拟接口卡P1.0发脉冲,以驱动主转盘步进电机
    P22 = 0;//给虚拟接口卡P1.2发脉冲,以驱动针臂步进电机
    TR0 = 1;//启动定时器0
    //
    SCON = 0x50;
    TH1 = 0xe6;
    TL1 = 0xe6;
    TR1 = 1;//启动定时器1
    RI = 0;
    while(1)
    {
        //如果en = 1开启timer0的中断, 否则将timer0的中断关闭
        if(en == 1)
        {
            IE = 0x92;
        }
        else if(en == 0)
        {
            IE = 0x90;
        }

    }
}
/*
P1.0:转盘电机Pulse信号
P1.1:转盘电机Dir
P1.2:针臂电机Pulse
P1.3:针臂电机Dir
P0口:输出口,连接虚拟软件中的传感器信号
P0.0:霍尔传感器信号,平时为高电平,有效时为低电平
P0.1:针臂上限位信号
P0.2:针臂下限位信号

*/

在一天的错误分析之后, 问题终于浮出了水面. 原来在串口触发中断处理程序后, 我忘记将RI清零, 所以导致系统无法停止的错误,

#include <STC89C5xRC.h>
char tcount = 0;
char step = 0;//记录主电机走过的步数(走过的步数=step/2)
char buf;//存放命令
bit en = 0;//en = 1 -> 系统工作, en = 0 -> 系统停止
void delay()
{
    int i,j;
    for(i = 0; i < 40; i++)
        for(j = 0; j < 40 ; j++)
        {
            ;//为针臂步进电机提供时延
        }
}
void delay2()//针臂在底部停留时延
{
    int i,j;
    for(i=0;i<800;i++)
        for(j=0;j<800;j++)
        {
            ;
        }
}
void motor_Control(char steps)//控制主转盘电机转动指定步数
{
    int i;
    P21 = 0;//主转盘方向
    for(i = 0; i < steps; i++)
    {
        P20 = 0;
        delay();
        P20 = 1;
        delay();
    }
}
void timer0() interrupt 1
{
    TR0 = 0;//关闭定时器0
    TH0 = 0x3c;
    TL0 = 0xB0;//50ms
    tcount++;
    if(tcount == 2)//100ms = 0.1s
    {
        P20 = ~P20;//P20翻转,相当于发送脉冲
        tcount = 0;
        step ++;
        if(step / 2 == 8)//电机走了8步(经历了8次高低电平的转换)
        {
            step = 0;//将步数归零
            //P1.3=1代表向下,P1.3=0代表向上
            P03 = 1;//往下转,P13接单片机P03
            while(P02 == 1)//若未到下限位置,P0.2接单片机P02
            {
                P22 = 0;
                   delay();
                P22 = 1;
                delay();
            }
            delay2();//针臂在底部停留片刻
            P03 = 0;//往上转
            while(P01 == 1)//若未到上限位置,P0.1接单片机P01
            {
                P22 = 0;
                delay();
                P22 = 1;
                delay();
            }
        }
    }//1000ms = 1s 发送一个完整的脉冲
    TR0 = 1;//开启定时器0
}

void UART_Communication() interrupt 4//UART中断
{
    if(RI == 1)//接收到数据
    {
        RI = 0;//之前未将RI清零
        buf = SBUF;//将接收到的数据获取到buf中
        if(buf == '1')
        {
            //系统启动
            en = 1;
        }
        else if(buf == '0')
        {
            //系统停止
            en = 0;
        }
    }
    else if(TI == 1)//发送完数据
    {
        TI = 0;
    }
}

int main()
{
    TMOD = 0x21;
    TH0 = 0x3C;
    TL0 = 0xB0;
    IE = 0x92;
    P20 = 0;//给虚拟接口卡P1.0发脉冲,以驱动主转盘步进电机
    P22 = 0;//给虚拟接口卡P1.2发脉冲,以驱动针臂步进电机
    TR0 = 1;//启动定时器0
    //
    SCON = 0x50;
    TH1 = 0xe6;
    TL1 = 0xe6;
    TR1 = 1;//启动定时器1
    RI = 0;
    TI = 0;
    while(1)
    {
        //如果en = 1开启timer0的中断, 否则将timer0的中断关闭
        if(en == 1)
        {
            IE = 0x92;
        }
        else if(en == 0)
        {
            IE = 0x90;
        }
    }
}
/*
P1.0:转盘电机Pulse信号
P1.1:转盘电机Dir
P1.2:针臂电机Pulse
P1.3:针臂电机Dir
P0口:输出口,连接虚拟软件中的传感器信号
P0.0:霍尔传感器信号,平时为高电平,有效时为低电平
P0.1:针臂上限位信号
P0.2:针臂下限位信号

*/

猜你喜欢

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