历史上的今天
今天是: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:针臂下限位信号 */
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:54 编辑 由于各型号手机所附带的充电器插口不同,以造成各手机充电器之间不能通用。当用户手机充电器损坏或丢失后,无法修复或购不到同型号充电器,使手机无法使用。万能充电器厂家看到这样的商机,就 ...… 查看全部问答> |
|
最近买了个usb接口键盘,老是要重插才能用,按照网上所说把设备管理-》usb room hub-》电源管理-》允许计算机关闭设别以节约电源停掉了。好像也不是qq冲突问题,在qq目录中找不到网上所说的的那两个文件。如果我把液晶显示其关掉,让机器开着, ...… 查看全部问答> |
|
我的发送程序 #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还是新手。想找UCOS的系统移植到C51上,遇到一些问题。希望大家来帮忙解决一下。 (在网上下载了一个移植实例有些看不太明白) 问题一:实例代码如下 ;定义重定位段 ...… 查看全部问答> |
|
近日小弟准备用两组MC3486/MC3487实现数据通讯,但不知道MC3486/3487该怎么使用,接口电路怎么画?是否需要进行阻抗匹配?是否需要光藕隔离? 还望各位大哥小弟们赐教.谢谢~~~~~… 查看全部问答> |
|
请教:UCOS-II在TI的VC33移植时需要保存和恢复的全部寄存器都是那些、正确顺序是? 我正在研究UCOS-II在TI的VC33移植,但从33资料中确定不了以上问题,请有经验的高手指教,小弟不胜感激啊!! 我对TI公司的DSP(包括2812、c33、2407)的开发都有一定的经验了,欢迎和大家交流,我的的qq号是:61225451。… 查看全部问答> |
|
大家好,碰到一个问题想和大家讨论下,我用的LPC2478芯片内存是64k, 现在想从中分配出一段内存来做缓冲区。要的是绝对地址,和寄存器地址一样的那种。请问如何分配。求指导… 查看全部问答> |




