#include <stc8h.h>

void UartInit(void) { SCON = 0x50; AUXR |= 0x40; AUXR &= 0xFE; TMOD &= 0x0F; TL1 = 0x8F; TH1 = 0xFD; ET1 = 0; TR1 = 1; }

void send_char(char c) { SBUF = c;
while (!TI);
TI = 0;
}

char receive_char() { while (!RI);
RI = 0;
return SBUF;
}

void send_string(char* str) { while (*str) { send_char(*str++); } }

void main() { UartInit(); while (1) { char c = receive_char();
send_char(c);
} }

代码分析:

  • 函数名不一致:函数名为 UartInit,而在 main 函数中调用的是 init_uart1 函数,应该保持一致。
  • 缺少头文件:程序中使用了 stc8h.h 头文件,但是没有包含该头文件,应该添加 #include <stc8h.h>。
  • 波特率设置错误:程序中的波特率设置为 9600(TH1 = 0xFD),但是在实际使用中需要根据硬件和串口设备的要求进行设置。
  • 无限循环接收字符:程序中的 while(1) 循环会一直接收字符并发送,如果没有特殊要求,应该添加停止接收的条件。

改进建议:

  1. 将 init_uart1 函数名修改为 UartInit。
  2. 添加 #include <stc8h.h> 头文件。
  3. 调整波特率设置,根据实际需求修改 TH1 的值。
  4. 添加停止接收字符的条件,例如判断接收到的字符是否为特定字符,或者设置一个计数器来限制接收字符的数量。

示例代码:

#include <stc8h.h>

#define BAUD_RATE 9600 // 设置波特率

void UartInit(void)
{
    SCON = 0x50;
    AUXR |= 0x40;
    AUXR &= 0xFE;
    TMOD &= 0x0F;
    TL1 = 0x8F; // 设置波特率
    TH1 = 0xFD; // 设置波特率
    ET1 = 0;
    TR1 = 1;
}

void send_char(char c)
{
    SBUF = c;
    while (!TI);
    TI = 0;
}

char receive_char()
{
    while (!RI);
    RI = 0;
    return SBUF;
}

void send_string(char* str)
{
    while (*str)
    {
        send_char(*str++);
    }
}

void main()
{
    UartInit();
    while (1)
    {
        char c = receive_char();
        if (c == 'q') // 判断是否接收到了'q'字符,如果接收到了,则退出循环
        {
            break;
        }
        send_char(c);
    }
}

原文地址: https://www.cveoy.top/t/topic/oGur 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录