二自由度自动进样检测器控制(Version 1.1)

发布者:Serendipity22最新更新时间:2021-08-11 来源: eefocus关键字:二自由度  8051单片机 手机看文章 扫描二维码
随时随地手机看文章

较Version 1.0, 增加了对针臂步进电机、针臂停留底部时间的控制模块, 可通过给定参数以定量方式控制针臂抬起落下的速度或控制针臂在底部停留的时间.


硬件搭建:


8051单片机(STC89C52RC) + 若干杜邦线 + 虚拟接口卡 + 虚拟接口卡专用USB线 + 8051专用USB线.


连线对接:


P1.0 -> P20


P1.1 -> P21


P1.2 -> P22


P1.3 -> P03


P0.0 -> P00


P0.1 -> P01


P0.2 -> P02


注: 左侧为虚拟接口卡接口, 右侧为STC89C52RC接口.

在此补充一下驱动系统的命令:


1. Start.E命令: 启动系统.


2. Stop.E命令: 在一个周期序列动作完成后, 停止系统.


3. Rotate 0/1.E命令: 命令主转盘以顺时针/逆时针方向转动.


4. Main motor runs X(0 ~ 9).E命令:  在一个周期序列动作完成后, 停止系统, 以给定参数决定的速度, 转动X步主转盘.(这里借用针臂步进电机的时延函数来驱动主步进电机).


5. Main motor runs XX(10 ~ 99).E命令: 和4功能一致, 在给定的步数为两位数时使用.


6. Reset.E: 命令: 系统未进入到Start命令模式下且针臂未在该模式下进入到上下移位过程中, 针臂抬至上限位, 主转盘转至0号瓶位置, 之后停止工作.


7. Arm speeds XX, XX.E命令: 命令针臂以XX XX决定的参数上下移动.


8. Arm delays XXX, XXX.E命令: 命令针臂在底部停留的时间.


#include

char tcount = 0;

char step = 0;//记录主电机走过的步数(走过的步数=step/2)

char buf[30];//存放命令

int en = 0;//en = 1 -> 系统工作, en = 0 -> 系统停止

int k = 0;

int len = 0;

int re = 0;//复位信号, 1 -> 复位, 0 -> 不复位

int direction = 0;//0 -> 顺时针, 1 -> 逆时针

int step_B = 0;//命令要求主电机转的步数

int motorRun = 0;// 1 -> 按命令转相应步数, 0 -> 无动作

int S1 = 300;//针臂在底部停留时间参数1

int S2 = 400;//针臂在底部停留时间参数2

int A1 = 40;//针臂电机参数1

int A2 = 40; //针臂电机参数2


void delay(int A1, int A2)

{

    int i,j;

    for(i = 0; i < A1; i++)

        for(j = 0; j < A2 ; j++)

        {

            ;//为针臂步进电机提供时延

        }

}

void delay2(int S1, int S2)//针臂在底部停留时延

{

    int i,j;

    for(i=0;i        for(j=0;j        {

            ;

        }

}

void motor_Control(int steps)//控制主转盘电机转动指定步数

{

    int i;

    for(i = 0; i < steps; i++)

    {

        P20 = 0;

        delay(A1, A2);

        P20 = 1;

        delay(A1, A2);

    }

}

void timer0() interrupt 1

{

    int i = 0;

    if(step == 0)

    {

        if(direction == 0)

        {

            P21 = 0;//顺时针

        }

        else if(direction == 1)

        {

            P21 = 1;//逆时针

        }

    }

    TR0 = 0;//关闭定时器0

    TH0 = 0x3c;

    TL0 = 0xB0;//50ms

    if(re == 1)//复位信号起作用

    {

        re = 0;

        //针臂移至上限位, 转盘转回0号瓶

        P03 = 0;//往上转

        while(P01 == 1)//若未到上限位置,P0.1接单片机P01

        {

            P22 = 0;

            delay(A1, A2);

            P22 = 1;    

            delay(A1, A2);

        }

        while(P00 == 1)//若未到0号瓶位置

        {

            P20 = 0;

            delay(A1, A2);

            P20 = 1;

            delay(A1, A2);

        }

        //霍尔传感器有误差, 还差2.5格左右, 再发20个脉冲

        if(P21 == 1)//转盘逆时针转过来

        {

            while(i++ < 20)

            {

                P20 = 0;

                delay(A1, A2);

                P20 = 1;

                delay(A1, A2);

            }

        }

        else if(P21 == 0)//转盘顺时针转过来

        {

            while(i++ < 22)

            {

                P20 = 0;

                delay(A1, A2);

                P20 = 1;

                delay(A1, A2);

            }    

        }

        tcount = 0;

        en = 0;

        step = 0;

        goto END;

    }

    if(motorRun == 1)//电机按要求转命令起作用

    {

        motorRun = 0;

        step = 0;

        tcount = 0;

        en  = 0;

        motor_Control(step_B);

        step_B = 0;

        goto END;

    }

    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(A1, A2);

                P22 = 1;

                delay(A1 ,A2);

            }

            delay2(S1, S2);//针臂在底部停留片刻

            P03 = 0;//往上转

            while(P01 == 1)//若未到上限位置,P0.1接单片机P01

            {

                P22 = 0;

                delay(A1, A2);

                P22 = 1;

                delay(A1, A2);

            }

        }

    }//1000ms = 1s 发送一个完整的脉冲

