STC8 单片机 UART 串口通信程序示例
#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) 循环会一直接收字符并发送,如果没有特殊要求,应该添加停止接收的条件。
改进建议:
- 将 init_uart1 函数名修改为 UartInit。
- 添加 #include <stc8h.h> 头文件。
- 调整波特率设置,根据实际需求修改 TH1 的值。
- 添加停止接收字符的条件,例如判断接收到的字符是否为特定字符,或者设置一个计数器来限制接收字符的数量。
示例代码:
#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 著作权归作者所有。请勿转载和采集!