51 单片机分层架构的模块依赖关系图

51 单片机分层架构的模块依赖关系图,并配一份可直接套用的代码框架


一、51 单片机软件分层架构图

复制代码
┌───────────────────────────────┐
│         应用层(APP)           │
│  - 产品业务逻辑(状态机)       │
│  - 用户交互(按键、显示)       │
│  - 流程控制(加热、保温等)     │
└───────────────▲───────────────┘
                │  调用接口
┌───────────────┴───────────────┐
│       服务层(Service)         │
│  - 协议解析(Modbus、私有协议) │
│  - 数据处理(滤波、PID)        │
│  - 按键扫描、显示缓存管理       │
└───────────────▲───────────────┘
                │  调用接口
┌───────────────┴───────────────┐
│   硬件抽象层(HAL)             │
│  - GPIO 接口化                 │
│  - 串口收发接口化               │
│  - 定时器抽象接口               │
│  - 屏蔽不同 51 寄存器差异       │
└───────────────▲───────────────┘
                │  调用接口
┌───────────────┴───────────────┐
│   硬件驱动层(Driver)          │
│  - 直接操作寄存器               │
│  - 初始化、收发、配置           │
│  - 单片机特定寄存器访问         │
└───────────────────────────────┘

依赖规则

  • 上层只能调用下层,不允许跨层调用(例如 APP 不能直接用 Driver)。
  • 硬件变化只改 Driver 和 HAL,业务变化只改 Service 和 APP。

二、代码文件组织结构

复制代码
/project
│
├── app/
│   ├── app_main.c          // 主循环、状态机
│   └── app_main.h
│
├── service/
│   ├── service_key.c       // 按键扫描
│   ├── service_key.h
│   ├── service_display.c   // 显示管理
│   └── service_display.h
│
├── hal/
│   ├── hal_gpio.c          // GPIO 抽象
│   ├── hal_gpio.h
│   ├── hal_uart.c          // 串口抽象
│   └── hal_uart.h
│
├── driver/
│   ├── driver_gpio.c       // 直接操作 P0/P1/P2/P3
│   ├── driver_gpio.h
│   ├── driver_uart.c       // 串口寄存器
│   └── driver_uart.h
│
└── main.c                  // 系统初始化入口

三、示例代码框架

driver_uart.c(硬件驱动层)

c 复制代码
#include "driver_uart.h"
#include <REG51.H>

void UART0_Init(uint32_t baud) {
    SCON = 0x50;   // 串口模式1
    TMOD |= 0x20;  // 定时器1模式2
    TH1 = 256 - (11059200UL / 12 / 32 / baud);
    TL1 = TH1;
    TR1 = 1;
}

void UART0_SendByte(uint8_t dat) {
    SBUF = dat;
    while (!TI);
    TI = 0;
}

uint8_t UART0_RecvByte(void) {
    while (!RI);
    RI = 0;
    return SBUF;
}

hal_uart.c(硬件抽象层)

c 复制代码
#include "hal_uart.h"
#include "driver_uart.h"

void HAL_UART_Init(void) {
    UART0_Init(9600);
}

void HAL_UART_SendString(const char *str) {
    while (*str) {
        UART0_SendByte(*str++);
    }
}

service_key.c(服务层)

c 复制代码
#include "service_key.h"
#include "hal_gpio.h"

#define KEY1_PIN P1_0

uint8_t Key_Scan(void) {
    if (HAL_GPIO_ReadPin(KEY1_PIN) == 0) {
        // 简单消抖
        HAL_DelayMs(10);
        if (HAL_GPIO_ReadPin(KEY1_PIN) == 0) {
            return 1;
        }
    }
    return 0;
}

app_main.c(应用层)

c 复制代码
#include "service_key.h"
#include "hal_uart.h"

void APP_MainLoop(void) {
    if (Key_Scan()) {
        HAL_UART_SendString("Key Pressed\r\n");
    }
}

main.c(系统入口)

c 复制代码
#include "hal_uart.h"
#include "app_main.h"

void main(void) {
    HAL_UART_Init();
    while (1) {
        APP_MainLoop();
    }
}

四、这样分层的好处

  • 换 51 型号,只改 driver_*,不用改上层逻辑。
  • 协议、算法、业务逻辑可直接移植到别的 MCU。
  • 每层可独立调试,降低 bug 扩散风险。
  • 模块化结构更符合大项目管理方式。

相关推荐
没落英雄18 分钟前
5. 从零开始搭建一个 AI Agent —— 人机协作与中断恢复
前端·人工智能·架构
2401_8541515526 分钟前
STM32 选项字节与读写保护(RDP)
stm32·单片机·嵌入式硬件
piaoyiren1 小时前
STC8 单片机蜂鸣器播放音乐
单片机·嵌入式硬件
CIO_Alliance1 小时前
iPaaS概念原理(2)| iPaaS的架构模型是怎样的?
人工智能·低代码·架构·ipaas·系统集成
阿拉斯攀登1 小时前
无人售货柜MQTT客户端工业级配置:心跳、遗嘱、重连、QoS适配实战
嵌入式硬件·mqtt·安卓·零售·无人售货柜·无人售货机
KaifuZeng3 小时前
通信与接口协议面试问题汇总三
单片机·嵌入式硬件·面试·通信与接口协议
阳明山水3 小时前
从论文到生产:销量预测系统的工程化落地实践
大数据·人工智能·深度学习·机器学习·架构
凛风前行3 小时前
多智能体架构的 5 种经典模式
架构·agent
胡萝卜术3 小时前
从聊天模型到本地执行助手:Remote MCP 多工具 Agent 实战
面试·架构·github
杉氧3 小时前
Compose 渲染内核 (3):Slot Table 与 Gap Buffer —— 极速重组的数学艺术
android·架构·android jetpack