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

相关推荐
小帽子_1238 小时前
大功率 PCS 双环闭环控制算法原理与实现
算法
buhuizhiyuci8 小时前
【算法篇】位运算 —— 基础篇
java·数据库·算法
Black蜡笔小新9 小时前
算法训练完了怎么上线?DLTM→AIS→EasyGBS三步交付流水线
人工智能·算法
sycmancia9 小时前
Qt——多线程与界面组件的通信
开发语言·qt·算法
想吃火锅10059 小时前
【leetcode】5.最长回文子串js
算法·leetcode·职场和发展
CoderYanger10 小时前
A.每日一题:1967题+1331题
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
Jasmine_llq10 小时前
《P17010 [GESP202606 五级] 排排坐》
算法·贪心算法·数学化简求和式·排序sort 反向迭代器降序·线性遍历累加计算总权重和
va学弟10 小时前
LeetCode 热题 100 题解(1):哈希
python·算法·leetcode·哈希算法
程序员老陆10 小时前
使用Qt+大华设备SDK预览大华摄像机视频
qt·算法·音视频·视频监控