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

AT24C02存储与读取数据

1.前言

项目资源:

https://download.csdn.net/download/YLG_lin/86541001

1.1实验现象

在LCD1602液晶屏上显示一个无符号整型数字,按下K1按键数字减一,按下K2数字加一,按下K3数字向AT24C02写入该数据,断电重启后按下K4可以从AT24C02中读取该数据。

1.2 AT24C02介绍

AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息
存储介质:E2PROM
通讯接口:I2C总线
容量:256字节

2. 相关程序及解释

2.1 引脚定义

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;

2.2 I2C起始信号

起始条件:SCL高电平期间,SDA从高电平切换到低电平

空闲状态下 SDA与SCL默认置高电平;值得注意的是在应答之后SDA有可能为高电平也有可能为低电平(复合格式如下图),所以开始时要置高电平;

void I2C_Start()
{
	I2C_SDA=1;
	I2C_SCL=1;
	I2C_SDA=0;
	I2C_SCL=0;
}

 2.3 I2C停止信号

终止条件:SCL高电平期间,SDA从低电平切换到高电平

void I2C_Stop()
{
	I2C_SDA=0;
	I2C_SCL=1;
	I2C_SDA=1;
}

 2.4 I2C主机向从机发送一个字节数据

SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

void I2C_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		I2C_SDA=Byte&(0x80>>i);
		I2C_SCL=1;
		I2C_SCL=0;
	}
}

2.5 I2C主机接收一个字节数据

SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

unsigned char I2C_ReceiveByte(void)
{
	unsigned char i,Byte=0x00;
	I2C_SDA=1;
	for(i=0;i<8;i++)
	{
		I2C_SCL=1;
		if(I2C_SDA){Byte|=(0x80>>i);}
		I2C_SCL=0;
	}
	return Byte;
}

2.6 发送应答

发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

void I2C_SendAck(unsigned char AckBit)
{
	I2C_SDA=AckBit;
	I2C_SCL=1;
	I2C_SCL=0;
}

2.7 接收应答

接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

unsigned char I2C_ReceiveAck(void)
{
	unsigned char AckBit;
	I2C_SDA=1;
	I2C_SCL=1;
	AckBit=I2C_SDA;
	I2C_SCL=0;
	return AckBit;
}

 2.8 主机向从机发数据(多字节)

void AT24C02_WriteByte(unsigned char WordAddress,Data)
{
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_SendByte(Data);
	I2C_ReceiveAck();
	I2C_Stop();
}

2.9 从机向主机发数据(多字节)

unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{
	unsigned char Data;
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS);
	I2C_ReceiveAck();
	I2C_SendByte(WordAddress);
	I2C_ReceiveAck();
	I2C_Start();
	I2C_SendByte(AT24C02_ADDRESS|0x01);
	I2C_ReceiveAck();
	Data=I2C_ReceiveByte();
	I2C_SendAck(1);
	I2C_Stop();
	return Data;
}

3.0 main.c

void main()
{
	LCD_Init();
	LCD_ShowNum(1,1,Num,5);
	while(1)
	{
		KeyNum=Key();
		if(KeyNum==1)	//K1按键,Num自增
		{
			Num++;
			LCD_ShowNum(1,1,Num,5);
		}
		if(KeyNum==2)	//K2按键,Num自减
		{
			Num--;
			LCD_ShowNum(1,1,Num,5);
		}
		if(KeyNum==3)	//K3按键,向AT24C02写入数据
		{
			AT24C02_WriteByte(0,Num%256);
			Delay(5);   //延迟5ms,查芯片手册可知
			AT24C02_WriteByte(1,Num/256);
			Delay(5);
			LCD_ShowString(2,1,"Write OK");
			Delay(1000);
			LCD_ShowString(2,1,"        ");
		}
		if(KeyNum==4)	//K4按键,从AT24C02读取数据
		{
			Num=AT24C02_ReadByte(0);
			Num|=AT24C02_ReadByte(1)<<8;
			LCD_ShowNum(1,1,Num,5);
			LCD_ShowString(2,1,"Read OK ");
			Delay(1000);
			LCD_ShowString(2,1,"        ");
		}
	}
}

相关文章:

  • Linux高级编程--gdb调试
  • 家校协同小程序实战教程
  • 沉睡者C - 想要通过网上来赚钱,悟性很重要
  • Java集合面试小结(2)
  • 【uiautomation】微信群发消息,可发送文本 文件
  • 【network】windows 获取Adapter 名称
  • Python 基础学习
  • 网课搜题接口公众号搭建详细步骤
  • 继承的使用以及super关键字和重写以及Object类
  • Spring中的AOP翻转的使用与在事务管理中的表现
  • DataOps: A New Discipline 数据治理的下一步
  • 一些现代 Javascript 技巧
  • Java学习 --- 类方法(静态方法)
  • 网课答案搜题方法详细步骤
  • promise函数
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【面试系列】之二:关于js原型
  • go语言学习初探(一)
  • java8 Stream Pipelines 浅析
  • Less 日常用法
  • Object.assign方法不能实现深复制
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Python语法速览与机器学习开发环境搭建
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 读懂package.json -- 依赖管理
  • 关于 Cirru Editor 存储格式
  • 关于for循环的简单归纳
  • 前端之React实战:创建跨平台的项目架构
  • 浅谈web中前端模板引擎的使用
  • 实战|智能家居行业移动应用性能分析
  • 试着探索高并发下的系统架构面貌
  • 数据可视化之 Sankey 桑基图的实现
  • 微服务核心架构梳理
  • 硬币翻转问题,区间操作
  • 智能网联汽车信息安全
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #Linux(权限管理)
  • #NOIP 2014# day.2 T2 寻找道路
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十)c52学习之旅-定时器实验
  • (转) 深度模型优化性能 调参
  • (转)Oracle存储过程编写经验和优化措施
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .md即markdown文件的基本常用编写语法
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .Net各种迷惑命名解释