
带命令启动功能的二自由度自动进样器(2019.6.26修改完毕)
发布日期:2021-05-08 01:17:42
浏览次数:29
分类:精选文章
本文共 3429 字,大约阅读时间需要 11 分钟。
上位机发出'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:针臂下限位信号*/
发表评论
最新留言
不错!
[***.144.177.141]2025年04月14日 06时32分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
计算输入的一句英文语句中单词数
2021-05-08
lvs+keepalive构建高可用集群
2021-05-08
Mysql高可用架构(主从同步)
2021-05-08
mysql主从延迟高的原因
2021-05-08
ATS缓存数据结构
2021-05-08
glob模块
2021-05-08
6 个 Linux 运维典型问题
2021-05-08
oracle无法启动asm实例记录
2021-05-08
取消vim打开文件全是黄色方法
2021-05-08
一个系统部署多个tomcat实例
2021-05-08
HP服务器设置iLO
2021-05-08
从头实现一个WPF条形图
2021-05-08
.NET CORE(C#) WPF 方便的实现用户控件切换(祝大家新年快乐)
2021-05-08
使用QT实现一个简单的登陆对话框(纯代码实现C++)
2021-05-08
QT :warning LNK4042: 对象被多次指定;已忽略多余的指定
2021-05-08
GLFW 源码 下载-编译-使用/GLAD配置
2021-05-08
针对单个网站的渗透思路
2021-05-08
Typescript 学习笔记六:接口
2021-05-08
【ASP.NET】ASP.NET中权限验证使用OnAuthorization实现
2021-05-08