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

相关推荐
倒头就睡的小比特10 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!10 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼12 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光13 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark13 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her113 小时前
并查集-听课笔记
笔记·算法·并查集
码流子13 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven13 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark13 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186114 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法