|
#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;
}
}
} |
|