在51单片机上实现I2C通信

51单片机---I2C通信协议(含源码,小白可入) I2C的相关概念,对于I2C的物理层以及协议层进行了详细的讲解,特别是对于使用I2C时的电路与时序进行了每一步的深入讲解;还借助AT24C02进行了相关的实验实现 阅读详情

在51单片机上实现I2C通信

代码较复杂,跟着老师来都会比较混乱

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char

sbit dula = P2^6;
sbit wela = P2^7;
sbit SCL = P2^1;
sbit SDA = P2^0;

void time0Init();
void display(uchar);
void delayms(uchar);
void delay5us();
void I2C_Stop();
void I2C_Start();
void I2CSendByte(uchar);

uchar count1,num;
uchar code SMGwei[] = {0xfe,0xfd,0xfb};
uchar code SMGduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
bit ACKflag;        //声明ACKflag 为字节变量
/*I2C通信初始化*/
void I2C_Start()        //起始信号
{
    SCL = 1;
    SDA = 1;
    delay5us();
    SDA = 0;
    delay5us();
}
void I2C_Stop()         //停止信号
{
    SCL = 0;
    SDA = 0;
    SCL = 1;
    delay5us();
    SDA = 1;
    delay5us();
}
/*I2C应答和非应答*/

//I2C主机读从机应答
bit ReadACK()
{
    SCL = 0;
    SCL = 1;
    delay5us();
    if(SDA)//非应答
    {
        SCL = 0;
        return (1);
    }
    else//应答
    {
        SCL = 0;
        return(0);
    }
}
//I2C主机发送应答
void sendACK(bit i)
{
    SCL = 0;
    if(i)
        SDA = 1;
    else
        SDA = 0;
    SCL = 1;
    delay5us();
    SCL = 0;
    SDA = 1;    //释放数据总线
}
void At24c02Write(uchar adress,DAT)
{
    I2C_Start();
    /*发送器件地址 + Write(0)*/
    I2CSendByte(0xA0 + 0);
    /*读是否应答*/
    if(ReadACK())   //若为1 从机没有应答
        ACKflag = 1;        //无应答
    else
        ACKflag = 0;        //应答

    /*写入首地址(放在256个容器中的哪一个)*/
    I2CSendByte(adress);
    /*读是否应答*/
    if(ReadACK())   //若为1 从机没有应答
        ACKflag = 1;        //无应答
    else
        ACKflag = 0;        //应答
    I2CSendByte(DAT);
    /*读是否应答*/
    if(ReadACK())   //若为1 从机没有应答
        ACKflag = 1;        //无应答
    else
        ACKflag = 0;        //应答
    I2C_Stop();

}
uchar I2cReadByte()
{
    uchar j,DAT;
    for(j = 0;j<8;j++)
    {
        DAT <<=1;
        SCL = 0;
        SCL = 1;
        if(SDA)
            DAT |= 0X01;
    }
    return (DAT);
}
uchar At24c02Read(uchar adress)
{
    uchar DAT;
    I2C_Start();
    /*发送器件地址 + Write(0)*/
    I2CSendByte(0xA0 + 0);
    /*读是否应答*/
    if(ReadACK())   //若为1 从机没有应答
        ACKflag = 1;        //无应答
    else
        ACKflag = 0;        //应答

    /*写入首地址(放在256个容器中的哪一个)*/
    I2CSendByte(adress);
    ReadACK();//不管应不应答
    I2C_Start();
    /*从机地址+1*/
    I2CSendByte(0xA0 + 1);
    if(ReadACK())   //若为1 从机没有应答
        ACKflag = 1;        //无应答
    else
        ACKflag = 0;        //应答
    DAT = I2cReadByte();      //读一字节
    sendACK(1);
    I2C_Stop();
    return (DAT);
}
void I2CSendByte(uchar DAT)      //发送一个字节
{
    uchar i;
    for(i = 0;i < 8; i++)
    {
        SCL = 0;        //拉低时钟线才能允许数据变化
        if(DAT & 0X80)
            SDA = 1;
        else
            SDA = 0;
        SCL = 1;
        DAT <<= 1;
    }
    SCL = 0;
    SDA = 1;//释放数据总线
}
/*数码管显示函数*/
void display(uchar num)
{
    static uchar wei;
    P0 = 0xff;
    wela = 1;
    P0 = SMGwei[wei];
    wela = 0;
    switch(wei)
    {
        case 0: dula = 1; P0 = SMGduan[num/100];    dula =0; break;
        case 1: dula = 1; P0 = SMGduan[num%100/10]; dula =0; break;
        case 2: dula = 1; P0 = SMGduan[num%10];     dula =0; break;
    }
    P0 =0xff;
    wei++;
    if(wei == 3)
    {
        wei = 0;
    }
}
/*time0定时器初始化函数*/
void time0Init()        //1MS
{
    TR0 = 1;
    TMOD |= 0X01;
    TH0 = 0x0F0;
    TL0 = 0x60;
    EA = 1;
    ET0 = 1;
}
/*time0定时器中断函数*/
void time0() interrupt 1
{
    TF0 = 0;
    TH0 = 0x0F0;
    TL0 = 0x60;
    display(num);
}
/*1.延时函数    2.延时5微秒函数*/
void delayms(uchar xms)
{
    uchar i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}
