当前位置: 首页 > news >正文

51单片机模拟IIC从机实战:手把手教你用两块STC89C52实现双向通信(附完整代码)

51单片机模拟IIC从机实战:双机通信系统设计与实现

在嵌入式开发领域,IIC总线因其简洁的两线制结构和多主机支持特性,成为设备间通信的常见选择。当手头只有基础51单片机(如STC89C52)却需要验证IIC通信协议时,完全可以通过软件模拟实现双机交互。本文将详细演示如何用两块STC89C52搭建IIC通信系统,其中一块作为主机,另一块模拟从机功能,实现双向数据交换。

1. 硬件准备与电路连接

1.1 所需材料清单

  • STC89C52单片机 x2
  • 杜邦线若干
  • USB转TTL下载器 x2
  • 5V电源适配器或USB供电线
  • 面包板(可选,用于固定连接)

关键连接要点

  • 主从机的P3.4(SCL)相互连接
  • 主从机的P3.5(SDA)相互连接
  • 两片单片机共地(GND相连)

注意:实际连接时建议加入4.7KΩ上拉电阻到VCC,确保信号稳定性。若使用开发板,通常已内置上拉电阻。

1.2 引脚定义与寄存器配置

对于STC89C52,我们使用P3.4和P3.5作为IIC引脚:

sbit SCL = P3^4; // 时钟线 sbit SDA = P3^5; // 数据线

2. IIC协议核心原理剖析

2.1 基础通信时序

IIC通信包含几个关键时序节点:

信号类型时序特征持续时间(典型值)
起始信号SCL高电平时SDA下降沿>4.7μs
停止信号SCL高电平时SDA上升沿>4.0μs
数据有效SCL高电平期间保持SDA稳定>4.7μs
数据变化SCL低电平期间允许SDA变化>4.7μs

2.2 从机地址分配

在模拟从机时,需要定义设备地址。标准IIC地址为7位,我们采用0xA0作为从机写地址,0xA1作为读地址:

#define SLAVE_ADDR_W 0xA0 #define SLAVE_ADDR_R 0xA1

3. 从机端软件实现

3.1 起始/停止信号检测

从机需要持续监测总线状态:

bit I2C_CheckStart(void) { if(SCL && !SDA) { delay_us(5); if(SCL && !SDA) return 1; } return 0; } bit I2C_CheckStop(void) { if(SCL && SDA) { delay_us(5); if(SCL && SDA) return 1; } return 0; }

3.2 数据接收与发送

从机响应主机的关键函数:

