51单片机STC89C52RC——12.1 数据存储芯片AT24C02

目的/效果

利用存储芯片AT24C02存储数据,LCD1602显示存储的数据。

一,STC单片机模块

二,AT24C02存储芯片 

2.1 介绍

AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器,该器件通过IIC总线接口进行操作,有一个专门的写保护功能。

 

 

2.2 存储芯片分类

工作电压:1.8V~5.5V; 低功耗CMOS技术,

工作电流1mA,待机电流1uA;

应用在内部结构:128x8(1K),256x8(2K),512x8(4K),1024x8(8K),2048x8(16K);

二线串行接口,支持标准IIC通信协议;

双向数据传输协议; 兼容 400KHz传输速率(1.8V,2.5V,2.7V,3.6V);

支持硬件写保护功能;

擦出次数可达10000次;

存储数据时间超过100年 

2.3 内部结构

2.3.1 结构 

 

2.3.2 引脚定义

 

 

2.4 I2C总线

I2C总线(Inter IC BUS)是由Philips公司开发的一种通用数据总线 两根通信线:SCL(Serial Clock)、SDA(Serial Data)

同步、半双工,带数据应答

通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度

所有I2C设备的SCL连在一起,SDA连在一起

设备的SCL和SDA均要配置成开漏输出模式 SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题 

 

 

2.4.1 起始条件时序

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


/*** 函    数:I2C开始* 参    数:无* 返 回 值:无*/
void I2C_Start(void)
{I2C_SDA=1;I2C_SCL=1;I2C_SDA=0;I2C_SCL=0;
}

 

2.4.2 终止条件时序

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

 


/*** 函    数:I2C停止* 参    数:无* 返 回 值:无*/
void I2C_Stop(void)
{I2C_SDA=0;I2C_SCL=1;I2C_SDA=1;
}

2.4.3 发送一个字节时序

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

 


/*** 函    数:I2C发送一个字节* 参    数:Byte 要发送的字节* 返 回 值:无*/
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.4.4 接收一个字节时序

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

 


/*** 函    数:I2C接收一个字节* 参    数:无* 返 回 值:接收到的一个字节数据*/
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.4.5 发送应答时序

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


/*** 函    数:I2C发送应答* 参    数:AckBit 应答位,0为应答,1为非应答* 返 回 值:无*/
void I2C_SendAck(unsigned char AckBit)
{I2C_SDA=AckBit;I2C_SCL=1;I2C_SCL=0;
}

2.4.6 接收应答时序

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

 

 


/*** 函    数:I2C接收应答位* 参    数:无* 返 回 值:接收到的应答位,0为应答,1为非应答*/
unsigned char I2C_ReceiveAck(void)
{unsigned char AckBit;I2C_SDA=1;I2C_SCL=1;AckBit=I2C_SDA;I2C_SCL=0;return AckBit;
}

 2.4.7 读写总时序 

像谁发(写)什么数据

 

向谁收(读)什么数据

 

 2.5 AT24C02 读写操作

器件地址信息由"1"、"0"序列组成,前4位如图中所示,对于所有串行EEPROM都是一样的。对于24CO2/32/64,随后3位A2、A1和A0为器件地址位,必须与硬件输入引脚保持一致。对于24C04,随后2位A2和A1为器件地址位,另1位为页地址位。A2和A1必须与硬件输入引脚保持一致,而AO是空脚。

2.5.1 读数据操作

AT24C02的固定地址为1010,可配置地址本开发板上为000     所以SLAVE ADDRESS+W为0xA0,SLAVE ADDRESS+R为0xA1

#define AT24C02_ADDRESS		0xA0	//AT24C02地址

读出在WORD ADDRESS处的数据DATA


/*** 函    数:AT24C02读取一个字节* 参    数:WordAddress 要读出字节的地址* 返 回 值:无*/
unsigned char AT24C02_ReadByte(unsigned char WordAddress)
{unsigned char Data;I2C_Start();						//I2C开始I2C_SendByte(AT24C02_ADDRESS);		//发送AT24C02地址I2C_ReceiveAck();					//接收应答I2C_SendByte(WordAddress);			//发送要读出字节的地址I2C_ReceiveAck();					//接收应答I2C_Start();						//I2C开始I2C_SendByte(AT24C02_ADDRESS|0x01);	//发送读数据的请求I2C_ReceiveAck();					//接收应答Data=I2C_ReceiveByte();				//接收读取的数据I2C_SendAck(1);						//发送应答I2C_Stop();							//停止I2Creturn Data;
}

 

 

