找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 543|回复: 3
打印 上一主题 下一主题
收起左侧

STC15单片机串口返回值和控制继电器

[复制链接]
跳转到指定楼层
楼主
ID:818740 发表于 2025-4-24 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚学单片机,硬件是用的最简单的STC 15W408单片机开发板,外接RS232串口通讯,外接光耦隔离的继电器模块,强制单片机IO口,继电器可以正常吸合。可以说硬件连接无问题。现在要实现如下功能,网上找了很多方法,都没有达到要求:1.要求STC 15W408 (28脚封装)串口收到“PASS”,返回值“OK ”,17脚控制的继电器吸合,串口收到“FAIL” 返回值“NG”,18脚控制的继电器吸合。其中PASS FAIL字符没有结束位,也没有回车换行字符。

哪位大神,帮忙写个代码,参考一下,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:685462 发表于 2025-4-24 23:55 | 只看该作者
串口接收char buffer[16];
中断接收函数:
void UartIsr() interrupt 4
{
    if (TI)
    {
        TI = 0;
        busy = 0;
    }
    if (RI)
    {
        RI = 0;
        buffer[rptr++] = SBUF;
        rptr &= 0x0f;
    }
}
接收字符串和自定义fan_buf进行比较,如果相等给 CCAP0H
if( strcmp(fan_buf[0],buffer) == 0 )      //1700
     CCAP0H = 0x90;  
这是我用来给路由器散热,控制风扇用的,用的stc8g1k08a

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:712097 发表于 2025-4-25 11:34 | 只看该作者
#include <STC15.H>
#include <string.h>

#define RELAY_PASS P16  // P1.6(17脚)
#define RELAY_FAIL P17  // P1.7(18脚)

char recvBuffer[5];     // 接收缓冲区(PASS/FAIL均为4字符)
unsigned char recvIndex = 0;
bit recvComplete = 0;   // 接收完成标志

void UART_ISR() interrupt 4 {
    if (RI) {
        RI = 0;         // 清除接收中断标志
        recvBuffer[recvIndex++] = SBUF;  // 存入缓冲区
        if (recvIndex >= 4) {           // 接收满4字节
            recvComplete = 1;          // 触发处理标志
            recvIndex = 0;             // 重置索引
        }
    }
    if (TI) TI = 0;     // 清除发送中断标志(未启用发送中断)
}

void UART_Init() {
    SCON = 0x50;        // 模式1:8位UART,允许接收
    AUXR = 0x14;        // 定时器2为1T模式,作为波特率发生器
    T2L = 0xE8;         // 波特率9600@11.0592MHz
    T2H = 0xFE;
    ES = 1;             // 使能串口中断
    EA = 1;             // 全局中断使能
}

void GPIO_Init() {
    P1M0 = 0xC0;        // P1.6/P1.7推挽输出模式
    P1M1 = 0x00;        // 其他引脚准双向口
    RELAY_PASS = 0;      // 初始状态关闭继电器
    RELAY_FAIL = 0;
}

void SendResponse(char *str) {
    while (*str) {
        SBUF = *str++;  // 发送字符
        while (!TI);    // 等待发送完成
        TI = 0;
    }
}

void main() {
    UART_Init();
    GPIO_Init();
    while (1) {
        if (recvComplete) {
            recvComplete = 0;
            // 比较接收内容并执行动作
            if (memcmp(recvBuffer, "PASS", 4) == 0) {
                SendResponse("OK");
                RELAY_PASS = 1;     // 吸合17脚继电器
            } else if (memcmp(recvBuffer, "FAIL", 4) == 0) {
                SendResponse("NG");
                RELAY_FAIL = 1;     // 吸合18脚继电器
            }
            // 延时后释放继电器(根据需求调整)
            DelayMs(2000);
            RELAY_PASS = RELAY_FAIL = 0;
        }
    }
}
回复

使用道具 举报

地板
ID:595237 发表于 2025-4-25 12:00 | 只看该作者
请参考,自己调试一下

void main() {
    GPIO_Init();
    UART_Init();
    while(1); // 主循环保持空转
}

// 串口中断服务函数
void UART_ISR() interrupt 4 {
    if (RI) {
        RI = 0; // 清除接收中断标志
        
        // 接收字符并存入缓冲区
        rxBuffer[rxIndex++] = SBUF;
        
        // 当接收满4个字符时处理
        if (rxIndex >= 4) {
            // 检测"PASS"命令
            if (memcmp(rxBuffer, "PASS", 4) == 0) {
                SendString("OK");
                Relay1 = 0;  // 吸合继电器1
                Relay2 = 1;  // 释放继电器2
            }
            // 检测"FAIL"命令
            else if (memcmp(rxBuffer, "FAIL", 4) == 0) {
                SendString("NG");
                Relay2 = 0;  // 吸合继电器2
                Relay1 = 1;  // 释放继电器1
            }
            
            rxIndex = 0; // 重置接收索引
        }
    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表