一、整体功能概述该代码基于 51 单片机REG52 标准库实现串口上位机指令控制 8 路 LED功能单片机串口波特率 9600电脑串口助手发送字符0~7对应点亮 P0 口 8 颗 LED 中指定编号 LED发送其他字符则全部 LED 熄灭程序采用串口中断接收数据主循环只做指令解析中断内无耗时操作运行稳定。二、硬件资源分配LED 外设P0.0~P0.7 分别定义为 LED1~LED8高电平熄灭、低电平点亮上电默认全部熄灭。串口通信外设使用定时器 1 作为串口波特率发生器9600bps、8 位数据、1 停止位、允许串口接收中断 串口中断号 4接收数据存入全局缓存并置接收标志位。三、各模块细分功能1. 基础宏与类型定义typedef简化unsigned char/int为uchar/uint简化代码书写宏BAUD_9600_TH0xFA为定时器 1 初值配合 SMOD1 实现 9600 波特率UART_INT_NUM4串口中断号宏定义便于修改。2. 串口驱动函数UART_Init (th_val) 串口初始化TMOD 配置定时器 1 为模式 28 位自动重装SCON0x50串口模式 1允许接收PCON 最高位置 1开启波特率倍速装载 TH1/TL1 重装初值开启串口中断、总中断、启动定时器 1。UART_SendByte (uchar dat) 单字节发送将数据写入发送寄存器 SBUF等待发送完成标志 TI 置 1 后清零 TI。*UART_SendString(ucharstr) 字符串发送循环调用单字节发送函数直到字符串结束符\0停止上电自动发送就绪提示字符串。3. LED 操作函数LED_AllOff()将 8 路 LED 全部置高电平关闭所有灯光每次收到有效指令前统一关灯保证同一时刻只亮一颗 LED。4. 串口中断服务函数 UART_ISR仅处理接收中断RI 标志发送中断不处理收到数据后自动清零 RI将串口寄存器 SBUF 的数据存入全局接收缓存uart_rec_buf置位rec_flag接收标志告知主循环有新指令中断内无延时、无 IO 操作保证中断快速退出不影响串口连续接收。5. 主函数 main 逻辑初始化串口向上位机打印就绪提示调用 LED_AllOff上电全灭 LED无限循环轮询接收标志rec_flag检测到标志置 1立即清除标志读取接收缓存中的串口指令先执行全灭 LED再根据收到字符分支处理收到字符0点亮 LED1收到字符1点亮 LED2…… 依次类推7点亮 LED8收到0~7以外任意字符不点亮任何 LED保持全灭状态。四、工作流程总结单片机上电 → 串口初始化 → 打印就绪提示 → 所有 LED 熄灭上位机串口发送字符单片机串口触发中断中断缓存数据并标记有新指令快速退出中断主循环检测到接收标志解析字符先全关 LED 再点亮对应编号 LED持续循环等待下一条串口指令。五、程序设计优势中断与主业务分离中断只做数据缓存耗时 LED 操作放在主循环不会丢串口数据指令互斥每次新指令先熄灭全部 LED同一时间仅单颗 LED 点亮模块化设计串口收发、LED 控制、初始化功能独立封装易修改扩展容错处理非0~7字符输入时自动关闭所有 LED无异常灯光输出#include reg52.h // 类型重定义 typedef unsigned char uchar; typedef unsigned int uint; // 系统参数宏定义 #define BAUD_9600_TH 0xFA #define UART_INT_NUM 4 // LED引脚定义 P0.0~P0.7 对应LED1~LED8 sbit LED1 P0^0; sbit LED2 P0^1; sbit LED3 P0^2; sbit LED4 P0^3; sbit LED5 P0^4; sbit LED6 P0^5; sbit LED7 P0^6; sbit LED8 P0^7; // 全局变量 uchar uart_rec_buf; // 接收缓存 bit rec_flag 0; // 接收完成标志 /**************************** * brief 串口发送单个字节 ****************************/ void UART_SendByte(uchar dat) { SBUF dat; while(TI 0); TI 0; } /**************************** * brief 串口发送字符串 ****************************/ void UART_SendString(uchar *str) { while(*str ! \0) { UART_SendByte(*str); } } /**************************** * brief 串口初始化 9600波特率 ****************************/ void UART_Init(uchar th_val) { TMOD | 0x20; SCON 0x50; PCON | 0x80; TH1 th_val; TL1 th_val; ES 1; EA 1; TR1 1; } /**************************** * brief 关闭全部LED ****************************/ void LED_AllOff(void) { LED1 1; LED2 1; LED3 1; LED4 1; LED5 1; LED6 1; LED7 1; LED8 1; } /**************************** * brief 串口中断服务函数 * 仅缓存数据置标志不做延时与LED操作 ****************************/ void UART_ISR() interrupt UART_INT_NUM { if(RI 1) { RI 0; uart_rec_buf SBUF; rec_flag 1; // 标记收到新数据 } } /**************************** * brief 主函数 ****************************/ void main(void) { uchar i; uchar cmd; UART_Init(BAUD_9600_TH); UART_SendString(UART Ready! Send 0~7 to control LED1~LED8\r\n); LED_AllOff(); // 上电所有灯熄灭 while(1) { if(rec_flag 1) { rec_flag 0; // 清除接收标志 cmd uart_rec_buf; LED_AllOff(); // 每次指令先熄灭所有灯 switch(cmd) { case 0: LED1 0; break; case 1: LED2 0; break; case 2: LED3 0; break; case 3: LED4 0; break; case 4: LED5 0; break; case 5: LED6 0; break; case 6: LED7 0; break; case 7: LED8 0; break; default: break; // 其他字符保持全灭 } } } }