实验开发板为CT107D蓝桥官方板,编译环境为MDK5

由蓝桥官方驱动改写

AT24C02:

AT24C02为地址可编程器件(CT107D可编程位均为0),因此可于总线上挂载多个相同的器件。

最后一位为读写位(0写1读)

IIC的开始和关闭时序图:

  • 开始:数据线拉高,时钟拉高,数据线拉低,使产生下降沿。
  • 结束:数据线拉低,时钟拉高,数据线拉高,使产生上升沿。

(具体操作请读代码)

IIC的读和写时序图:

  • 写:使时钟线产生上升沿信号,SDA发送1位数据
  • 读:使时钟线产生下降沿信号,SDA接受1位数据(被拉高或拉低)

(操作请读代码)

IIC等待应答(写完一个字节)和发送应答(读完一个字节)(0应答1非应答):

说白了

  • 等待应答就是读完一个字节后发送(写)一位是否继续读的指令;
  • 发送应答就是写完一个字节后等待(读)一位器件是否接收到的指令;

(操作请读代码)

AT24C02(页)写字节(内存是分为多页管理的AT24C02是一页8字节)

  • 启动IIC
  • 写入24C02地址加上一位写指令
  • 等待/判断应答
  • 写入目标内存地址
  • 等待应答(基本可以保证写入的情况不用循环判断)
  • 单字节读写模式:1、写入目标字节;2、等待应答;3、关闭总线。
  • 页写模式:1、写入目标字节2、传回应答到页写函数中3、根据要写的字节数目判断是否关闭总线(结束写)

AT24C02(页)读字节:

  • 启动IIC
  • 写入24C02地址加上一位读指令
  • 等待/判断应答
  • 写入目标内存地址
  • 等待应答(基本可以保证写入的情况不用循环判断)
  • 单字节读写模式:1、读取目标字节;2、写入非应答;3、关闭总线。
  • 页写模式:1、读取目标字节;2、页写函数根据读取长度中传出一个应答或者非应答;3、结束后关闭总线(结束读)

PS:页读或页写一页内存到达边界后就跳出函数,由于没有写自动换页的代码没办法连续写多页,需要在主函数中调控

iic.h:

#ifndef _IIC_H
#define _IIC_H#include "config.h"void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void); unsigned char IIC_readbyte(unsigned char addr,u8 len);
bit IIC_writebyte(unsigned char addr,unsigned char dat);
void EE_Write(u8 *buf, u8 addr, u8 len);
void EE_Read(u8 *buf, u8 addr, u8 len);#endif

iic.c:

