实现存储器EEPROM AT24C02的数据读写操作 采用IIC总线读写 C程序
I2C总线AT24C02存储器读写程序

write_byte(date);//在芯片第address位置写date.
respons();//写完后调用应答函数
stop();//I2C结束时钟函数
}
uchar read_add(uchar address)
{
uchar date;
{ start();//I2C开始时钟函数
write_byte(0xa0);//at24c02的固定地址A,1010,AO-A3都接地都为0。
respons();//写完后调用应答函数
write_byte(address);//确定从at24c02的第address位置写数据。
aa=k;
ee=aa*2200;
if(D4==0)
{
delay (100);
if(D4==1)
{
aa++;
delay (1);
init();//写直址,最后低位应为0。
write_add(2,aa);//23为at24c02内部储存地址,0xaa为写到23地址的数据。
#include <reg52.h>
#define uint unsigned int //定义unsigned int 为uint
#define uchar unsigned char //定义unsigned char 为uchar
#define uchar unsigned char //定义unsigned char 为uchar
delay (1);
k=read_add(2);//送到P1口显示。//从23地址读数据
STM32----6----I2C读写AT24C02

STM32----6----I2C读写AT24C02文章发表于:2011-05-09 13:51STM32作为主机I2C,读写24C02 EEPROM1、时钟和数据的传输:开始和停止条件,数据在SCL的高电平期间有效,在SCL的低电平期间改变。
2、开始条件:在SCL高电平期间,SDA产生一个下降沿3、停止条件:在SCL高电平期间,SDA产生一个上升沿4、应答:成功接收到数据(地址和数据),产生一个应答位(在第9个时钟周期,将SDA拉低)下面是源程序:原理上说,下面程序再移植时,只要将数据类型变化,可以应用到任何处理器AT24c02.h#ifndef __24CXX_H#define __24CXX_H#include "i2c.h"/***************************************************************- 说明:以下参数是AT24Cxx的寻址空间,C0x ,X 表示XK 如C01表示1K- 127表示2^7 1Kbit/8=128Byte 128字节- 255表示2^8 2Kbit/8=256Byte 256字节- 512表示2^9 4Kbit/8=512Byte 512字节-***************************************************************/#define AT24C01 127#define AT24C02 255#define AT24C04 511#define AT24C08 1023#define AT24C16 2047#define AT24C32 4095#define AT24C64 8191#define AT24C128 16383#define AT24C256 32767/**************************************************************--板子使用的是24c02,所以定义EE_TYPE为AT24C02**************************************************************/#define EE_TYPE AT24C02/**************************************************************--EEPROM的操作函数--24CXX驱动函数**************************************************************/u8 AT24CXX_ReadOneByte(u16 ReadAddr); //指定地址读取一个字节void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite); //指定地址写入一个字节void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len);//指定地址开始写入指定长度的数据u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len); //指定地址开始读取指定长度数据void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite); //从指定地址开始写入指定长度的数据void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead); //从指定地址开始读出指定长度的数据u8 AT24CXX_Check(void); //检查器件void AT24CXX_Init(void); //初始化IIC#endif----------------------------------------------------------------------------------------------------------------------------------------- AT24c02.c#include "at24cxx.h"#include "delay.h"/*************************************************************************** - 功能描述:STM32f103 EEPORM初始化函数- 隶属模块:STM32 EEPROM操作- 函数属性:外部,使用户使用- 参数说明:无- 返回说明:无- 函数功能:实现I2C的初始化。
IIC总线协议及EEPROMAT24C02

IIC总线协议及EEPROMAT24C02IIC总线协议及EEPROMAT24C02IIC总线协议是一种串行通信协议,用于在电子设备之间进行数据传输。
它也被称为I2C(Inter-Integrated Circuit)协议。
IIC总线协议由Philips(现在的NXP Semiconductors)在1982年开发,用于同一电路板上的集成电路芯片之间的通信。
IIC总线是一种主从式结构,其中一个设备作为主设备,其他设备作为从设备。
主设备负责控制数据传输和通信的时序。
每个从设备都有一个唯一的地址,主设备根据地址选择要与之通信的从设备。
从设备根据主设备发出的命令来执行特定的操作,例如读取数据或写入数据。
EEPROM是一种可擦写可编程只读存储器(Electrically Erasable Programmable Read-Only Memory),用于存储非易失性数据。
AT24C02是Microchip Technology公司制造的一种EEPROM芯片,具有容量为2Kbit的存储能力。
AT24C02采用了IIC总线协议,因此可以通过IIC总线与其他设备进行通信。
它有一个7位地址寄存器,可以设置其作为IIC总线上的从设备的地址。
在与主设备通信时,主设备发送一个启动条件,然后发送从设备地址,接下来是读写位和数据。
AT24C02根据主设备的指令来执行读取或写入操作。
AT24C02有一个内部的写保护电路,可以保护存储的数据被误写。
它还支持分页写入,即可以一次写入多个字节的数据,从而提高写入效率。
总结:IIC总线协议是一种用于串行通信的协议,适用于设备之间的数据传输。
AT24C02是一种采用IIC总线协议的EEPROM芯片,具有2Kbit的存储容量。
它通过主设备的控制来进行读写操作,同时具有写保护和分页写入等特性。
C51编写的AT24C02详细的读写程序

C51_AT24C02读写程序:/*void start() //开始信号void stop() //停止信号void Ack() //发确认信号void NoAck() //发无确认信号void init()//初始化信号,拉高SDA和SCL两条总线bit write_byte(uchar date)//写一字节,将date 写入AT24C02 中uchar read_byte()//读一字节,从AT24C02 中读一字节bit busy() //应答查询,stop()后,启动A T24C02内部写周期,启动查询//初始化EEPROM子程序内容为0XFF,nPage(0~31)void Init_Flash(uchar nPage) //8 bytes/1 page init 0xFFvoid write_add(uchar address,uchar date)//向AT24C02 中写数据//从AT24C02中给定的地址nAddr起,将存放在以指针nContent开头的存储空间中的nLen 个字节数据,连续写入AT24C02void write_flash(uchar *nContent,uchar nAddr, uchar nLen)uchar read_add(uchar address)//从AT24C02 中读出数据//从AT24C02中给定的地址nAddr起,读取nLen个字节数据存放在以指针nContent开头的存储空间。
void read_flash(uchar *nContent,uchar nAddr, uchar nLen)*//*单片机P2口接74HC138(三八译码器)P2.3--74HC138:/EI、P2.2--74HC138:A2、P2.1--74HC138:A1、P2.0--74HC138:A0译码器输出Y0,Y1、Y2、Y3、Y4、Y5、Y6、Y7均低电平有效,分别选通1~8个数码管。
AT24C02存储器的读写及显示

天津职业技术师范大学课程设计AT24C02存储器的读写及显示自动化与电气工程学院测控0702关蓓蓓(6 号)宋三虎(22号)王成坤(25号)一、设计任务:通过对EEPROM器件AT24C02的读写用LM016来显示↓流程图二、程序设计:#include<reg51.h>#include<absacc.h>#define REG0 XBYTE[0x0000]#define REG1 XBYTE[0x0001]#define REG2 XBYTE[0x0002]#define REG3 XBYTE[0x0003]Unsigned char busyflag;unsigned char dat,datn;unsigned char word1[16]={"This programm"};unsigned char word2[16]={"by SongSanhu"};code unsigned char word3[16]={"!"};codeunsignedcharword4[16]={"***************!"};code unsigned char word5[16]={"Wellcome To!"};code unsigned char word6[16]={"proteus Tool!"}; sbit P10=P1^0;sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P14=P1^4;sbit P15=P1^5;sbit P16=P1^6;sbit P17=P1^7;#define unchar unsigned char#define uint unsigned int#include <reg51.h>#include "intrins.h"sbit Scl=P3^4;sbit Sda=P3^5;void Start(void){Sda=1;Scl=1;_nop_();_nop_();_nop_();_nop_(); Sda=0;_nop_();_nop_();_nop_();_nop_();}void Stop(void) {Sda=0;Scl=1;_nop_(); _nop_();_nop_();_nop_(); Sda=1;_nop_();_nop_();_nop_();_nop_();}void Ack(void) {Sda=0;_nop_();_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();Scl=0;}void NoAck(void) {Sda=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Scl=0;}void Send(unsigned Data) {unsigned BitCounter=8; unsigned temp;do{temp=Data;Scl=0;_nop_();_nop_();_nop_();_nop_();if((temp&0x80)==0x80) Sda=1;Sda=0;Scl=1;temp=Data<<1;Data=temp; BitCounter--;}while(BitCounter);Scl=0;}uchar; Read(void){unsigned temp=0; unsigned temp1=0; unsigned BitCounter=8; Sda=1;do{Scl=0;_nop_();_nop_();_nop_();_nop_();Scl=1;_nop_();_nop_();_nop_();_nop_();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp<<1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}void WrToROM(unsigned Data[],unsigned Address,unsigned Num) {Unsigned char i;unsigned *PData;PData=Data;Send(0xa0);Ack();Send(Address);Ack();for(i=0;i<Num;i++){Send(*(PData+i));Ack();}Stop();}void RdFromROM(unsigned Data[],unsigned Address,unsigned Num){int i=0;unsigned *PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0xa0);Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}void busy(){do{busyflag=REG1;}while(busyflag);}void wrc(unsigned char wcon) {busy();REG0=wcon;}void wrd(unsigned char wdat) {busy();REG2=wdat;}void rdd(){busy();dat=REG3;}void lcdint(){wrc(0x38);wrc(0x01);wrc(0x06);wrc(0x0c);void wrn(unsigned char word[]) {unsigned char i;for(i=0;i<16;i++){wrd(word[i]);}}void main(){unsigned char i;lcdint();wrc(0x80);wrn(word1);wrc(0xc0);wrn(word2);while(1){if(P10==0)for(i=0;i<16;i++)word1[i]='d';WrToROM(word1,0x00,16); wrc(0x80);wrn(word1);}if(P11==0){RdFromROM(word2,0x00,16); WrToROM(word2,0x80,16); wrc(0x80);wrn(word1);wrc(0xc0);wrn(word2);}if(P12==0){wrc(0x80);wrn(word3);wrc(0xc0);}if(P13==0) {wrc(0x80); wrn(word5); wrc(0xc0); wrn(word6); }if(P14==0) {wrc(0x80); wrn(word3); wrc(0xc0); wrn(word4); }if(P15==0) {wrc(0x80); wrn(word5); wrc(0xc0);}if(P16==0){wrc(0x80);wrn(word3);wrc(0xc0);wrn(word4);}if(P17==0){wrc(0x80);wrn(word5);wrc(0xc0);wrn(word6);}}}三、硬件电路设计:四、总结:学习protues、keil软件,掌握绘制原理,对AT24C02存储器的读写编辑有了更多的理解,通过对存储器的读写以及输出完成老师给我们的任务。
E2PROM芯片24C02的读写程序

E2PROM芯片24C02的读写程序一、实验目的:给24C02的内部RAM写入一组数据,数据从24C02内部RAM的01h开始存放。
然后再把这组数据读出来,检验写入和读出是否正确。
在这里我们给24C02中写入0、1、2的段码,然后把它读出来,送到数码管显示。
二、理论知识准备:上面两个实验主要学习的是利用单片机的串口进行通讯,本实验要介绍的是基于I2C总线的串行通讯方法,下面我们先介绍一下I2C总线的相关理论知识。
(一)、I2C总线概念I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干扰性能好。
目前很多公司都推出了基于I2C总线的外围器件,例如我们学习板上的24C02芯片,就是一个带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,方便进行数据的长期保存。
(二)、I2C总线结构I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。
具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。
连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。
一个典型的I2C总线应用系统的组成结构如下图所示(假设图中的微控制器、LCD驱动、E2PROM、ADC各器件都是具有I2C总线接口的器件):我们知道单片机串行通讯的发送和接收一般都各用一条线TXD和RXD,而I2C总线的数据线既可以发送也可以接受,工作方式可以通过软件设置。
所以,I2C总线结构的硬件结构非常简洁。
当某器件向总线上发送信息时,它就是发送器,而当其从总线上接收信息时,又成为接收器。
(三)、I2C总线上的数据传送下面我们看看I2C总线是如何进行数据传送的。
我们知道,在一根数据线上传送数据时必须一位一位的进行,所以我们首先研究位传送。
1、位传输I2C总线每传送一位数据必须有一个时钟脉冲。
被传送的数据在时钟SCL的高电平期间保持稳定,只有在SCL低电平期间才能够改变,示意图如下图所示,在标准模式下,高低电平宽度必须不小于4.7us。
I2C总线编程实例(k1-k4:写入、读取、加+、清零)【EEPROM-AT24C02】

I2C总线编程实例(k1-k4:写⼊、读取、加+、清零)【EEPROM-AT24C02】(1)AT24C02是⼀种EEPROM元器件,是⼀种只读寄存器,断电保持,可保存数据100年, 是⼀种可擦除读写的芯⽚,相当于ROM硬盘,在下⾯实验中充当从机⾓⾊;(2)51在下⾯实验中充当主机⾓⾊;(3)在IIC总线标准协议上,进⾏51单⽚机(主机)和AT24C02(从机)的相互读写数据的操作。
⼩结:51单⽚机和各种EEPROM芯⽚之间可以通过IIC总线标准协议进⾏数据交互(通信)的。
实验:四个独⽴按键对应四个不同的功能,k1:将数据写⼊单⽚机,断电保存k2:读取上次保存的数据,断电后仍可读取上次保存的数据k3:当前数据+1k4:当前数据清零------------------------------------------------------------- 采⽤多⽂件的框架模式 -------------------------------------------------------------i2c.h:/*这个⽂件进⾏宏定义:定义I2C串⾏总线的相关数据端⼝、⽅法函数,以及定义⼀些使⽤频率较⾼的元素*/#ifndef _I2C_H_ // 如果没有定义宏#define _I2C_H_ // 定义⼀个宏// 需要⽤到51单⽚机的管脚,所以需要引⼊库⽂件#include <reg52.h>// 查单⽚机原理图可知(其中,SCL是时钟线,SDA是数据线)sbit SCL=P2^1;sbit SDA=P2^0;/* 相关函数 */// I2C的起始信号函数void I2cStart();// I2C的终⽌信号函数void I2cStop();// I2C发送(写⼊)字节函数,成功返回1,失败返回0unsigned char I2cSendByte(unsigned char dat);// I2C接收(读取)字节函数,返回读取的数据unsigned char I2cReadByte();// AT24C02芯⽚的写⼊数据函数void At24c02Write(unsigned char addr, unsigned dat);// AT24C02芯⽚的读取数据函数,返回读取的数据unsigned char At24c02Read(unsigned char addr);#endif // 结束i2c.c:/* 这个⽂件专门针对I2C模块的编程,其他模块可以新建另外⼀个⽂件 */#include <i2c.h> // 引⼊I2C的库⽂件/******************************************************************************** 函数名 : Delay10us()* 函数功能 : 延时10us* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void Delay10us() //误差 0usunsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);}/******************************************************************************** 函数名 : I2cStart()* 函数功能 : 起始信号:在SCL时钟信号在⾼电平期间SDA信号产⽣⼀个下降沿* 输⼊ : ⽆* 输出 : ⽆* 备注 : 起始之后SDA和SCL都为0,表⽰总线被主机占⽤*******************************************************************************/void I2cStart(){// 根据各个单⽚机的时序图来写SDA=1;Delay10us();SCL=1;Delay10us(); // 建⽴时间是SDA保持时间>4.7usSDA=0;Delay10us(); // 保持时间是>4usSCL=0;Delay10us();}/******************************************************************************** 函数名 : I2cStop()* 函数功能 : 终⽌信号:在SCL时钟信号⾼电平期间SDA信号产⽣⼀个上升沿* 输⼊ : ⽆* 输出 : ⽆* 备注 : 结束之后保持SDA和SCL都为1;表⽰总线处于空闲状态*******************************************************************************/void I2cStop(){// 根据各个单⽚机的时序图来写SDA=0;Delay10us();SCL=1;Delay10us(); // 建⽴时间是SDA保持时间>4.7usSDA=1;Delay10us(); // 保持时间是>4us}/******************************************************************************** 函数名 : I2cSendByte(unsigned char dat)* 函数功能 : 通过I2C发送⼀个字节。
单片机课程设计-IIC总线式EEPROM存储器应用设计

目录1 设计要求 (2)2 设计目的 (2)3 器件EEPROM的介绍 (2)3.1 EEPROM简介 (2)3.2 EEPROM24XX系列功能概述 (3)4 IIC协议的介绍 (3)4.1 IIC协议总线特征 (3)4.2 IIC协议工作原理 (3)4.3 IIC协议总线基本状态 (3)4.4 寻址约定 (5)5 EEPROM读写功能实现 (5)5.1写操作 (5)5.1.1 字节写操作 (6)5.1.2 页写入操作 (6)5.2 确认查询 (7)5.3 读操作 (7)5.3.1 当前地址的读操作 (8)5.3.2 随机读操作 (8)5.3.3 连续读操作 (9)6 具体设计过程 (10)6.1 程序流程设计 (10)6.2执行结果 (13)6.3 系统组成模块结构及功能 (15)6.3.1 函数定义 (15)6.3.2 主函数设计 (17)6.3.3 源程序 (19)7 设计心得体会 (27)8 参考文献 (28)IIC总线式EEPROM存储器应用设计1 设计要求利用51单片机和IIC总线式EEPROM芯片24C02进行存储器设计。
按下KEYWRITE1键,向24C02存储器写入数据1和2;按下KEYWRITE2键,向24C02存储器写入数据3和4;按下KEYREAD键,从24C02存储器读出刚写入的数据数据;写入数据显示在左两位,读出数据显示在右两位。
如图1.1所示。
图1.1 系统仿真运行图2 设计目的通过设计,了解IIC协议的基本原理,并对EEPROM读写功能的实现有个系统的概念,对其实现过程比较清楚。
同时,在设计中,巩固我们所学的理论知识。
3 器件EEPROM的介绍3.1 EEPROM简介EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片。
EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。
最好的24C02储存开机次数实验 读写程序-推荐下载

汇编语言参考程序: SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000H AJMP MAIN ORG 0080H MAIN:
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术艺料0不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试2下卷2,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并22工且22作尽22下可22都能22可地护以缩1关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编试要5写、卷求重电保技要气护术设设装交备备置底4高调、动。中试电作管资高气,线料中课并敷3试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
I2C总线at24c02芯片使用说明

325密码储存电路密码储存电路采用l2C总线at24c02存储芯片存放密码,可实现断电密码不消失,at24c02存储芯片可长期存储信息,可上百万次以上重新擦写。
2.4.3 I 2C总线密码存储芯片at24c02介绍S-I&ad TSSOP图2-3 at24c02 引脚图(1)引脚功能介绍及相关知识WP写保护引脚,将该引脚接VCC U PROM就实现写保护(只读)。
引脚接地或悬空,可以对器件进行读写操作。
SCL串行时钟引脚,串行输入输出时该引脚用于输入时钟。
SDA串行数据输入输出引脚,用来输入输出数据,该引脚为射极开路输出,需接上拉电阻。
(2) |2C总线协议只有总线非忙时才被允许进行数据传送,在传送时,当时钟线为高电平,数据线必须为固定状态,不允许有跳变。
时钟线为高电平时数据线的任何电平变化将被当作总线的启动或停止条件。
(3)起始条件起始调教必须在所有操作命令之前发送。
时钟线保持高电平期间,数据线电平从高到低跳变作为I2C总线的启动信号。
CAT24Cxx>一直监视SDA和SCL电平信号,直到条件满足时才响应。
(4) 停止条件时钟线保持高电平期间,数据线电平从低到高跳变作为l 2C 总线的停止信号。
(5) 器件地址的约定主器件在发送启动命令后开始传送数据,主器件发送相应的从器件地址, 8位从器件地址的高四位固定为1010,接下来的3位用来定义存储器的地址,对 于CAT24C021/022这三位无意义,对于 CAT24C41/042接下来的2位无意义, 第三位是地址高位,CAT24C081/082中,第一位无意义,后两位表示地址高位。
最后一位为读写控制位,“ 1”表示对从器件进行读写操作,“ 0 ”表示写操 作。
在主器件发送启动命令和一字节从器件地址后,如果与从器件地址吻合, CAT24C02各发送一个应答信号,然后再根据读/写控制为进行读或写操作。
(6) 应答信号每次数据传送成功后,接收器件将发送一个应答信号。
IIC总线24C02读写

实验说明:T24C01A/AT24C02为I2C总线型EEPROM存储器,容量为1K/2K位(128/256*8),前读/写时序遵循I2C总线协议标准。
A T24C01A/A T24C02内部设有一个控制寄存器,其每一位的含义如下:Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit01 0 1 0 A2 A1 A0 R/W其中A2/A1/A0用于选择总线上待访问的I2C器件,R/W=1读操作,R/W=0写操作;从上述时序可以看出,I2C总线上最多可以扩展23=8片同样的1K/2K容量EEPROM存储器或者可以扩展1片容量为16K Bits的EEPROM存储器。
如果扩展8片2K以内容量的EEPROM 存储器,每片存储器将对应一个地址,这个由于实验仪上的A T24C01A/AT24C02的A2/A1/A0引脚全部接地,等效为实验仪上的AT24C01A/AT24C02的地址为0,所以在实验中读写控制字分别为:0xa1/0xa0实验要求利用实验仪上的I2C总线器件AT24C01A/AT24C02,编写I2C总线读写程序并自行验证程序的正确性。
c语言:/* 实验四十二IIC总线24C02读写*//* C51 */#include <reg51.h>#include <intrins.h>/* **********************************************************24C01/02 为IIC总线EEPROM存储器, 容量为1k位(128 * 8)************************************************************//* **********************************************************EEPROM控制字节格式:[1, 0, 1, 0, A2, A1, A0, (R/W)], 其中R/W=1读,R/W=0写;由于实验仪上的AT24C01A(AT24C02) 的A2/A1/A0全部接地,所以读/写控制字分别为:0xa1/0xa0************************************************************/#define WriteDeviceAddress 0xa0#define ReadDeviceAddress 0xa1/******************IIC器件驱动引脚定义**********************/sbit SCL = P1^0;sbit SDA = P1^1;/***********************简单延时****************************/void DelayMs(unsigned int number){unsigned char temp = 112;while(number--!=0){while(temp--!=0){}}}/*********************启动IIC总线***************************/void Start() {SDA = 1;SCL = 1;SDA = 0;SCL = 0;}/*********************停止IIC总线***************************/void Stop() {SCL = 0;SDA = 0;SCL = 1;SDA = 1;}/***********************请求相应****************************/void Ack() {SDA = 0; /*从器件响应信号将SDA线拉到低电平*/SCL = 1;SCL = 0;SDA = 1; /*响应结束,SDA回到高电平继续下一个传送周期*/ }/*******************不对IIC总线产生应答*********************/void NoAck() {SDA = 1; /*从机不响应时,数据线保持高电平*/SCL = 1;SCL = 0;}/**********************检查应答位***************************/bit TestAck() {SDA = 1;SCL = 1;CY = SDA;SCL = 0;return(CY); /*CY=0表应答*/}【关于I2C的检查应答信号的程序】unsigned char I2C_CheckAck(void){unsigned char i;unsigned char Ack=1;I2C_SDA=1;DelayUs(I2C_DELAY);I2C_SCL=1;DelayUs(I2C_DELAY);for(i=0;i<10;i++){Ack=I2C_SDA;if(!Ack){I2C_SCL=0;return 1;}}I2C_Stop();return 0;}/********************向IIC总线写数据************************/ bit Write8Bit(unsigned char input){unsigned char temp;for(temp = 8; temp != 0; temp--){SDA = (bit)(input&0x80); /*取Input最高位*/SCL = 1;SCL = 0;input = input<<1; /*input左移输入下一位*/ }return(0);}/****************从IIC总线上读数据子程序********************/unsigned char Read8Bit(){unsigned char temp, rbyte=0;for(temp=8;temp!=0;temp--){SCL=1;rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA)); /*循环结束把8位的SDA(串行的)读成了一个8位的数放到rbyte中*/SCL=0;}return(rbyte);}/*******************向EEPROM中写入数据块********************/void AT24C02WriteBlock(unsigned char *Wdata, unsigned char RomAddress, unsigned char number){if(number > 8)number %= 8; /*对于24C02, 一个页为8字节,所以最大的块写操作字节数为8*/ Start();Write8Bit(WriteDeviceAddress); //总线上器件地址TestAck();Write8Bit(RomAddress); //器件内部要写入地址,有时将此处省略默认从00开始TestAck();for(;number!=0;number--){Write8Bit(*Wdata);TestAck();Wdata++;}Stop();DelayMs(10);}/**************从EEPROM中读出数据块到指定RAM中**************/void AT24C02ReadBlock(unsigned char *RamAddress, unsigned char RomAddress, unsigned char bytes){EA = 0; //单片机读操作限制在外部ROMStart();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Start(); //重新启动总线Write8Bit(ReadDeviceAddress);TestAck();while(bytes!=1){*RamAddress = Read8Bit();Ack();RamAddress++;bytes--;}*RamAddress = Read8Bit();NoAck();Stop();}/*****************向EEPROM中写入单字节数据******************/ void AT24c02WriteByte(unsigned char WriteData, unsigned char RomAddress) { Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Write8Bit(WriteData);TestAck();Stop();DelayMs(10);}/************从EEPROM中读出单字节数据到指定RAM中************/ unsigned char AT24c02ReadByte(unsigned char RomAddress) {unsigned char ReadData;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Start();Write8Bit(ReadDeviceAddress);TestAck();ReadData = Read8Bit();NoAck();Stop();return(ReadData);}void main(void){unsigned char i;unsigned char WriteBuff[8], ReadBuff[8];/* 读写缓冲初始化*/for(i = 0; i < 8; i++){WriteBuff[i] = 0x55 + i;ReadBuff[i] = 0xff;}/* 从地址0开始按字节方式写入8个数据'0' */for(i = 0; i < 8; i++){A T24c02WriteByte(0, i);}/* 按字节方式读出数据*/for(i = 0; i < 8; i++) {ReadBuff[i] = AT24c02ReadByte(i);}/* 按写Page方式从地址0开始写入WriteBuff指向的8个数据*/ A T24C02WriteBlock(WriteBuff, 0x00, 8);/* 按连续读取方式读出从地址0开始的8个数据*/A T24C02ReadBlock(ReadBuff, 0x00, 8);while(1);}汇编语言:; 实验四十二IIC总线24C02读写; ASM51; ********************************************************** ; 24C01/02 为IIC总线EEPROM存储器, 容量为1k位(128 * 8); **********************************************************; ********************************************************** ; EEPROM控制字节格式:; [1, 0, 1, 0, A2, A1, A0, (R/W)], 其中R/W=1读,R/W=0写;; 由于实验仪上的AT24C01A(AT24C02) 的A2/A1/A0全部接地, ; 所以读/写控制字分别为:0xa1/0xa0; ********************************************************** WriteDeviceAddress equ 0a0hReadDeviceAddress equ 0a1h; ******************IIC器件驱动引脚定义********************* SCL equ P1.0SDA equ P1.1; *******************读写数据缓冲定义*********************** ReadBuff equ 40hWriteBuff equ 48hRWLength equ 30hRomAddress equ 31horg 0000hljmp Mainorg 0100h; ***********************简单延时*************************** DelayMs:push 06nopDelayMsLoop2:mov r6, #0ffhDelayMsLoop1:djnz r6, DelayMsLoop1djnz acc, DelayMsLoop2pop 06ret; ********************启动IIC总线*************************** Start:setb SDAsetb SCLclr SDAclr SCLret; ********************停止IIC总线*************************** Stop:clr SCLclr SDAsetb SCLsetb SDAret; **********************请求相应**************************** Ack:clr SDAsetb SCLclr SCLsetb SDAret; ******************不对IIC总线产生应答********************* NoAck:setb SDAsetb SCLclr SCLret; *********************检查应答位*************************** TestAck:setb SDAsetb SCLmov C, SDAclr SCLnopnopnopret; *******************向IIC总线写数据************************Write8Bit:push 07mov r7, #8Write8BitLoop:rlc amov SDA, Csetb SCLclr SCLnop ; 此处建议加入几个NOP指令降低MCU对器件操作的速度nopnopdjnz r7, Write8BitLooppop 07ret; ***************从IIC总线上读数据子程序********************Read8Bit:push 07clr amov r7, #8Read8BitLoop:clr Csetb SCLmov C, SDArlc aclr SCLnop ; 此处建议加入几个NOP指令降低MCU对器件操作的速度nopnopdjnz r7, Read8BitLooppop 07ret; ******************向EEPROM中写入数据块********************AT24C02WriteBlock:clr eamov r0, #WriteBuffinc RWLengthanl RWLength, #0f0h ;对于24C02, 一个页为8字节,所以最大的块写操作字节数为8*/mov r7, RWLengthcall Startmov a, #WriteDeviceAddresscall Write8Bitcall TestAckmov a, RomAddresscall Write8Bitcall TestAckAT24C02WriteBlockLoop:mov a, @r0call Write8Bitcall TestAckinc r0djnz r7, AT24C02WriteBlockcall Stopmov a, #10call DelayMsret; *************从EEPROM中读出数据块到指定RAM中************** AT24C02ReadBlock:clr eamov r0, #ReadBuffmov r7, RWLengthcall Startmov a, #WriteDeviceAddresscall Write8Bitcall TestAckmov a, RomAddresscall Write8Bitcall TestAckcall Startmov a, #ReadDeviceAddresscall Write8Bitcall TestAckAT24C02ReadBlockLoop:call Read8Bitmov @r0, acall Ackinc r0djnz r7, AT24C02ReadBlockcall NoAckcall Stopret; ****************向EEPROM中写入单字节数据****************** AT24c02WriteByte:clr eacall Startmov a, #WriteDeviceAddresscall Write8Bitcall TestAckmov a, RomAddresscall Write8Bitcall TestAckmov a, @r0call Write8Bitcall TestAckcall Stopmov a, #10call DelayMsret; ***********从EEPROM中读出单字节数据到指定RAM中************ AT24c02ReadByte:clr eacall Startmov a, #WriteDeviceAddresscall Write8Bitcall TestAckmov a, RomAddresscall Write8Bitcall TestAckcall Startmov a, #ReadDeviceAddresscall Write8Bitcall TestAckcall Read8Bitmov @r0 ,acall NoAckcall StopretSetReadBuff:mov r0, #ReadBuffmov r7, RWLengthSetReadBuffLoop:mov @r0, ainc r0djnz r7, SetReadBuffLoopretSetWriteBuff:mov r0, #WriteBuffmov r7, RWLengthSetWriteBuffLoop:mov @r0, ainc r0djnz r7, SetWriteBuffLoopretMain:mov SP, #60h; 读写缓冲初始化mov a, #00mov RWLength, #8call SetReadBuffmov a, #00mov RWLength, #8call SetWriteBuff; 写缓冲初始化mov r0, #WriteBuffmov r7, #8mov a, #55hInitWriteBuffLoop:mov @r0, ainc ainc r0djnz r7, InitWriteBuffLoop; 从地址0开始按字节方式写入8个数据'0' mov RomAddress, #0mov r7, #8mov r0, #WriteBuffWriteLoop:call AT24c02WriteByteinc RomAddressinc r0djnz r7, WriteLoop; 按字节方式读出数据mov RomAddress, #0mov r7, #8mov r0, #ReadBuffReadLoop:call AT24c02ReadByteinc RomAddressinc r0djnz r7, ReadLoop; 按写Page方式从地址0开始写入WriteBuff指向的8个数据mov RomAddress, #0mov RWLength, #8mov r0, #WriteBuffcall AT24C02WriteBlock; 按连续读取方式读出从地址0开始的8个数据mov RomAddress, #0mov RWLength, #8mov r0, #ReadBuffcall AT24C02ReadBlockjmp $end。
DSP实践讲解-11 EEPROM 24C02读写实验

Digital Signal Processor 数字信号处理器
光华学院 信息工程系 王 超
GPIO应用之EEPROM
IIC 总线
IIC 总线
IIC 总线术语:
数据的有效性
起始和停止条件
传输数据
传输数据
AT24C02
AT24C02连接原理图
AT24C02
IIC总线AT24C02实验
IIC总线AT24C02实验
IIC总线AT24C02实验
IIC总线AT24C02实验
IIC总线AT24C02实验
IIC总线AT24C02实验
设置数据=1 设置时钟=1,稳定 设置数据为输入模式 设置时钟=0,可变 设置数据为输出模式 返回”真”/”假”
IIC总线AT24C02实验
设置数据输出 数据输出=1 时钟输出=1,稳定 读数据? 时钟输出=1,可变
Data是1变量的地址, *Data是指向这个变量地址下的内容.1.
前n-1次数据读,有应答! 最后1次数据读,主机无应答!
读数据n-1个,有应答, 第n个数据无应答.
IIC总线AT24C02实验
Temp=地址,w_data=写入数据,erro=错误,r_data读数据
END
0,1,2,3,4地址下写入17,18,19,20,21
读0,1,2,3,4地址下内容是否为 17,18,19,20,21,5次全读对则erro=0. unsigned char w_buffer[8]={23,18,18,20,32,25,28,29}; unsigned char r_buffer[8]={0};
24C02(IIC)读写操作

1. AT24C02写操作首先我们来看一下写AT24C02。
一般步骤是:1) 发送起始信号2) 发送写器件地址3) 等待应答4) 发送要写入的24C02 的地址5) 等待应答6) 发送要写入的数据7) 等待应答8) 发送数据结束发送结束信号具体程序如下:/****************************************************************************** ** 函数名: AT24Cxx_WriteOneByte* 函数功能: 24c02写一个字节地址数据* 输入: addr dt* 输出: 无********************************************/void AT24Cxx_WriteOneByte(u16 addr,u8 dt){I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Send_Byte(dt);I2C_Wait_Ack();I2C_Stop();delay_ms(10);}2. AT24C02读操作那么读取AT24C02 的步骤是:1)发送起始信号2) 发送写器件地址3) 等待应答4) 发送要读取的AT24C02 的地址5) 等待应答6) 再发送其实信号7) 发送读器件地址8) 等待应答9) 接收数据10) 如果没有接收完数据,发送应答11) 接收数据12) 直到接收完数据,发送非应答13) 发送结束信号/****************************************************************************** ** 函数名: AT24Cxx_ReadOneByte* 函数功能: 24c02读一个字节地址数据* 输入: addr* 输出: 返回值temp*****************************************************************************/ u8 AT24Cxx_ReadOneByte(u16 addr){u8 temp=0;I2C_Start();if(EE_TYPE>AT24C16){I2C_Send_Byte(0xA0);I2C_Wait_Ack();I2C_Send_Byte(addr>>8); //发送数据地址高位}else{I2C_Send_Byte(0xA0+((addr/256)<<1));//器件地址+数据地址}I2C_Wait_Ack();I2C_Send_Byte(addr%256);//双字节是数据地址低位//单字节是数据地址低位I2C_Wait_Ack();I2C_Start();I2C_Send_Byte(0xA1);I2C_Wait_Ack();temp=I2C_Read_Byte(0); // 0 代表NAC I2C_NAck();I2C_Stop();return temp;}。
单片机对存储器AT24C02页读,写程序

/****************************************************************************** 定义控制存储器操作的程序******************************************************************************/ 这是自己写的程序,已经经过验证,细节要求的地方,参考一下AT24CXX数据手册即可#include <intrins.h>#include "AT89S52_reg.h"#include "Delay.h"sbit SDA = P3^6;sbit SCL = P3^7;/*********************************初始化存储器子程序*********************************/void InitMemory(void){SCL = 1;flash();SDA = 1;flash();}/*********************************I2C总线短延时子程序*********************************/static void flash(){_nop_();_nop_();_nop_();_nop_();_nop_(); /时序图要求开始建立时间tSU.STA大于4.7us,开始保持时间tHD.STA大于4us。
51中每个_nop_ ();延时1个CPU cycle,即1us}/*********************************启动I2C总线子程序*********************************/static void Start(void){SDA = 1;flash();SCL = 1;SDA = 0;flash();SCL = 0;flash();}/*********************************停止I2C总线子程序*********************************/static void Stop(void){SDA = 0;flash();SCL = 1;flash();SDA = 1;flash();}/******************************************** 写一字节子程序********************************************/ static void Mmr_SendByte(unsigned char byte){unsigned char i, temp;temp = byte;for (i=0; i<8; i++){temp <<= 1;SCL = 0;flash();SDA = CY;flash();SCL = 1;flash();}SCL = 0;flash();SDA = 1;flash();i = 0;flash();while ((SDA==1) && (i<255)){i++;}SCL = 0;flash();}/**************************************读一字节子程序**************************************/static unsigned char Mmr_GetByte(void){unsigned char i;unsigned char byte;SCL = 0;flash();SDA = 1;for (i=0; i<8; i++){byte <<= 1;flash();SCL = 1;flash();if (SDA == 1){byte |= 0x01;}SCL = 0;}flash();SDA = 0;SCL = 1;flash();SCL = 0;flash();SDA = 1;flash();return(byte);}/*********************************************************************从存储器指定地址中读取n个字节数据子程序(页读)*********************************************************************/void ReadMemory(unsigned char addr, unsigned char *p, unsigned char n) reentrant//addr 为数据开始地址*p为指向所需写入数据数组的指针n为个数,因不同存储器而不同这个可以参见数据手册{Start();Mmr_SendByte(0xA0); // 写入数据指令Mmr_SendByte(addr); // 写入读取数据的地址Start();Mmr_SendByte(0xA1); // 读取数据指令while(n--){*p = Mmr_GetByte();p++;}Stop();Delayms(2);}/**********************************************************************写存储器指定地址中写入n个字节数据子程序(页写)**********************************************************************/void WriteMemory(unsigned char addr, unsigned char *p, unsigned char n) reentrant{EA = 0;Start();Mmr_SendByte(0xA0);Mmr_SendByte(addr);while(n--){Mmr_SendByte(*p);p++;}Stop();EA = 1;Delayms(10);}。
I2C存储器AT24C02读写实验(一)

开发板原理图仿真连线
实训报告
实训名称、地点、时间 实训内容: AT24C02读写实训 请画出AT24C02与单片机的引脚连线图 源程序 写个人体会以及实训过程中碰到的问题
参考程序
请参考书上P187例8.3.1。 注意:例题的寻址地址如右图, 跟开发板的连接有所不同。 因此需要注意。
at24c02读写实训?请画出at24c02与单片机的引脚连线图?源程序?写个人体会以及实训过程中碰到的问题参考程序?请参考书上p187例831
I2C存储器AT24C02读写实训
实训内容
第一步:通示; 第二步:在第一步成功的基础上,在实验板 上验证;
I2C总线上接两个AT24C02读写实例

I2C总线上接两个AT24C02读写实例、本例对I2C总线上关节两个AT24C02进行读写操作,想将数据0xaa写入第一个at24c02的指定地址,再将该数据读出后存入第二个AT24C02的指定地址,最后读出该数据并送P1口用8位LED显示验证2、实现方法:1)两个器件地址的确定由于第一个AT24C02的3位地址位(A0A1A2)均接地(低电平),第二个AT24C02的三个地址位(A0A1A2)均接电源(高电平),因此第一个AT24C02的地址为000,第二个AT24C02的地址为111.在写命令时,指名要操作的器件地址,即可对不同的AT24C02进行操作3、在keil c51中新建工程ex54,编写如下程序代码,编译并生成ex54.hex文件//对I2C总线上挂接多个AT24C02的读写操作#include <reg51.h> // 包含51单片机寄存器定义的头文件#include <intrins.h> //包含_nop_()函数定义的头文件#define OP_READ1 0xa1 // 器件1地址以及读取操作,0xa1即为1010 0001B#define OP_WRITE1 0xa0 // 器件1地址以及写入操作,0xa1即为1010 0000B#define OP_READ2 0xaf // 器件2地址以及读取操作,0xa1即为1010 1111B#define OP_WRITE2 0xae // 器件2地址以及写入操作,0xa1即为1010 1110Bsbit SDA=P3^4; //将串行数据总线SDA位定义在为P3.4引脚sbit SCL=P3^3; //将串行时钟总线SDA位定义在为P3.3引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/***************************************************** 函数功能:延时若干毫秒入口参数:n***************************************************/ void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/***************************************************函数功能:开始数据传送***************************************************/ void start()// 开始位{SDA = 1; //SDA初始化为高电平“1”SCL = 1; //开始数据传送时,要求SCL为高电平“1”_nop_(); //等待一个机器周期SDA = 0; //SDA的下降沿被认为是开始信号_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)_nop_(); //等待一个机器周期}/***************************************************函数功能:结束数据传送***************************************************/void stop()// 停止位{SDA = 0; //SDA初始化为低电平“0”_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 1; //结束数据传送时,要求SCL为高电平“1”_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SDA = 1; //SDA的上升沿被认为是结束信号}/***************************************************函数功能:从AT24Cxx读取数据出口参数:x***************************************************/unsigned char ReadData()// 从AT24Cxx移入数据到MCU{unsigned char i;unsigned char x; //储存从AT24Cxx中读出的数据for(i = 0; i < 8; i++){SCL = 1; //SCL置为高电平x<<=1; //将x中的各二进位向左移一位x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中SCL = 0; //在SCL的下降沿读出数据}return(x); //将读取的数据返回}/***************************************************函数功能:向AT24Cxx的当前地址写入数据入口参数:y (储存待写入的数据)***************************************************///在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0bit WriteCurrent(unsigned char y){unsigned char i;bit ack_bit; //储存应答位for(i = 0; i < 8; i++) // 循环移入8个位{SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S//因为传送时高位在前,低位在后_nop_(); //等待一个机器周期SCL = 1; //在SCL的上升沿将数据写入AT24Cxx_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲y <<= 1; //将y中的各二进位向左移一位}SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,//以让SDA线转由接收设备(AT24Cxx)控制_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期SCL = 1; //根据上述规定,SCL应为高电平_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期_nop_(); //等待一个机器周期ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节//若送高电平,表示没有接收到,传送异常SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit;// 返回AT24Cxx应答位}/***************************************************函数功能:向第一个AT24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)***************************************************/void WriteSet1(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent{start(); //开始数据传递WriteCurrent(OP_WRITE1); //选择要操作的第一个AT24Cxx芯片,并告知要对其写入数据WriteCurrent(add); //写入指定地址WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据stop(); //停止数据传递delaynms(4); //1个字节的写入周期为1ms, 最好延时1ms以上}/***************************************************函数功能:向第二个AT24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)***************************************************/void WriteSet2(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent{start(); //开始数据传递WriteCurrent(OP_WRITE2); //选择要操作的AT24Cxx芯片,并告知要对其写入数据WriteCurrent(add); //写入指定地址WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据stop(); //停止数据传递delaynms(4); //1个字节的写入周期为1ms, 最好延时1ms以上}/***************************************************函数功能:从第一个AT24Cxx中的当前地址读取数据出口参数:x (储存读出的数据)***************************************************/unsigned char ReadCurrent1(){unsigned char x;start(); //开始数据传递WriteCurrent(OP_READ1); //选择要操作的第一个AT24Cxx芯片,并告知要读其数据x=ReadData(); //将读取的数据存入xstop(); //停止数据传递return x; //返回读取的数据}/***************************************************函数功能:从第二个AT24Cxx中的当前地址读取数据出口参数:x (储存读出的数据)***************************************************/unsigned char ReadCurrent2(){unsigned char x;start(); //开始数据传递WriteCurrent(OP_READ2); //选择要操作的第二个AT24Cxx芯片,并告知要读其数据x=ReadData(); //将读取的数据存入xstop(); //停止数据传递return x; //返回读取的数据}/***************************************************函数功能:从第一个AT24Cxx中的指定地址读取数据入口参数:set_addr出口参数:x***************************************************/unsigned char ReadSet1(unsigned char set_addr)// 在指定地址读取{start(); //开始数据传递WriteCurrent(OP_WRITE1); //选择要操作的第一个AT24Cxx芯片,并告知要对其写入数据WriteCurrent(set_addr); //写入指定地址return(ReadCurrent1()); //从第一个AT24Cxx芯片指定地址读出数据并返回}/***************************************************函数功能:从第二个AT24Cxx中的指定地址读取数据入口参数:set_addr出口参数:x***************************************************/unsigned char ReadSet2(unsigned char set_addr)// 在指定地址读取{start(); //开始数据传递WriteCurrent(OP_WRITE2); //选择要操作的第二个AT24Cxx芯片,并告知要对其写入数据WriteCurrent(set_addr); //写入指定地址return(ReadCurrent2()); //从第二个AT24Cxx芯片指定地址读出数据并返回}/***************************************************函数功能:主函数***************************************************/main(void){unsigned char x;SDA = 1; // SDA=1,SCL=1,使主从设备处于空闲状态SCL = 1;WriteSet1(0x36,0xaa); //将数据"0xaa"写入第一个AT24C02的指定地址"0x36" x=ReadSet1(0x36); //从第二个AT24C02中的指定地址"0x36"读出数据 WriteSet2(0x48,x); //将读出的数据写入第二个AT24C02的指定地址"0x48"?P1=ReadSet2(0x48); //将从第二个AT24C02的指定地址读出的数据送P1口显示验证}4、在proteus中新建仿真文件ex54.dsn,电路原理图如下所示5、将ex54.hex文件载入at89c51中,启动仿真,观察运行结果。
单片机模拟I2C总线及24C02(I2C EEPROM)读写实例

