標(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