void delay5us()
{
    _nop_();    //延时5微妙
}
/*主函数*/
void main()
{
    time0Init();
    EA = 0;     //屏蔽中断
    At24c02Write(3,258);
		delayms(5);
    num = At24c02Read(3);
    if(!ACKflag)
    {
        P1 = 0;
    }
    else
    {
        P1 = 0xff;
    }//若应答则P1口上的全部灯亮
    EA = 1;     //开中断
    while(1);   //等待中断发生
}
51单片机I2C总线代码 I2C总线相关函数: void I2Cstart()//开始标志 { SDA=1; SCL=1; SDA=0; delay1ms(4); SCL=0; delay1ms(4); } void I2Cstop()//结束标志 { SCL=0; delay1ms(4); SDA=0; delay1ms(4); SCL=1; delay1ms(4); SDA=1; del 阅读详情

相关推荐

c51-i2c协议代码实现

1. I2C发送和接收位数据格式时序图 I2C在通信的过程中,在接收数据时,由主机对时钟线(SCL)进行控制,而从机对数据线(SDA)进行控制,这时主机要释放数据线(SDA),从机才能操作 1.1 启动信号(S) SDA,SCL都处于高电平状态,持续时间需大于4.7us ; 在SCL处于高电平阶段,将SDA拉到低电平阶段,SDA低电平阶段持续时间需大于4.7

YaoKunJie的博客 4446

51单片机:I2C通信

51单片机I2C通信,断电存储数据。51芯片与AT24C02通信原理及代码实现I2C是同步通信的两段式串行总线,一根SCL时钟线,一根SDA数据线。接口线少,控制方式简单,器件封装形式小,通信速率高,硬件实现简单,可扩展性强。IIC通信是一种两段总线式同步通信协议,AT24C02是一种使用IIC协议的,可断电存储的元器件。不要将IIC通信协议和AT24C02混为一谈。代码文件太多,后续将上传至github中。httpshttpshttpshttpshttpshttpshttps。...

young_monkeysun的博客 5876

51单片机软件模拟I²C通信原理与驱动实现

I²C是一种广泛应用的双线同步串行总线协议,其核心在于严格的时序控制与开漏总线电气特性。理解SCL/SDA的电平翻转逻辑、起始/停止条件、ACK/NACK交互机制,是掌握嵌入式外设通信的基础。在无硬件I²C模块的MCU(如经典51单片机)上,必须通过GPIO精确延时模拟物理层行为,这要求开发者深入掌握机器周期、汇编级延时、IO方向动态切换等底层技术。该方法虽增加开发复杂度,却带来更强的可控性与调试透明度,广泛应用于EEPROM读写、传感器配置、OLED显示等低速可靠通信场景。本文聚焦51平台,详解软件模拟I

weixin_42174098的博客 42

嵌入式单片机基础篇(三十三)之I2C通信以及51单片机读写字符串利用LCD12864显示程序

I2C通信以及51单片机读写字符串利用LCD12864显示程序 #include <reg51.h> #include <intrins.h> //包含_nop_()函数定义的头文件 #define READCOMDE 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define WRITECOMDE 0xa0 // 器件地址以及写入操作,0xa1即为1010 0000B #define uchar unsigned

lostlll的博客 1079

51单片机I²C模拟通信的五步状态机实现

I²C总线是一种基于开漏结构、依赖精确时序与主从握手的同步串行通信协议,其核心在于起始信号、地址寻址、ACK/NACK应答、数据传输和停止信号构成的强约束状态迁移过程。理解SCL/SDA电气特性、上拉电阻匹配、信号上升时间及GPIO模拟时序精度,是实现可靠通信的基础。在资源受限平台如51单片机中,软件模拟I²C(Bit-Banging)必须严格遵循协议物理层规范,尤其关注START/STOP生成条件、ACK采样时机与总线空闲检测等关键环节。该机制广泛应用于EEPROM读写、传感器配置、多设备级联等嵌入式场景

weixin_42174098的博客 38

51单片机实现I2C通信与EEPROM读写操作