unsigned char I2C_SlaveReceive() { unsigned char i, dat = 0; SDA = 1; // 释放总线 for(i=0; i<8; i++) { while(!SCL); // 等待时钟高电平 dat <<= 1; if(SDA) dat |= 0x01; while(SCL); // 等待时钟低电平 } return dat; } void I2C_SlaveSend(unsigned char dat) { unsigned char i; for(i=0; i<8; i++) { SDA = (dat & 0x80) ? 1 : 0; dat <<= 1; while(!SCL); // 等待时钟高电平 while(SCL); // 等待时钟低电平 } SDA = 1; // 释放总线 }

4. 主机端控制逻辑

4.1 基本信号生成

主机需要主动产生IIC时序信号:

void I2C_Start() { SDA = 1; SCL = 1; delay_us(5); SDA = 0; delay_us(5); SCL = 0; } void I2C_Stop() { SDA = 0; SCL = 1; delay_us(5); SDA = 1; delay_us(5); }

4.2 完整读写流程

主机向从机写入数据的典型流程:

  1. 发送起始信号
  2. 发送从机地址+写标志
  3. 等待从机应答
  4. 发送寄存器地址
  5. 发送数据字节
  6. 发送停止信号
bit I2C_WriteByte(unsigned char addr, unsigned char dat) { I2C_Start(); I2C_SendByte(SLAVE_ADDR_W); if(!I2C_CheckAck()) { I2C_Stop(); return 0; } I2C_SendByte(addr); if(!I2C_CheckAck()) { I2C_Stop(); return 0; } I2C_SendByte(dat); if(!I2C_CheckAck()) { I2C_Stop(); return 0; } I2C_Stop(); return 1; }

5. 系统调试与优化

5.1 常见问题排查

  • 无应答信号:检查地址匹配、上拉电阻、电源电压
  • 数据错误:调整延时参数,确保时序满足规范
  • 总线冲突:确认从机在非通信时段释放SDA线

5.2 性能优化建议

  • 使用定时器产生精确延时替代delay_us()
  • 添加CRC校验提高通信可靠性
  • 实现超时机制避免死锁
bit I2C_CheckAck() { unsigned int timeout = 1000; SDA = 1; // 释放总线 SCL = 1; while(SDA && timeout--) delay_us(1); SCL = 0; return (timeout > 0); }

6. 完整应用示例

实现一个简单的温度监控系统,主机定期读取从机采集的数据:

从机程序片段

void main() { unsigned char temp_data = 0; while(1) { if(I2C_CheckStart()) { if(I2C_SlaveReceive() == SLAVE_ADDR_W) { I2C_SendAck(); // 处理写操作... } else if(I2C_SlaveReceive() == SLAVE_ADDR_R) { I2C_SendAck(); I2C_SlaveSend(temp_data++); // 模拟温度变化 } while(!I2C_CheckStop()); // 等待停止信号 } // 其他任务... } }

主机程序片段

void main() { unsigned char recv_data; while(1) { if(I2C_ReadByte(0x00, &recv_data)) { printf("Current Temp: %d\n", recv_data); } delay_ms(1000); } }
http://www.jsqmd.com/news/641365/

相关文章:

  • 手把手教你用KAT-Coder-Pro V1打造小红书爆款卡片生成器(附开源代码)
  • 2026年系留无人机电源模块厂家推荐:系留无人机机载电源/地面供电箱/FC100系留/M400系留/中继系统,专业供电解决方案深度解析 - 品牌推荐用户报道者
  • SpringCloud 实战落地:可观测性建设(SkyWalking + Prometheus + Grafana)从 0 到 1 生产级部署
  • React/Promise 函数库深度解析:all、race、any 的巧妙应用
  • 2026年萃取槽厂家实力推荐:镍钴/稀土/铜/工业/沉锂母液萃取槽,专业定制与高效分离技术解析 - 品牌推荐用户报道者
  • 【数电实战】Verilog HDL实现数码管动态扫描与学号显示优化
  • Java大厂面试场景:从Spring Boot到微服务的技术问答
  • GD32E230C8T6开发板从零搭建工程框架【避坑指南】
  • 从心理学到AGI:深度解析共情的双通路模型及其对智能体设计的启示
  • 第六章 volatile 与 JMM
  • 网安毕设--python漏扫工具
  • 【 LangChain v1.2 入门系列教程】【一】开篇入门 | 从零开始,跑通你的第一个 AI Agent
  • Flutter 2026:从跨平台UI到AI原生全栈开发平台的蜕变
  • ANSYS/Maxwell 电力电子电感仿真入门的入门
  • windows11系统更新完全-会显示“你使用的是最新版本”-代表目前没有需要更新的漏洞
  • 2026年离心萃取系统厂家推荐:连续化水洗/液液分离/多级逆流离心萃取设备专业解析 - 品牌推荐用户报道者
  • 清音听真Qwen3-ASR-1.7B效果惊艳:古诗词吟诵→平仄识别+注释关联+作者生平自动补充
  • 多模态大模型持续学习必须攻克的4道生死关(数据异构性、模态时序错位、知识固化率、评估不可比性):一线团队压箱底调参矩阵首次公开
  • AI工程范式的又一次演进:Harness Engineering
  • 学习笔记2:线性回归
  • 如何将wx_calendar与原生日期选择器完美集成:提升小程序用户体验的终极指南
  • AQATrack开源模型探索
  • 开源贡献者的困境:用爱发电能持续多久?
  • 如何零安装体验Windows 12网页版:5分钟快速上手指南
  • RTX 4090D镜像部署教程:PyTorch 2.8配置gradio快速搭建模型演示界面
  • 收藏备用!小白程序员必看的大模型应用学习路线(附实操方向)
  • Linux系统运维相关命令实践(二)
  • 从零开始:Vivado与SDK协同构建ZYNQ嵌入式系统
  • 2026年实验室装修工程公司推荐:专业设计施工与恒温恒湿/洁净室/生物安全实验室建设服务 - 品牌推荐用户报道者
  • 本地系统对接大模型智能体的若干尝试