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

相关推荐
VL——MOESR39 分钟前
【LuoguP1967】货车运输【生成树】【倍增】
c++·算法·题解·倍增·生成树
手写码匠41 分钟前
华为云Flexus+DeepSeek征文|Agent 记忆系统实战:用 DeepSeek-R1/V3 + Dify 会话变量打造跨会话长期记忆
人工智能·深度学习·算法·aigc
Olafur_zbj1 小时前
【AI】CUDA编程中的维度
人工智能·算法
坚持编程的菜鸟2 小时前
模拟实现memcpy
c语言·算法·模拟实现my_memcpy
wabs6662 小时前
关于图论【最短路径之Bellman_ford 算法|卡码网94.城市间货物运输的思考】
数据结构·算法·图论·卡码网·bellman_ford·求最短路径
MrZhao4002 小时前
On-Policy Distillation(OPD):为什么大模型后训练要在学生自己的轨迹上蒸馏?
算法
朱峥嵘(朱髯)2 小时前
数据库如何根据全表 NDV 估算子集的 NDV
数据库·算法
jjjava2.02 小时前
牛客算法题(第四期)
算法
雪碧聊技术2 小时前
力扣 回溯法 | LCR 020. 回文子串
javascript·算法·leetcode
wabs6662 小时前
关于哈希表【力扣454.四数相加II的思考】
数据结构·算法·leetcode·散列表