51单片机是一种经典的微控制器,因其简单的结构和广泛的资料支持,而广泛应用于教育、工业控制和嵌入式系统开发中。51单片机采用Intel 8051架构,具备基本的处理功能,能够运行简单的嵌入式应用程序。EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种可以通过电信号进行擦除和编程的非易失性存储器。与传统存储器相比,EEPROM可以在不通电的情况下长期保持数据,这对于需要数据持久化的应用来说至关重要。

weixin_42234168的博客 810

51单片机I2C通信原理详解(附代码详解)

I2C通信原理、E2prom

m0_73931287的博客 5905

51单片机实现触摸屏I2C通信测试项目源码

htmltable {th, td {th {pre {简介:51单片机因其低功耗、低成本和高可靠性,广泛应用于嵌入式系统中。本资源“51单片机触摸I2C协议测试源代码.rar”提供了一个完整的实践案例,展示如何通过I2C协议实现51单片机与触摸屏的数据交互。项目涵盖触摸屏技术(电阻式或电容式)原理、I2C通信协议的软件实现,以及关键的驱动函数设计,如初始化、数据收发、命令发送和错误处理。

weixin_42298254的博客 778

树莓派与Arduino通过IIC传递字符串

1,树莓派配置成IIC主机,请参阅有关资料   2,编写并上传Arduino发送信息的程序     #include &lt;Wire.h&gt; #define SLAVE_ADDRESS 0x05    //此处为IIC终端机的编号,因为IIC是可以连多个从机的,用编号区分 String msg = ""; void sendData() {   Wire.write(msg.c_...

wzxxtt62267018的博客 2428

51单片机控制AT24C02 EEPROM的I²C通信程序开发

EEPROM(电可擦可编程只读存储器)是一种非易失性存储器,它允许数据在断电后仍然被保持。与传统的ROM不同,EEPROM可以在线擦写和编程,而不需要额外的编程设备。这种特性使得EEPROM在需要频繁更新数据的应用中非常有用,比如在设备的固件更新、配置数据存储等方面。51单片机是基于Intel 8051微控制器架构的一种8位微控制器,广泛用于工业控制、嵌入式系统设计等领域。其核心组件包括中央处理单元(CPU)、存储器(包括程序存储器和数据存储器)、I/O端口、定时/计数器、串行通信接口和中断系统等。

weixin_35749786的博客 722

51单片机模拟IIC通信技术详解

I²C(Inter-Integrated Circuit)协议,也被称作I2C或IIC(读作“I squared C”或“I-two-C”),是一种由荷兰半导体公司飞利浦在1982年开发的多主机串行通信总线。它最初被设计用于连接低速外围设备到处理器或微控制器,以及在集成电路内部实现芯片间的连接。I²C的提出旨在简化电路设计,减少连线数量。其特点是只需两根线路(串行数据线SDA和串行时钟线SCL),即可实现多个从设备与一个或多个主设备之间的通信。

weixin_35749786的博客 1087

51单片机I2C

@param AckBit 应答位,0为应答,1为非应答。* @retval 接收到的应答位,0为应答,1为非应答。* @brief I2C发送一个字节。* @brief I2C接收一个字节。* @brief I2C接收应答位。* @brief I2C发送应答。* @brief I2C开始。* @param 无。* @retval 无。* @param 无。* @retval 无。* @retval 无。* @param 无。* @retval 无。* @param 无。

m0_66516574的博客 360

51单片机SMBus通信实现完整项目包

51单片机采用经典的冯·诺依曼架构,集成CPU、RAM、ROM、定时器/计数器及多个GPIO端口于单一芯片中,具备高可靠性和实时控制能力。其标准I/O口为准双向结构,需通过上拉电阻配置实现开漏输出,以满足I2C/SMBus总线的电气要求。由于多数51核MCU未内置专用I2C硬件模块,SMBus通信通常依赖软件模拟时序完成。上述宏定义展示了GPIO引脚的抽象映射方式,便于在等函数中精准控制时序。通过合理设置延时函数(如nop()

weixin_29317963的博客 931

51单片机模拟I2C从机资源文件:高效利用普通IO口实现I2C通信

51单片机模拟I2C从机资源文件:高效利用普通IO口实现I2C通信 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在嵌入式系统设计中,I2C(Inter-Integrated Circuit)通信因其高效的数据传输和简洁的硬件接口而被广泛应用。然而,对于一些资源有限的51单片机系统,I2C接口可能并不直接支持。本项目的核心功能就是利用51单片机的普通IO口模拟I2C从...

gitblog_06716的博客 377

51单片机 普通IO口模拟IIC(I2C)接口通讯的程序代码

本文为51单片机 普通IO口模拟IIC(I2C)接口通讯的程序代码,希望对你的学习有所帮助。

conda环境的复制、备份操作

请确保将 source_env 替换为你要复制的现有环境的名称,并将 target_env 替换为你要创建的新环境的名称。要备份一个Conda虚拟环境,你需要将环境的配置信息和依赖包列表保存起来,以便在需要的时候能够重新创建相同的环境。要将现有的 conda 环境复制为其他环境,可以使用 conda create 命令并克隆已存在的环境。

Dollhan的博客 3772

嵌入式单片机基础篇(三十二)之I2C通信以及51单片机程序

I2C通信以及51单片机程序 I2C总线是PHLIPS公司推出的一种双向串行总线,只有两根双向信号线。一根是数据/地址线SDA,另一根是时钟线SCL,半双工。 这两根信号线上挂载着主机与从机,一般来说,谁控制SCL信号线,谁就是主机。 ***1、空闲状态:***两根总线接上拉电阻,且都为高电平时,说明两根总线为空闲状态。 2、8位数据传输: 规则: I2C总线进行数据传送时,SCL为高电平期间,SDA上的数据必须保持稳定,只有在SCL上的信号为低电平期间,SDA上的高电平或低电平状态才允许变化。 就看这张

lostlll的博客 2731

一步步指导:在Chrome中安装Vue插件vue-devtools

Vue.js是现代Web开发中最流行的前端框架之一,它以其轻量级、高性能和易于理解的设计理念受到开发者的喜爱。为了更高效地开发和调试Vue应用,Vue.js官方提供了一个强大的开发工具——vue-devtools。

小透明的博客 5619

i2c总线与51单片机(附时序配置代码)

**SDA**和**SCL**引脚:连接到51单片机的任意两个IO口(如P2.0和P2.1)。**发送ACK/NACK**:接收方在第9个时钟周期拉低SDA(ACK)或保持高电平(NACK)。- **I2C设备**:例如AT24C02(EEPROM)、MPU6050(加速度计)等。1. **逻辑分析仪**:观察SDA和SCL波形,检查起始/停止条件、ACK/NACK是否正常。2. **串口打印**:在读写过程中通过串口输出调试信息(如发送的地址、数据)。// 发送器件地址(写模式)

2401_87926724的博客 1602

电力电子课设救星:用Simulink实现Buck变换器双闭环控制(PID调参技巧)

本文是电力电子课程设计的实用指南,详细讲解如何利用Simulink仿真平台实现Buck变换器的电压电流双闭环控制。文章核心聚焦于PID参数整定的实战技巧,提供了从手动调试口诀到MATLAB脚本自动优化的完整方案,旨在帮助学生高效完成课设,深入理解闭环控制原理并生成专业报告。

weixin_29179311的博客 296

单细胞转录组肿瘤细胞识别:inferCNV与CopyKAT实战解析

单细胞转录组测序(scRNA-seq)是解析肿瘤微环境的重要技术,但如何从海量细胞中准确区分恶性细胞与正常细胞,始终是数据分析的关键难题。传统marker注释在异质性肿瘤中常失效,而基于拷贝数变异(CNV)的推断方法为这一问题提供了更稳健的解决路径。CNV通过检测染色体大片段的增益或缺失,可在无先验标记的情况下识别恶性细胞,尤其适合实体瘤研究。inferCNV利用染色体滑动窗口分析相对表达量,生成直观的CNV热图;CopyKAT则结合高斯混合模型对每个细胞直接分类,输出肿瘤/正常/非整倍体标签。本文从原理出

weixin_31236101的博客 250

(十)I2C通信

本节我们来完成I2C的内容的学习,上一节我们了解的是串口通信,主要是我们的电脑和51单片机的通信,而这一节我们介绍51单片机和他的外设的通信,我们通过向E2prom里面读写一个字节数据来完成本实验。 1. I2C总线 I2C总线是由于飞利浦公司开发的两线式串行总线,用于连接微控制器及其外围设备,I2C总线只有两根双向数据线,一根SDA数据线,数据线用来表示数据,一根SCL时钟线,用来同步时钟。在一个I2C通信线中,可连接多个I2C设备,每个连接到总线的设备都有一个独立的地址,主机可以利用...

qq_39388583的博客 1557

深度学习之Pytorch---本人踩过的坑(报错总结)第十篇

深度学习之Pytorch安装时遇到的问题—本人踩过的坑(报错总结) 报错一:pip install torchvision 出现“由于目标计算机积极拒绝,无法连接”的问题 解决方案:找到自己浏览器的工具或选项,我的是火狐,具体解决方案如下图 然后找到桌面左下角,点击搜索internet,然后点击internet选项 最后回到Anaconda Prompt命令行输入pip install...

qq_41570307的博客 1914
上一篇: 在51单片机上实现串口通信代码
下一篇: 51单片机上实现ADDA以及模拟PWM信号控制小灯
knbroken
博客等级 码龄8年 104粉丝 9原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值