51单片机从零到实战(8)——串口通信

2026-07-19 21:51:27

第 8 篇:串口通信------让单片机"说话"

之前所有程序都是单片机"自言自语"。串口让它能和电脑通信------这是调试和控制的利器。

1. 硬件连接

scss

复制代码

STC89C52 USB-TTL 烧录器 电脑

P3.0(RXD) ←── TXD

P3.1(TXD) ──→ RXD

GND ──── GND

2. 串口配置(9600bps,方式 1)

c

复制代码

void uart_init(void)

{

SCON = 0x50; // 方式 1(8 位 UART),允许接收

TMOD &= 0x0F;

TMOD |= 0x20; // 定时器 1 方式 2(8 位自动重装)

TH1 = 0xFD; // 9600bps @ 11.0592MHz

TL1 = 0xFD;

TR1 = 1; // 启动定时器 1

ES = 1; // 使能串口中断

EA = 1;

}

3. 发送与接收

c

复制代码

// 发送一个字符

void uart_send_byte(unsigned char dat)

{

SBUF = dat; // 写 SBUF = 开始发送

while (TI == 0); // 等发送完成

TI = 0; // 清除标志

}

// 发送字符串

void uart_send_string(char *str) {

while (*str) uart_send_byte(*str++);

}

// 接收(中断方式)

unsigned char rx_buf[64];

unsigned char rx_len = 0;

void uart_isr(void) interrupt 4

{

if (RI) { // 收到数据

RI = 0;

rx_buf[rx_len++] = SBUF;

if (rx_buf[rx_len-1] == '\n') { // 收到换行 = 一帧结束

rx_buf[rx_len] = '\0'; // 加字符串结束符

uart_process(rx_buf); // 处理指令

rx_len = 0;

}

}

}

4. printf 重定向------调试神器

c

复制代码

#include

char putchar(char c) {

SBUF = c;

while (TI == 0);

TI = 0;

return c;

}

// 现在可以直接用 printf 了

printf("Temperature: %d°C\r\n", temp);

printf("Speed: %d RPM\r\n", speed);

5. 实战:串口控制指令

c

复制代码

void uart_process(char *cmd)

{

if (strncmp(cmd, "LED ON", 6) == 0) {

LED = 0;

printf("LED turned ON\r\n");

}

else if (strncmp(cmd, "LED OFF", 7) == 0) {

LED = 1;

printf("LED turned OFF\r\n");

}

else if (strncmp(cmd, "TEMP", 4) == 0) {

printf("Temperature: %d°C\r\n", read_temp());

}

else {

printf("Unknown command: %s\r\n", cmd);

}

}

电脑端用串口助手发送 LED ON → 单片机收到 → LED 亮 → 回复 LED turned ON。

下一篇:LCD1602 液晶屏------高级显示方案