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

相关推荐
Nil20839 分钟前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing1 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
loulanyue_2 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院2 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
suhan2 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
姜鱼问生2 小时前
Docker Volume 备份与恢复实战:不停机迁移数据
后端·算法·架构
suhan2 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan2 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法
大雄很用心2 小时前
如何理解时间复杂度与空间复杂度?| 面试刷题笔记02
算法
姜鱼问生2 小时前
服务器磁盘满了?从告警到清理的完整排查
后端·算法·架构