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

第 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 <stdio.h>

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 液晶屏------高级显示方案

相关推荐
地平线开发者19 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
学习星球1 天前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
alphaTao1 天前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid1121 天前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
顶点多余2 天前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考2 天前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha60162 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘2 天前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天2 天前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法
AI情绪识别开源2 天前
检信 AI 智能推广平台(代号:JX-Promote)
人工智能·算法·erlang