/*程序说明: IIC总线驱动程序软件环境: Keil uVision 4.10 硬件环境: CT107单片机综合实训平台 8051,12MHz日    期: 2011-8-9
*/#include  "iic.h" #define DELAY_TIME 11
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 *///void somenop(unsigned char i)
//{
//    do{_nop_();}
//    while(i--);
//}
//总线启动条件
void IIC_Start(void)
{SDA = 1;SCL = 1;somenopSDA = 0;somenopSCL = 0;
}//总线停止条件
void IIC_Stop(void)
{SDA = 0;SCL = 1;somenopSDA = 1;somenop
}//发送应答
void IIC_SendAck(bit ackbit)
{SCL = 0;SDA = ackbit;                    // 0:应答,1:非应答somenopSCL = 1;somenopSCL = 0; SDA = 1;somenop
}//等待应答
bit IIC_WaitAck(void)
{bit ackbit;SCL  = 1;somenopackbit = SDA;SCL = 0;somenopreturn ~ackbit;
}//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){SCL  = 0;somenopif(byt & 0x80) SDA  = 1;else SDA  = 0;somenopSCL = 1;byt <<= 1;somenop}SCL  = 0;
}//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{unsigned char i, da;for(i=0; i<8; i++){   SCL = 1;somenopda <<= 1;if(SDA) da |= 1;SCL = 0;somenop}return da;
}/******************FOR_24C02****************/
unsigned char IIC_readbyte(unsigned char addr,u8 ack){unsigned char dat;do{IIC_Start();IIC_SendByte(SlaveAddrW);//发送器件地址+写IIC_Stop();}while(!IIC_WaitAck());//检查是否收到应答IIC_SendByte(addr);//发送内存区域地址IIC_WaitAck();IIC_Start();IIC_SendByte(SlaveAddrR);//发送器件地址+读IIC_WaitAck();//检查是否收到应答dat=IIC_RecByte();//读取待返回的数据IIC_SendAck(ack);//应答读取结束(1)继续(0)//IIC_Stop();return dat;
}
bit IIC_writebyte(unsigned char addr,unsigned char dat){bit ack ;do{IIC_Start();IIC_SendByte(SlaveAddrW);//发送器件地址+写IIC_Stop();}while(!IIC_WaitAck());//检查是否收到应答IIC_SendByte(addr);IIC_WaitAck();//写入内存地址   IIC_SendByte(dat);ack = IIC_WaitAck();//IIC_Stop();//写入一个字节的数据return ack;
}void EE_Write(u8 *buf, u8 addr, u8 len)
{//EEPROM页写u8 ack = 0;while((len > 0) && ack == 0){len --;ack = IIC_writebyte(addr ++, *(buf ++));if((addr & 0x07) == 0){break;}       }IIC_Stop();
}
void EE_Read(u8 *buf, u8 addr, u8 len)
{//EEPROM页读while(len > 1){*buf = IIC_readbyte(addr ++, 0);buf ++;if((addr & 0x07) == 0){break;}}*buf = IIC_readbyte(addr ++, 1);IIC_Stop();
}

PS:官方的延时又又又又又又不对,官方的为89C52RC的延时,somenop中含有应30个nop。

【蓝桥杯单片机】IIC通讯协议与EEPROM(AT24C02)(官方驱动源码改写)相关推荐

  1. 【蓝桥杯单片机】DS1302时钟芯片+DS18B20单总线温度传感器(官方驱动源码改写)

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5 采用蓝桥官方驱动改写 目录 一.DS1302时钟芯片 二.DS18B20温度传感器 一.DS1302时钟芯片 CE 复位脚 I/O 数据输入/输 ...

  2. 【蓝桥杯单片机】超声波模块(测距原理,驱动方式)

    实验开发板为CT107D蓝桥官方板,编译环境为MDK5 超声波探头测距原理: 发射头发射超声波,遇到障碍物后返回,接收探头接受到返回信号. 两个动作产生的时间差可以是我们根据声音在空气中传播的速度来( ...

  3. 蓝桥杯——单片机赛道

    蓝桥杯--单片机赛道 本人蓝桥小白阿凡,第一次参加比赛,准备在这个版块分享一下自己的一些经验hhh. (先写省赛系统试题,后面会慢慢补上前面的一些内容,因为快要比赛啦啦啦,可恶!) 文章目录 蓝桥杯- ...

  4. 蓝桥杯单片机(十三)AT24C02(EEPROM)

    AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗.AT24C02有一个16字节页写缓冲器.该器件通过IIC ...

  5. 蓝桥杯单片机组——榨干选手资源包(芯片数据手册)

    文章目录 前言 DS18B20 原理图 1-Wire协议简介 赛场技巧 DS1302 原理图 SPI协议简介 赛场技巧 AT24C02 原理图 IIC协议简介 赛场技巧 PCF8591 原理图 赛场技 ...

  6. STM32G4 蓝桥杯嵌入式 IIC AT24C02储存器

    此模块是我初次接触到数据手册,也是第一次接触到通讯协议,所以在b站录有视频,包括IIC的原理,以及在蓝桥杯竞赛板上实现对EEPROM的读写,感兴趣可移步: STM32G431 蓝桥杯嵌入式 AT24C ...

  7. 【蓝桥杯单片机(24)】历届单片机客观题及答案解析

    目录 考前冲刺,专栏完结篇 ## 推荐链接: 推荐视频–小蜜蜂老师讲解 赛点资源包下载,提取码:brno 三极管基本知识总结 运算放大电路的基础 第十三届蓝桥杯单片机官方直播课录屏 目录 一些刷题后的 ...

  8. 蓝桥杯省赛考点_【蓝桥杯单片机01】从历年决赛真题中寻找单片机常见的考点...

    [蓝桥杯单片机01]从历年决赛真题中寻找单片机常见的考点 广东职业技术学院  欧浩源 [第三届:门禁系统] 1.功能简述 "门禁系统"主要有两种工作模式: 模式1:7:00-22: ...

  9. 蓝桥杯单片机第四届省赛题详细讲解(模拟智能灌溉系统)

    看之前强烈建议先自己做一遍!!! 整个工程文件(有注释讲解) 网盘链接 先上演示效果 蓝桥杯单片机第五届模拟智能灌溉系统 首先依旧从赛题的系统框图开始讲起 首先需要做的是将系统框图里的各部分模块提前调 ...

最新文章

  1. 用js获取当前月份的天数
  2. 计算机学业测试答案解析,计算机测试题及答案.doc
  3. Python--MySql学习(10.30)
  4. CDOJ 28 补兵(kill)
  5. [ios] NSSet,NSMutableSet[zhuan]
  6. 前端代码编辑器 sublime text 4 for Mac v4.0(4114) 中文设置
  7. php微信支付回调验证
  8. vga分辨率与时序配置
  9. 像程序员一样思考——解决问题
  10. Nmap扫描工具介绍
  11. 怎么把一个PDF文件拆分成多个?
  12. 什么是重载?重载的作用?
  13. (转)五大常用算法:分治、动态规划、贪心、回溯和分支界定
  14. 文件上传漏洞攻击与防御
  15. php获取用户访问的dns,dnsproxy in php
  16. Please contact your system administrator. Add correct host key in /Users/***/.ssh/known_hosts
  17. oracle关于索引
  18. vlookup使用步骤_VLOOKUP函数的使用方法(入门级)
  19. CODESYS 赛搏机器智能MIC7001总线控制器+松下A6BE总线驱动器
  20. lookupedit可编辑可选择

热门文章

  1. Java 蓝桥杯 常用核心类
  2. 合肥师范学院计算机与技术,合肥师范学院计算机科学与技术系JAVA复习提纲
  3. scrapy爬虫循环抓取同一个url,避免同一URL使爬虫关闭
  4. Mac国内安装oh-my-zsh
  5. nodejs 遍历json数据_PostgreSQL 务实应用(四/5)JSON
  6. 错误: 无法生成项目输出组“内容文件来自WebApplication1(活动)”
  7. 线段树 B数据结构 牛客练习赛28
  8. python_day29_通过类创建多线程_队列
  9. Splay伸展树入门(单点操作,区间维护)附例题模板
  10. 1002.写出这个数