END: ;

    TR0 = 1;//开启定时器0

}


void UART_INT() interrupt 4//串行通信中断处理程序

{

    int len = 0;

    int j = 0;

    if(RI == 1)//如果收到数据

    {

        if(k == 30)

        {

            k = 0;//防止越界访问

        }

        RI = 0;

        buf[k++] = SBUF;//将数据接收下来

        if(buf[k - 1] == 'E')//到达结尾

        {

            len = k - 1;//记录数据长度

            k = 0;

            if(len == 6)

            {

                if(buf[0] == 'S' && buf[1] == 't' && buf[2] == 'a' && buf[3] == 'r' && buf[4] == 't' && buf[5] == '.')

                {

                    //Start命令(开机)

                    en = 1;

                    P27 = 0;//D8亮

                    P26 = 1;

                    P25 = 1;

                    P24 = 1;

                    //再将en的值传回去

                    SBUF = en + 48;

                }

                else if(buf[0] == 'R' && buf[1] == 'e' && buf[2] == 's' && buf[3] == 'e' && buf[4] == 't' && buf[5] == '.')//主转盘回到原始位置,针臂抬到最高位置

                {

                    //Reset命令(复位命令)

                    en = 1;

                    P27 = 1;

                    P26 = 0;//D7亮

                    P25 = 1;

                    P24 = 1;

                    SBUF = en + 48;

                    re = 1;//复位信号

                }

            }

            else if(len == 5)//停机命令

            {

                if(buf[0] == 'S' && buf[1] == 't' && buf[2] == 'o' && buf[3] == 'p' && buf[4] == '.')

                {

                    //Stop命令(停机命令)

                    en = 0;

                    P27 = 1;

                    P26 = 1;

[1] [2] [3]
关键字:二自由度  8051单片机 引用地址:二自由度自动进样检测器控制(Version 1.1)

上一篇:8051单片机串行通信参数设置(8位UART+timer1 8位自动重装)
下一篇:8051单片机(STC89C52)八灯从中间往两边亮

推荐阅读最新更新时间:2024-11-20 10:42

8051单片机快速入门--我的第一盏灯
学习单片机之前呢,给大家推荐一本单片机学习的书籍《爱上单片机》,内容结构浅显易懂,实践性很强,非常容易上手,好了,废话不多说,直接上干活,带你快速入门单片机; 一、位定义原理 定义方法:sbit 位名=特殊功能寄存器^位置; sbit LED1 = P2^0; 符号 ^ 前面是特殊功能寄存器的名字,后面的数字定义的可寻址位在特殊功能寄存器中的位置,取值必须是0~7 P2是连接LED的IO口,P2^0到7分别对应LED1到8 二、代码实现 #includ reg51.h //以AT8951单片机为例 //对八个LED分别进行位定义 sbit LED1 = P2^0; sbit LED2 = P2^1; void main() {
[单片机]
<font color='red'>8051单片机</font>快速入门--我的第一盏灯
基于C8051单片机的血糖监测仪解决方案
  血糖测量的电生物化学原理是当施加一定电压于经酶反应后的血液产生的电流会随着血液中的血糖浓度的增加而增加。通过精确测量出这些微弱电流,并根据电流值和血糖浓度的关系,反算出相应的浓度。所以,确定这个关系是问题的核心。但其关系复杂,受多方面因素影响。电压强度、所使用的试条以及检测的血液量都会对其产生影响。理论上需要在所有浓度点上大量实验才能确定最终的关系。在实际操作中,只需在选择若干重要浓度点做大量实验,然后采用曲线拟合或插值等数据处理方式来确定其与电流值之间的关系。   血糖测量通常采用电化学分析中的三电极体系。三电极体系是相对于传统的两电极体系而言,包括,工作电极(WE),参比电极(RE)和对电极(CE)。参比电极用来定点位
[单片机]
基于C<font color='red'>8051单片机</font>的血糖监测仪解决方案
8051单片机(STC89C52)倒计时器
#include STC89C5xRC.H void delay()//用定时器0实现10ms精准定时 { TMOD = 0x01; TH0 = 0xd8; TL0 = 0xf0;//65536 - 10000 = 55536 TF0 = 0;//置溢出标志位为0 TR0 = 1;//开启定时器0 while(TF0 == 0); TR0 = 0;//暂停定时器0 } void disp_digit(int d) { unsigned char code DIG_CODE = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x
[单片机]
<font color='red'>8051单片机</font>(STC89C52)倒计时器
8051单片机教程第三课:几个基本概念
数的本质和物理现象。 我们知道,计算机可以进行数学运算,这可令我们非常的难以理解,计算机吗,我们虽不了解它的组成,但它总只是一些电子元器件,怎么可以进行数学运算呢?我们做数学题如37+45是这样做的,先在纸上写37,然后在下面写45,然后大脑运算,最后写出结果,运算的原材料:37、45和结果:82都是写在纸上的,计算机中又是放在什么地方呢?为了解决这个问题,先让我们做一个实验:这里有一盏灯,我们知道灯要么亮,要么不亮,就有两种状态,我们可以用’0’和’1’来代替这两种状态,规定亮为’1’,不亮为’0’。现在放上两盏灯,一共有几种状态呢?我们列表来看一下: 请大家自已写上3盏灯的情况000001010011100101110
[单片机]
<font color='red'>8051单片机</font>教程第三课:几个基本概念
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多开源项目推荐
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved