标题:
STC15单片机串口返回值和控制继电器
[打印本页]
作者:
zhujiangzhang
时间:
2025-4-24 18:08
标题:
STC15单片机串口返回值和控制继电器
刚学单片机,硬件是用的最简单的STC 15W408单片机开发板,外接RS232串口通讯,外接光耦隔离的继电器模块,强制单片机IO口,继电器可以正常吸合。可以说硬件连接无问题。现在要实现如下功能,网上找了很多方法,都没有达到要求:1.要求STC 15W408 (28脚封装)串口收到“PASS”,返回值“OK ”,17脚控制的继电器吸合,串口收到“FAIL” 返回值“NG”,18脚控制的继电器吸合。其中PASS FAIL字符没有结束位,也没有回车换行字符。
哪位大神,帮忙写个代码,参考一下,谢谢!
作者:
lose2836
时间:
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
作者:
chxelc
时间:
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;
}
}
}
作者:
juncedz
时间:
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; // 重置接收索引
}
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1