1. 项目概述:当PIC遇上MODBUS
十年前我第一次接触工业自动化项目时,MODBUS协议就像天书一样难以理解。直到用PIC16F1824实现了第一个功能码01(读取线圈状态)的从站设备,才真正体会到这个经典协议的简洁之美。本文将基于PIC16F1824和PIC12F1822这两款性价比极高的8位单片机,手把手带你实现MODBUS-RTU模式下最常用的四个功能码:01(读线圈)、03(读保持寄存器)、05(写单线圈)和06(写单寄存器)。
选择这两款芯片的原因很实际:PIC16F1824拥有14个GPIO和7KB闪存,适合需要较多外设接口的场景;而PIC12F1822仅有8引脚封装,在空间受限的传感器节点中表现优异。两者都内置了EUSART模块,这正是实现MODBUS-RTU通信的硬件基础。实际项目中,我曾在智能照明控制系统中用PIC12F1822管理8路继电器(功能码01/05),在温湿度监测网络中用PIC16F1824处理传感器数据(功能码03/06),稳定运行三年无故障。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件设计要点
2.1 最小系统搭建
以PIC16F1824为例,典型的最小系统需要:
- 4.7KΩ上拉电阻连接MCLR引脚
- 0.1μF去耦电容靠近VDD引脚
- 32.768kHz晶体(可选,用于需要精确时序的应用)
- MAX485芯片构成RS485物理层(注意A/B线需加120Ω终端电阻)
关键细节:PIC12F1822的GP2/GP5引脚复用为ICSP功能,若需保留编程接口,建议将RS485的DE/RE控制信号连接到GP0/GP1。
2.2 通信电路设计
MODBUS-RTU标准要求使用RS485差分信号。推荐电路如下:
c复制PIC_TX -> MAX485_DI
PIC_RX <- MAX485_RO
PIC_GPIO -> MAX485_DE/RE(收发使能)
实测中发现,DE/RE切换时机直接影响通信成功率。我的经验是:发送前先拉高DE/RE,完成发送后延迟100μs再拉低。这个延时在9600bps波特率下表现稳定。
3. 软件框架实现
3.1 MODBUS协议栈核心
协议处理流程应包含以下状态:
- 接收中断触发,填充缓冲区
- 超时检测(RTU要求3.5字符间隔)
- CR
