找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 414|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STC15單片機(jī)串口返回值和控制繼電器

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:818740 發(fā)表于 2025-4-24 18:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
剛學(xué)單片機(jī),硬件是用的最簡單的STC 15W408單片機(jī)開發(fā)板,外接RS232串口通訊,外接光耦隔離的繼電器模塊,強(qiáng)制單片機(jī)IO口,繼電器可以正常吸合�?梢哉f硬件連接無問題。現(xiàn)在要實現(xiàn)如下功能,網(wǎng)上找了很多方法,都沒有達(dá)到要求:1.要求STC 15W408 (28腳封裝)串口收到“PASS”,返回值“OK ”,17腳控制的繼電器吸合,串口收到“FAIL” 返回值“NG”,18腳控制的繼電器吸合。其中PASS FAIL字符沒有結(jié)束位,也沒有回車換行字符。

哪位大神,幫忙寫個代碼,參考一下,謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:685462 發(fā)表于 2025-4-24 23:55 | 只看該作者
串口接收char buffer[16];
中斷接收函數(shù):
void UartIsr() interrupt 4
{
    if (TI)
    {
        TI = 0;
        busy = 0;
    }
    if (RI)
    {
        RI = 0;
        buffer[rptr++] = SBUF;
        rptr &= 0x0f;
    }
}
接收字符串和自定義fan_buf進(jìn)行比較,如果相等給 CCAP0H
if( strcmp(fan_buf[0],buffer) == 0 )      //1700
     CCAP0H = 0x90;  
這是我用來給路由器散熱,控制風(fēng)扇用的,用的stc8g1k08a

評分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:712097 發(fā)表于 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];     // 接收緩沖區(qū)(PASS/FAIL均為4字符)
unsigned char recvIndex = 0;
bit recvComplete = 0;   // 接收完成標(biāo)志

void UART_ISR() interrupt 4 {
    if (RI) {
        RI = 0;         // 清除接收中斷標(biāo)志
        recvBuffer[recvIndex++] = SBUF;  // 存入緩沖區(qū)
        if (recvIndex >= 4) {           // 接收滿4字節(jié)
            recvComplete = 1;          // 觸發(fā)處理標(biāo)志
            recvIndex = 0;             // 重置索引
        }
    }
    if (TI) TI = 0;     // 清除發(fā)送中斷標(biāo)志(未啟用發(fā)送中斷)
}

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

void GPIO_Init() {
    P1M0 = 0xC0;        // P1.6/P1.7推挽輸出模式
    P1M1 = 0x00;        // 其他引腳準(zhǔn)雙向口
    RELAY_PASS = 0;      // 初始狀態(tài)關(guān)閉繼電器
    RELAY_FAIL = 0;
}

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

void main() {
    UART_Init();
    GPIO_Init();
    while (1) {
        if (recvComplete) {
            recvComplete = 0;
            // 比較接收內(nèi)容并執(zhí)行動作
            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腳繼電器
            }
            // 延時后釋放繼電器(根據(jù)需求調(diào)整)
            DelayMs(2000);
            RELAY_PASS = RELAY_FAIL = 0;
        }
    }
}
回復(fù)

使用道具 舉報

地板
ID:595237 發(fā)表于 2025-4-25 12:00 | 只看該作者
請參考,自己調(diào)試一下

void main() {
    GPIO_Init();
    UART_Init();
    while(1); // 主循環(huán)保持空轉(zhuǎn)
}

// 串口中斷服務(wù)函數(shù)
void UART_ISR() interrupt 4 {
    if (RI) {
        RI = 0; // 清除接收中斷標(biāo)志
        
        // 接收字符并存入緩沖區(qū)
        rxBuffer[rxIndex++] = SBUF;
        
        // 當(dāng)接收滿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; // 重置接收索引
        }
    }
}
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表