历史上的今天
返回首页

历史上的今天

今天是:2025年08月09日(星期六)

2021年08月09日 | 带复杂命令启停功能的二自由度自动进样器

2021-08-09 来源:eefocus

给8051发送"Start.E"后, 系统开始工作; 发送"Stop.E"后, 系统停止工作.


与之前以串口中断为主线的控制逻辑不同, 这里以定时器0中断为主线(其实也就是以系统序列动作为主线), 并提高了串口中断的优先级(以实时响应命令).


#include

char tcount = 0;

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

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

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

int i = 0;

int len = 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_INT() interrupt 4//串行通信中断处理程序

{

    int len = 0;

    int j = 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命令(开机)

                    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 = 0;

                    P27 = 1;

                    P26 = 0;//D7亮

                    P25 = 1;

                    P24 = 1;

                    SBUF = en + 48;

                }

            }

            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;

                    P25 = 0;//D6亮

                    P24 = 1;

                    SBUF = en + 48;

                }

            }

            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')//确定发来的步数是数字

                    {

                        en = 0;

                        P27 = 1;

                        P26 = 1;

                        P25 = 1;

                        P24 = 0;//D5亮

                        SBUF = en + 48;

                    }

                }

            }

        }

    }

    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;

    IP = 0x10;//提升串口中断的优先级

    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:针臂下限位信号


*/


推荐阅读

史海拾趣

Davicom公司的发展小趣事

面对不断变化的市场环境和客户需求,Davicom始终保持创新精神,不断寻求新的发展机遇。公司紧跟行业趋势,积极投入研发资源,推出了一系列具有创新性的产品。这些新产品不仅提升了公司的市场竞争力,也为公司的持续发展注入了新的动力。

GE Solid State公司的发展小趣事
对于视力障碍的学生或学习者来说,可听的曝光表电路可以作为一种辅助工具来帮助他们理解和感知光线和曝光量的概念。
Floeth Electronic Ltd公司的发展小趣事
选择一个合适的光敏元件(如光敏电阻或光敏二极管)作为感光元件,以及必要的信号处理元件(如运算放大器、比较器等)和声音输出元件(如扬声器)。
Dynastream公司的发展小趣事

Dynastream公司成立于1998年,当时正值科技飞速发展的年代。创始人凭借其敏锐的市场洞察力和对技术的深厚理解,决定专注于个人监视传感器和运动分析领域的研究与开发。在创业初期,公司面临资金短缺、人才匮乏等种种困难,但团队凭借着对技术的热情和不懈的努力,成功研发出了第一代产品,并在市场上引起了广泛关注。

Everett Charles Technologies (ECT)公司的发展小趣事

2001年,Everett Charles Technologies (Shenzhen) Limited(ECT深圳)正式成立,成为Dover集团在中国的全资子公司。ECT深圳的成立,不仅为ECT在中国市场的业务拓展提供了有力支持,也为公司进一步拓展亚洲市场奠定了基础。多年来,ECT深圳凭借卓越的产品质量和服务水平,赢得了众多客户的信赖和支持,成为ECT在亚洲地区的重要生产基地。

Accelink Technologies Co Ltd公司的发展小趣事

1965年,Everett Charles Technologies (ECT) 公司正式成立,标志着其在电子测试系统硬件与软件领域的起点。ECT的创始人凭借对电子技术的深刻理解和市场需求的敏锐洞察,成功开发出了一系列符合工业标准的产品,包括POGO探针、ValuGrid测试治具等。这些产品的推出,不仅奠定了ECT在电子测试领域的基础,也为公司的后续发展提供了强大的动力。

问答坊 | AI 解惑

手机万能充电器电路原理与维修

本帖最后由 jameswangsynnex 于 2015-3-3 19:54 编辑 由于各型号手机所附带的充电器插口不同,以造成各手机充电器之间不能通用。当用户手机充电器损坏或丢失后,无法修复或购不到同型号充电器,使手机无法使用。万能充电器厂家看到这样的商机,就 ...…

查看全部问答>

支持移动硬盘需要加什么组件

usb host已经ok,u盘可以识别并挂载,但移动硬盘插上去没反应。 请问要支持移动硬盘,系统需要添加什么组件吗?…

查看全部问答>

usb键盘老是要拔掉重插

最近买了个usb接口键盘,老是要重插才能用,按照网上所说把设备管理-》usb room hub-》电源管理-》允许计算机关闭设别以节约电源停掉了。好像也不是qq冲突问题,在qq目录中找不到网上所说的的那两个文件。如果我把液晶显示其关掉,让机器开着, ...…

查看全部问答>

setsockopt 函数如何使用?

我的发送程序 #include \"vxWorks.h\" #include \"fioLib.h\" #include \"stdio.h\" #include \"unistd.h\" #include \"string.h\" #include \"usrLib.h\" #include \"errnoLib.h\" #include \"hostLib.h\" #include \"sockLib.h\" #incl ...…

查看全部问答>

关于UCOS移植C51上的RAM分配的问题。

大家好。本人对于UCOS还是新手。想找UCOS的系统移植到C51上,遇到一些问题。希望大家来帮忙解决一下。 (在网上下载了一个移植实例有些看不太明白) 问题一:实例代码如下          ;定义重定位段     ...…

查看全部问答>

MC3486/MC3487使用问题

近日小弟准备用两组MC3486/MC3487实现数据通讯,但不知道MC3486/3487该怎么使用,接口电路怎么画?是否需要进行阻抗匹配?是否需要光藕隔离? 还望各位大哥小弟们赐教.谢谢~~~~~…

查看全部问答>

请教:UCOS-II在TI的VC33移植时需要保存和恢复的全部寄存器都是那些、正确顺序是?

我正在研究UCOS-II在TI的VC33移植,但从33资料中确定不了以上问题,请有经验的高手指教,小弟不胜感激啊!!     我对TI公司的DSP(包括2812、c33、2407)的开发都有一定的经验了,欢迎和大家交流,我的的qq号是:61225451。…

查看全部问答>

变压器空载合闸跳速断是什么原因

10KV开关柜 变压器空载送电时跳速断 综保显示二次电流15A 变压器额定电流116A 什么原因…

查看全部问答>

期待9B96

支持论坛 提供9B96板子  做USB通讯    天地华杰科技有限公司 [ 本帖最后由 bjmonsoon 于 2011-10-31 11:41 编辑 ]…

查看全部问答>

关于LPC里面的sram内存分配的问题

大家好,碰到一个问题想和大家讨论下,我用的LPC2478芯片内存是64k, 现在想从中分配出一段内存来做缓冲区。要的是绝对地址,和寄存器地址一样的那种。请问如何分配。求指导…

查看全部问答>