
以串口中断为主线的二自由度自动进样器控制(有一定问题)(程序架构不可取, 只供研究)
发布日期:2021-05-08 01:17:43
浏览次数:27
分类:精选文章
本文共 2761 字,大约阅读时间需要 9 分钟。
我的本意是当输入"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 -> P03P0.1:针臂上限位信号 -> P01
P0.2:针臂下限位信号 -> P02*/
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月09日 20时47分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
剑指Offer面试题:9.二进制中1的个数
2021-05-09
《你是在做牛做马还是在做主管》- 读书笔记
2021-05-09
重新温习软件设计之路(4)
2021-05-09
MySQL数据库与python交互
2021-05-09
python如何对字符串进行html转义与反转义?
2021-05-09
开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程
2021-05-09
golang基础--类型与变量
2021-05-09
.NetCore外国一些高质量博客分享
2021-05-09
解决WebRTC中不同的浏览器之间适配的问题
2021-05-09
深入理解JavaScript函数
2021-05-09
【spring源码系列】之【xml解析】
2021-05-09
(在模仿中精进数据可视化07)星球研究所大坝分布可视化
2021-05-09
(数据科学学习手札02)Python与R在循环语句与条件语句上的异同
2021-05-09
(数据科学学习手札27)sklearn数据集分割方法汇总
2021-05-09
(数据科学学习手札40)tensorflow实现LSTM时间序列预测
2021-05-09
[整理] 哪些集合类是线程安全的?(Java)
2021-05-09
8 个警示和学习的 5 个阶段
2021-05-09