標(biāo)題: STC15單片機(jī)串口返回值和控制繼電器 [打印本頁]

作者: zhujiangzhang    時(shí)間: 2025-4-24 18:08
標(biāo)題: STC15單片機(jī)串口返回值和控制繼電器
剛學(xué)單片機(jī),硬件是用的最簡單的STC 15W408單片機(jī)開發(fā)板,外接RS232串口通訊,外接光耦隔離的繼電器模塊,強(qiáng)制單片機(jī)IO口,繼電器可以正常吸合?梢哉f硬件連接無問題,F(xiàn)在要實(shí)現(xiàn)如下功能,網(wǎng)上找了很多方法,都沒有達(dá)到要求:1.要求STC 15W408 (28腳封裝)串口收到“PASS”,返回值“OK ”,17腳控制的繼電器吸合,串口收到“FAIL” 返回值“NG”,18腳控制的繼電器吸合。其中PASS FAIL字符沒有結(jié)束位,也沒有回車換行字符。

哪位大神,幫忙寫個(gè)代碼,參考一下,謝謝!

作者: lose2836    時(shí)間: 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
作者: chxelc    時(shí)間: 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;        // 定時(shí)器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í)行動(dòng)作
            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腳繼電器
            }
            // 延時(shí)后釋放繼電器(根據(jù)需求調(diào)整)
            DelayMs(2000);
            RELAY_PASS = RELAY_FAIL = 0;
        }
    }
}
作者: juncedz    時(shí)間: 2025-4-25 12:00
請(qǐng)參考,自己調(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個(gè)字符時(shí)處理
        if (rxIndex >= 4) {
            // 檢測(cè)"PASS"命令
            if (memcmp(rxBuffer, "PASS", 4) == 0) {
                SendString("OK");
                Relay1 = 0;  // 吸合繼電器1
                Relay2 = 1;  // 釋放繼電器2
            }
            // 檢測(cè)"FAIL"命令
            else if (memcmp(rxBuffer, "FAIL", 4) == 0) {
                SendString("NG");
                Relay2 = 0;  // 吸合繼電器2
                Relay1 = 1;  // 釋放繼電器1
            }
            
            rxIndex = 0; // 重置接收索引
        }
    }
}




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1