/*发送1,在SCL为高电平时使SDA信号为高*/
SDA=1;
SCL=1;
DELAY(DELAY_TIME);
SCL=0;
DELAY(DELAY_TIME);
}
bit Check_Acknowledge(void)
/* Language: C51单片机编程语言 */
/* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751 */
/* Author: StephenZhu javasdk@ */
for(i=0;i<7;i++)
{
WriteI2CByte(buffer[i]);
if(!Check_Acknowledge())
{
I2C_Stop();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
WriteI2CByte(thedata);/*thedata*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
for(i=0;i<n;i++)
如何对AT24C02编写驱动程序——IIC总线协议

如何对AT24C02编写驱动程序——IIC总线协议AT24C02是一种2Kbit(256字节)的串行EEPROM芯片,采用I2C总线协议进行通信。
编写AT24C02的驱动程序需要了解I2C总线协议的工作原理以及AT24C02的读写操作。
以下是编写AT24C02驱动程序的步骤:1. 硬件配置:首先,需要在单片机上配置I2C总线的硬件连接。
I2C 总线需要两根信号线,即SDA(Serial Data Line)和SCL(Serial Clock Line)。
将SDA和SCL引脚连接到AT24C02的对应引脚,并通过上拉电阻将其拉高。
2.初始化I2C总线:在驱动程序中,需要初始化I2C总线的相关寄存器和配置参数。
这包括设置I2C总线的通信速率、使能I2C模块、使能中断等。
3.开始信号和设备地址:发送开始信号START,然后发送AT24C02的设备地址,设备地址由3位固定的值和一个读/写位组成。
读写位为0代表写操作,为1代表读操作。
4.发送数据:如果是写操作,发送要写入的数据到AT24C02的指定地址。
数据写入时,需要注意AT24C02的内存地址范围,以及页写操作的限制。
如果是读操作,发送读取的目标地址。
5.停止信号:传输完成后,发送停止信号STOP,结束通信。
6.延时和轮询:在I2C总线通信中,需要一定的延时等待数据传输完成。
在写入大量数据或读取数据时,还需要轮询等待操作完成。
7.错误处理:在驱动程序中,需要考虑到可能发生的错误和异常情况。
例如,设备地址未响应、通信超时、数据传输错误等,都需要进行相应的错误处理。
8.封装函数接口:为了方便上层应用调用,可以将上述操作封装成函数接口。
例如,提供读写函数、擦除函数和查询设备ID的函数等。
除了以上的驱动程序,还可以根据实际需求进行功能扩展。
例如,可以实现批量写入数据、随机读取数据、擦除操作等。
总之,编写AT24C02的驱动程序主要包括硬件配置、初始化I2C总线、发送开始信号和设备地址、发送数据、发送停止信号、延时和轮询、错误处理等步骤。
ATMEL24c02使用详解(汇编及C程序都有)

ATMEL 24c02使用详解(汇编及C程序都有)1000字ATMEL 24c02是一种串行EEPROM存储器,具有2KB的存储容量,可通过I2C总线进行读写操作。
使用ATMEL 24c02时,需先设置I2C总线的通信速率和设备地址。
然后,可以使用汇编语言或C语言编写程序进行读写数据操作。
汇编语言程序示例:1. 设置I2C总线通信速率及设备地址```LDAA #$0 ;设置I2C总线通信速率为100kHzSTAA SCLDIVLDAA #$A0 ;设置EEPROM的设备地址为0xA0STAA SLA```2. 写入数据到EEPROM```BYTE_WRITE PROCLDAA #$00 ;设置数据的存储地址为0x00STAA DADDRLDAA #$A5 ;设置需要写入的数据为0xA5STAA DATAJSR I2C_WRITE ;调用I2C总线写入函数RTSBYTE_WRITE ENDP```3. 从EEPROM读取数据```BYTE_READ PROCLDAA #$00 ;设置数据的读取地址为0x00STAA DADDRJSR I2C_START ;发送起始信号LDAA #$A1 ;设置EEPROM的设备地址为0xA1,读操作时需要在地址末位添加1JSR I2C_SEND ;发送EEPROM设备地址LDAA #$00 ;设置要读取的数据长度为1JSR I2C_READ ;调用I2C总线读取函数LDA DATA ;将读取到的数据保存到DATA寄存器中RTSBYTE_READ ENDP```C语言程序示例:1. 在main函数中,调用I2C_Init()函数,设置I2C总线速率和设备地址。
```void main(){I2C_Init(); //设置I2C总线速率和设备地址}```2. 写入数据到EEPROM```void Write_Byte(unsigned char addr, unsigned char dat) {I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置存储地址I2C_SendByte(dat); //写入数据I2C_Stop(); //发送停止信号}```3. 从EEPROM读取数据```unsigned char Read_Byte(unsigned char addr){unsigned char res;I2C_Start(); //发送起始信号I2C_SendByte(0xa0); //写入EEPROM的设备地址I2C_SendByte(addr); //设置读取地址I2C_Start(); //发送起始信号I2C_SendByte(0xa1); //设置EEPROM的设备地址为读取模式 res = I2C_ReadByte(); //读取数据I2C_Stop(); //发送停止信号return res; //返回读取的数据}```即可进行EEPROM的读写操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*************************************************************** 功能:11:32 2008-6-27作者:SG时间:2004-03-15版本:V1.0***************************************************************/#include "INTRINS.H"#include "reg52.h"#define WriteDeviceAddress 0xa0 //写驱动地址指令#define ReadDeviceAddress 0xa1 //读驱动地址指令sbit AT24C02_SCL = 0xa4;sbit AT24C02_SDA = 0xa5;/*-------------------------------------------------------------功能:发起始信号------------------------------------------------------------*/void Start_Cond(){AT24C02_SCL = 0;_nop_();AT24C02_SDA = 1;_nop_();AT24C02_SCL = 1;_nop_();AT24C02_SDA = 0;_nop_();}/*-------------------------------------------------------------功能:发停止信号------------------------------------------------------------*/void Stop_Cond(){AT24C02_SCL = 0;_nop_();AT24C02_SDA = 0;_nop_();AT24C02_SCL = 1;_nop_();AT24C02_SDA = 1;_nop_();/*------------------------------------------------------------- 功能:发确认信号------------------------------------------------------------*/ void Ack(){AT24C02_SCL = 0;_nop_();AT24C02_SDA = 0;AT24C02_SCL = 1;_nop_();AT24C02_SCL = 0;_nop_();AT24C02_SDA = 1;}/*------------------------------------------------------------- 功能:发无确认信号------------------------------------------------------------*/ void NoAck(){AT24C02_SCL = 0;_nop_();AT24C02_SDA = 1;_nop_();AT24C02_SCL = 1;_nop_();AT24C02_SCL = 0;_nop_();}/*------------------------------------------------------------- 功能:写一个字节数据------------------------------------------------------------*/ bit Write8Bit(unsigned char input){unsigned char i;for (i=0;i<8;i++){A T24C02_SCL = 0;input <<= 1;A T24C02_SDA = CY;A T24C02_SCL = 1;}AT24C02_SCL = 0;_nop_();AT24C02_SDA = 1;AT24C02_SCL = 1;_nop_();CY = AT24C02_SDA;return(CY) ;}/*-------------------------------------------------------------功能:读一个字节数据------------------------------------------------------------*/unsigned char Read8Bit(){unsigned char temp,rbyte=0;for (temp = 8;temp != 0;temp--){A T24C02_SCL = 0;_nop_();rbyte = (rbyte << 1) | AT24C02_SDA;A T24C02_SCL = 1;_nop_();}return rbyte;}/*-------------------------------------------------------------功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针nContent开头的往下内容。
------------------------------------------------------------*/bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen ) {unsigned char Addr;Addr = nAddr;Start_Cond(); //写开始信号Write8Bit(WriteDeviceAddress); //写驱动地址Write8Bit(Addr); //写从EEPROM中读的开始地址Start_Cond(); //写开始信号Write8Bit(ReadDeviceAddress); //写读数据指令while(--nLen){*nContent=Read8Bit(); //读出内容nContent++; //指针加1Ack(); //发确认信号}*nContent=Read8Bit(); //读一字节NoAck(); //没有确认信号Stop_Cond(); //发停止信号return(0); //返回}/*-------------------------------------------------------------功能:初始化EEPROM子程序内容为FF------------------------------------------------------------*/bit Init_Flash ( unsigned int nPage ) // 8 Byte/1Page init 0xFF{unsigned char nLen;unsigned char Addr;nLen=8;Addr=8 *nPage;Start_Cond();Write8Bit(WriteDeviceAddress);Write8Bit(Addr);for(;nLen!=0;nLen--){if(Write8Bit(0xff)) break; //if Write8Bit() Return 1 Write Flase}Stop_Cond();return(CY);}/*-------------------------------------------------------------功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针nContent开头的往下内容。
------------------------------------------------------------*/bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen) {unsigned char i,temp;unsigned char Addr;Addr = nAddr;Start_Cond(); //写开始信号Write8Bit(WriteDeviceAddress); //写驱动地址Write8Bit(Addr); //写从EEPROM中写的开始地址for(i = 0;i < nLen;i++){if(Addr%8==0) //每页8字节//换页{Stop_Cond();_nop_();Start_Cond();Write8Bit(WriteDeviceAddress);Write8Bit(Addr);}temp = *nContent;if(Write8Bit(temp)) break; //CYnContent++;Addr++;}Stop_Cond(); //发停止信号return(CY);}/*-------------------------------------------------------------主程序功能:实现存储器EEPROM AT24C02的数据读写操作------------------------------------------------------------*/void main(){unsigned char dat[16],i;Read_Flash(dat,0,16); //读出AT24C02中从地址0开始依次往后16个字节放入dat 数组中Init_Flash(0); //将AT24C02的第0页初始化为FFRead_Flash(dat,0,16); //读出AT24C02中从地址0开始依次往后16个字节放入dat 数组中for(i = 0;i < 16;i++ ){dat[i] = i; //对数组dat初始化为0---F}Write_Flash(dat,0,16); //将dat数组中的数据写入AT24C02中地址从0开始Read_Flash(dat,1,16); //读出AT24C02中从地址1开始依次往后16个字节放入dat 数组中while(1){i = 9;}}。