2.5.2 写数据操作

在WORD ADDRESS处写入数据DATA

/*** 函    数:AT24C02写入一个字节* 参    数:WordAddress 要写入字节的地址Data 要写入的数据* 返 回 值:无*/
void AT24C02_WriteByte(unsigned char WordAddress,Data)
{I2C_Start();					//I2C开始I2C_SendByte(AT24C02_ADDRESS);	//发送AT24C02地址I2C_ReceiveAck();				//接收应答I2C_SendByte(WordAddress);		//发送要写入字节的地址I2C_ReceiveAck();				//接收应答I2C_SendByte(Data);				//发送数据I2C_ReceiveAck();				//接收应答I2C_Stop();						//I2C停止
}

 

 

三,创建Keil项目

详细参考:51单片机STC89C52RC——创建Keil项目-CSDN博客

四,代码 

main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "Key.h"
#include "AT24C02.h"
#include "Delay.h" 
/*** 函    数:主函数* 参    数:无* 返 回 值:无*/
void mian()
{unsigned char KeyNum;	//按键值unsigned int Num;		//数据值(存储)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_ms(5);AT24C02_WriteByte(1,Num/256);Delay_ms(5);LCD_ShowString(2,1,"Write OK");Delay_ms(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_ms(1000);LCD_ShowString(2,1,"        ");}}
}

详细参考 Gitee 地址 STC89C52RC: 51单片机学习资料、AT24C02

五,代码编译、下载到51单片机

代码编译请参考

《51单片机STC89C52RC——代码编译-CSDN博客》

代码下载请参考

《51单片机STC89C52RC——STCAI-ISP代码下载-CSDN博客》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/36541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通讯录管理系统——查找联系人

功能描述&#xff1a;按照姓名查看指定联系人的信息 查看联系人实现步骤 1.封装查找联系人函数 2.测试查找指定联系人 一、封装查找联系人函数 实现思路&#xff1a;判断用户指定的联系人是否存在&#xff0c;如果存在&#xff0c;显示信息&#xff0c;不存在提示查无此人…

如何在FastAPI服务器中添加黑名单和白名单实现IP访问控制

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 添加黑名单功能步骤1:安装依赖步骤2:创建FastAPI应用步骤3:添加黑名单📝 添加白名单功能步骤1:创建白名单列表步骤2:添加白名单检查⚓️ 相关链接 ⚓️📖 介绍 📖 在现代网络应用开发中,为了增强…

C++【引用】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

进程间通信简介-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

进程间通信简介 进程间通信简介 进程间进程简称IPC(interprocess communication)&#xff0c;进程间通信就是在不同进程之间传递信息或交换信息 进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的…

武汉星起航:一站式服务,助力亚马逊卖家高效运营,实现收益飞跃

在跨境电商的浪潮中&#xff0c;武汉星起航电子商务有限公司以其独特的一站式跨境电商服务&#xff0c;为众多亚马逊卖家提供了强有力的支持&#xff0c;助力他们在不断发展的市场中脱颖而出&#xff0c;实现收益的大幅提升。 武汉星起航的一站式跨境电商服务&#xff0c;以其…

Python 爬虫:多进程,多线程爬虫<提高爬取效率>

关于多进程&#xff0c;多线程的知识&#xff0c;请自行查询资料补充 ~~~~~~~~~~~ 使用多进程&#xff1a; 在python中&#xff0c;使用多进程需要先导包&#xff1a; from threding import Threaddef work(name):for i in range(1000):print(f"我是线程&#xff1a;{n…

如何使用styled实现嵌套组件继承父组件Props以及样式定义

文章目录 前言案例举例1. 首先&#xff0c;在syled.tsx定义DemoBlock组件&#xff0c;并且使用内嵌组件2. 在页面中使用&#xff0c;传递属性 总结 前言 当使用styled-components将属性传递给嵌套组件时&#xff0c;可以通过将属性和样式定义应用于嵌套组件的父组件来实现。然…

JAVA医院绩效考核系统源码:三级公立医院绩效考核系统源码 可源码交付,支持二开

JAVA医院绩效考核系统源码&#xff1a;三级公立医院绩效考核系统源码 可源码交付&#xff0c;支持二开 医院绩效考核系统是一个集数据采集、分析、评估、反馈于一体的信息化工具&#xff0c;旨在提高医疗服务质量、优化资源配置、促进医院可持续发展。以下是对医院绩效考核系统…

Django靓号管理系统:实现Home页面

