下面程序是为了实现二自由度自动进样检测器的控制而编写的. 在程序执行过程中, 我发现, 在发送Start.E再发送Stop.E后, 串口助手接收缓存区并未显示一连串"00": 这说明在输入Start.E后, 虽然又收到Stop.E时执行了"en = 0"这个表达式, 但是回到第一层中断处理程序后, 这里的en还是"1"(并未变为我们希望的"0"). 这说明, 以串口中断实现对二自由度自动进样检测仪的控制, 还是有一定难度的. 接下来我将致力于解决这一难题.
#include <STC89C5xRC.H>
char buf[30];//存放串口传来的数据
int i = 0;
int en;
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;
while(1)
{
SBUF = 1;
while(TI == 0);
TI = 0;
while(en == 0)
{
SBUF = 0;
while(TI == 0);
TI = 0;
}
}
}
else if(buf[0] == 'R' && buf[1] == 'e' && buf[2] == 's' && buf[3] == 'e' && buf[4] == 't' && buf[5] == '.')//主转盘回到原始位置,针臂抬到最高位置
{
//Reset命令(复位命令)
while(j < len)
{
SBUF = buf[j];
while(TI == 0);//等待数据发送
TI = 0;
j++;
}
j = 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')//确定发来的步数是数字
{
while(j < len)
{
SBUF = buf[j];
while(TI == 0);//等待数据发送
TI = 0;
j++;
}
j = 0;
}
}
}
}
}
}
int main()
{
RI = 0;
TI = 0;
TMOD = 0x21;
SCON = 0x50;
TH1 = 0xe6;
TL1 = 0xe6;
TR1 = 1;
IE = 0x90;
while(1)
{
;//采用前后台系统架构
}
}
我将上述程序中的轮询部分去除, 并分别以D8/D7/D6/D5的点亮对应Start./Reset./Stop.E/Main motor run steps.命令.
在运行后发现, 四种命令完美对应四盏灯的亮灭.
#include char buf[30];//存放串口传来的数据 int i = 0; int en = 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; } 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; } } else if(len == 5)//停机命令 { if(buf[0] == 'S' && buf[1] == 't' && buf[2] == 'o' && buf[3] == 'p' && buf[4] == '.') { //Stop命令(停机命令)
上一篇:8051单片机(STC89C52)稳定显示某两位数字
下一篇:51单片机——八段数码管
推荐阅读最新更新时间:2024-11-11 04:13
设计资源 培训 开发板 精华推荐
- LTC3838IUHF-1 1.2V/1.5V、15A、350kHz 降压转换器的典型应用电路
- I2C总线级联器+MPU6050陀螺仪+WS2812灯珠扩展板
- DEV-15795,基于 ATmega32U4 的 SparkFun Qwiic Pro Micro USB-C 开发套件
- LT3574EMS 演示板,无光耦合器的隔离式反激式转换器
- 使用 Richtek Technology Corporation 的 RT8120E 的参考设计
- 使用 Microchip Technology 的 TC18C47MJE 的参考设计
- 使用 Analog Devices 的 LT1120CS8 的参考设计
- SimpleLink™ Wi-Fi® NFC 读卡器
- RY-2424S 24V、42mA输出DC/DC转换器典型应用电路
- SW3517K-USB快充电源模块
- 科学家研发基于AI的身份验证工具 可保护车辆免受网络攻击威胁
- Microchip推出广泛的IGBT 7 功率器件组合,专为可持续发展、电动出行和数据中心应用而设计
- 面向未来驾驶体验 博世推出新型微电子技术
- 英飞凌与马瑞利合作 利用AURIX™ TC4x MCU系列推动区域控制单元创新
- 5C超充,该怎么卷?
- 《2025年度中国汽车十大技术趋势》正式揭晓!你最看好哪个?
- Microchip推出新型VelocityDRIVE™软件平台和车规级多千兆位以太网交换芯片,支持软件定义汽车
- 英特尔中国正式发布2023-2024企业社会责任报告
- can转485数据是如何对应的
- MCU今年的重点:NPU和64位