在本文中,我们将详细介绍如何在Django靓号管理系统中实现Home页面。Home页面是用户成功登录后看到的第一个页面,它应该提供一个友好的欢迎信息和系统的基本布局。 1. 更新 ​​urls.py​​ 首先,我们需要确保 ​​urls.py​​ 文件中包含了 Home 页面的 URL 配置: # url…

API接口知识小结

应用程序接口API&#xff08;Application Programming Interface&#xff09;&#xff0c;是提供特定业务输出能力、连接不同系统的一种约定。这里包括外部系统与提供服务的系统&#xff08;中后台系统&#xff09;或后台不同系统之间的交互点。包括外部接口、内部接口&#xf…

使用c++设计一个计算器

使用c设计一个简单的计算器&#xff0c;它支持不带括号的四则运算&#xff0c;计算器要满足先乘除后加减的规则 #include <iostream> #include <string> #include <vector> #include <sstream>// 定义运算符的优先级 int precedence(char op) {if (op…

Java Records: 简化数据携带类的利器

Java Records: 简化数据携带类的利器 引言 在 Java 14 中引入并在 Java 16 中成为正式特性的 record&#xff0c;是为了简化不可变数据携带类的创建。它极大地减少了样板代码&#xff0c;使得代码更加简洁和易读。本文将详细介绍 record 的用法和特点。 什么是 Record? re…

Lua 流程控制

Lua 流程控制 Lua 是一种轻量级的编程语言,通常用于嵌入应用程序中,提供灵活的扩展和定制功能。流程控制是编程语言的核心组成部分,它决定了程序执行的顺序和条件。在 Lua 中,流程控制主要通过条件语句、循环语句和函数调用实现。 条件语句 条件语句用于根据不同的条件执…

Java访问修饰符的区别

public&#xff1a;公开的&#xff0c;任何地方都可以访问。 protected&#xff1a;受保护的&#xff0c;同一个包中的类和所有子类(可跨包)可以访问。 private&#xff1a;私有的&#xff0c;只有在同一个类中可以访问。 默认&#xff08;无修饰符&#xff09;&#xff1a;包级…

ORBSLAM3_ROS_Ubuntu18_04环境搭建安装

orbslam3安装 ORB-SLAM3配置及安装教程&#xff08;2023.3&#xff09;_orbslam3安装-CSDN博客 换源&#xff0c;换成国内的 搜索software 安装工具 sudo apt install git sudo apt update sudo apt install gcc g cmake安装 cmake安装新版本 ubuntu20.04安装cmake详细…

转让无区域商业管理公司基本流程和要求

无区域公司转让的条件和要求取决于您的业务需求和目标。我们的专业团队将与您合作&#xff0c;深入了解您的公司背景、行业情况和发展计划&#xff0c;为您量身定制适合您的转让方案。无论是公司规模、经营期限、资产状况还是法律形式&#xff0c;我们都将综合考虑确保达到您的…

乙级资质企业开展物理污染防治工程的设计规范

1. 国家和地方标准 乙级资质企业首先必须遵守国家和地方有关物理污染防治工程设计的各项标准和规范&#xff0c;包括但不限于&#xff1a; GB/T 36610-2018《环境影响评价技术导则 声环境》&#xff1a;用于指导噪声污染防治工程的设计。 GB 8702-2014《电磁环境控制限值》&…

一键掌控,文件格式转换无忧!轻松驾驭各种文件格式,高效管理您的数字世界

信息爆炸的时代&#xff0c;我们每天都会接触到各种各样的文件格式。无论是工作文档、图片、视频还是音频文件&#xff0c;它们都以不同的格式存在于我们的电脑和移动设备中。然而&#xff0c;不同的软件和应用往往只支持特定的文件格式&#xff0c;这给我们的工作和生活带来了…

数据结构历年考研真题对应知识点(树的基本概念)

目录 5.1树的基本概念 5.1.2基本术语 【森林中树的数量、边数和结点数的关系&#xff08;2016&#xff09;】 5.1.3树的性质 【树中结点数和度数的关系的应用&#xff08;2010、2016&#xff09;】 【指定结点数的三叉树的最小高度分析&#xff08;2022&#xff09;】 5.1…

[软件安装]Dev C++

一、下载Dev C软件安装包 1、官网下载官网 2、百度网盘下载压缩包 二、安装Dev C 1、解压Dev C软件安装包 2、找到【Dev-Cpp 5.11…】应用程序&#xff0c;右键选择【以管理员身份运行】它 3、设置语言 回到桌面&#xff0c;右键桌面上的【Dev C 5.11软件图标】&#xff0c…