24c02读写程序教学资料
24C02数据读写

sbit wei1=P1^0;
sbit wei2=P1^1;
/************24C02 数据和时钟端口定义*****************/
sbit sda=P2^7;
sbit scl=P2^6;
/***************八段共阳 LED 编码***********************/ uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0x40};
//---实现功能:
//---开始时从 24C02 中读取秒表信息
//
//---每一秒向 24C02 中写一次信息
//---断电或复位重启后从断点前的那一秒开始计数
//
/****************************************************/
/**************包含头文件****************************/
void respons() //应答 {
uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } /************IIC 初始化****************************/ void init() { sda=1;
寻址。 1.总线上数据的有效性
IIC 总线是以串行方式传输数据,从数据字节的最高位开始传送,每一个数据位在 SCL 上都有一个时钟脉冲相对应。 在时钟线高电平期间数据线上必须保持稳定 的逻辑电平状态,高电平为数据 1,低电平为数据 0。只有在时钟线为 低电平时,才允许数据线上的电平状态变化,如图 11-2 所示。 2.总线上的信号 IIC 总线在传送数据过程中共有四种类型信号,它们分别是:开始信号、停止信号、重新开始信号和应答信号。
I2C24LC02C读写例程(PIC单片机)

I2C24LC02C读写例程(PIC单片机)I2C 24LC02 C读写例程(PIC单片机)[单片机]发布时间:2008-04-22 10:11:001 I2C总线特点I2C总线最主要的优点是其简单性和有效性。
由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。
总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
I2C总线的另一个优点是,它支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。
一个主控能够控制信号的传输和时钟频率。
当然,在任何时间点上只能有一个主控。
2 I2C总线工作原理I2C总线上的数据稳定规则,SCL为高电平时SDA上的数据保持稳定,SCL为低电平时允许SDA变化。
如果SCL处于高电平时,SDA 上产生下降沿,则认为是起始位,SDA上的上升沿认为是停止位。
通信速率分为常规模式(时钟频率100kHz)和快速模式(时钟频率400kHz)。
同一总线上可以连接多个带有I2C接口的器件,每个器件都有一个唯一的地址,既可以是单接收的器件,也可以是能够接收发送的器件。
每次数据传输都是以一个起始位开始,而以停止位结束。
传输的字节数没有限制。
最高有效位将首先被传输,接收方收到第8位数据后会发出应答位。
数据传输通常分为两种:主设备发送从设备接收和从设备发送主设备接收。
这两种模式都需要主机发送起始位和停止位,应答位由接收方产生。
从设备地址一般是1或2个字节,用于区分连接在同一I2C上的不同器件。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC 发出特定的低电平脉冲,表示已收到数据。
读写24c02

24C02作用:保存数据,避免掉电丢失。
IIC总线工作原理
开始信号:当SCL(时钟信号)为高电平的时候,SDA从高电平突然跳变为低电平那一瞬间,24C02就认为那是一个开始信号。
停止信号:当SCL为高电平的时候,SDA从低电平突然跳变为高电平那一瞬间。
应答信号:当单片机向24C02发送了一帧8位的数据之后,将SCL置1,然后读取SDA是否为0,如果为0则证明24C02已经返回了
应答信号,如果一段时间之后SDA仍然不为0,就自动认为已正确接收到数据。
据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
最好的24C02储存开机次数实验读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。
串行EEPROM简称I2C总线式串行器件。
串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。
I2C总线是一种用于IC器件之间连接的二线制总线。
它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。
我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。
相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。
将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。
将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。
烧写后用手按复位键可以看到数码管每按一下加一。
程序流程图:汇编语言参考程序: SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。
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。
AT24C02的读写

; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数n
EEPW: MOVP1,#0FFH
CLRP1.0;发开始信号
MOVA,R3;送器件地址
ACALLSUBS
MOVA,R4;送片内字节地址
ACALLSUBS
AGAIN: MOVA,@R1
ACALL SUBS;调发送单字节子程序INCR1
DJNZR7,AGAIN;连续写n个字节
CLRP1.0;SDA置0,准备送停止信号
ACALLDELAY ;延时以满足传输速率要求
SETBP1.1;发停止信号
ACALLDELAY
SETBP1.0
RET
SUBS: MOVR0,#08H ;发送单字节子程序
LOOP: CLRP1.1
RLCA
MOVP1.0,C
SETOK: ACALL DELAY
SETBP1.1
ACALL DELAY
CLRP1.1
ACALL DELAY
SETBP1.0;应答毕,SDA置1
RET
程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成
RET
SUBR: MOVR0,#08H ;接受单字节子程序
LOOP2: SETBP1.1
ACALL DELAY
MOVC,P1.0
RLCA
CLRP1.1
ACALL DELAY
DJNZ R0,LOOP2
CJNE R7,#01H,LOW
SETB P1.0;若是最后一个字节置A=1
24C02数据读写

一这物行时每如一、认识IIC 这是最常用、物理结构上,行信息 传输。
时钟。
信息传每个器件都有如:存储器)C 总线的工作方最典型的II IIC 系统由一。
在数据传输传输的对象和方有一个唯一的地。
发送器或接方式C 总线连接方一条串行数据输时,由主机初方向以及信息地址,而且可接收器可以在IIC 时方式。
据线SDA 和一条初始化一次数息传输的开始可以是单接收的在主模式或从模时序24C02的条串行时钟线数据传输,主和终 止均由的器件(例如模式下操作,的操作 线SCL 组成。
主机使数据在S 主机决定。
如:LCD 驱动器这取决于芯片主机按一定的SDA 线上传输器)或者可以接片是否必须启的通信协议向输的同时还通过接收也可以发启动数据的传从机寻址和进过SCL 线传输发送的器件(例传输还是仅仅被进输例被寻1I 在低2I 寻址。
1.总线上数据IIC 总线是以在时钟线高电低电平时,才2.总线上的信IIC 总线在传据的有效性串行方式传输电平期间数据线才允许数据线上信号送数据过程中输数据,从数据线上必须保持上的电平状态中共有四种类据字节的最高持稳定 的逻辑态变化,如图类型信号,它们高位开始传送,辑电平状态,11-2所示。
们分别是:开,每一个数据位高电平为数据开始信号、停止位在SCL 上都据1,低电平为止信号、重新都有一个时钟为数据0。
只新开始信号和应脉冲相对应。
有在时钟线为应答信号。
为开的停停重之所开始信号(STA 的时候,例如停止信号(STO 停止信号,结重新开始信号之前,主机通所示,当SCL ART):如图1如,没有主动设OP):如图11结束数据通信。
号(Repeated S 通过发送重新开L为高电平时,1-3所示,当设备在使用总-3所示,当。
START):在I 开始信号,可,SDA由高电当SCL 为高电总线(SDA 和S SCL 为高电平IC 总线上,由可以转换与当电平向低电平跳平时,SDA 由CL 都处于高电平时,SDA 由低由主机发送一前从机的通信跳变,产生重由高电平向低电电平),主机通低电平向高电一个开始信号启信模 式,或是重新开始信号,电平跳变,产通过发送开始电平跳变,产生启动一次通信是切换到与另,它的本质就产生开始信号始(START)信号生停止信号。
单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写

单片机程序设计实践教程_第17章_EEPROM器件AT24C02
读写
本章主要介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
EEPROM是一种非易失性存储器,可以在电源关闭后保持数据的存储,适用于存储一些关键的配置信息或数据。
首先,需要连接单片机与AT24C02,常见的连接方式有两根数据线(SDA和SCL),两根线分别连接到单片机的I2C总线接口上。
在进行读写操作之前,需要进行初始化,设置相关的参数,如器件地址、时钟频率等。
然后,可以使用相应的读写函数对AT24C02进行读写操作。
对于读操作,需要指定读取的地址和数据长度。
可以使用一个循环来
连续读取多个数据,也可以单独读取一些地址上的数据。
读取的数据保存
在单片机的缓存中,可以根据需要进行处理或显示。
对于写操作,同样需要指定写入的地址和数据。
可以通过循环连续写
入多个数据,也可以单独写入一些地址上的数据。
写入操作完成后,要记
得进行等待,等待数据写入完成。
需要注意的是,AT24C02有一定的写入周期,写入速度较慢。
因此,
在进行连续写入操作时,需要考虑到写入速度,避免写入过快导致数据丢
失或写入错误。
本章还介绍了一些常见的应用场景,如存储温度、湿度等传感器数据,存储用户配置信息等。
总的来说,本章介绍了如何使用单片机与EEPROM器件AT24C02进行读写操作。
通过实践这些内容,可以更好地掌握EEPROM的应用和使用方法,为后续的项目实践提供参考。
最好的24C02储存开机次数实验 读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。
串行EEPROM简称I2C总线式串行器件。
串行器件不仅占用很少的资源和I/O 线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。
I2C总线是一种用于IC器件之间连接的二线制总线。
它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。
我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。
相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。
将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。
将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。
烧写后用手按复位键可以看到数码管每按一下加一。
程序流程图:汇编语言参考程序: SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。
24c02读写--相关资料

24c02读写—相关资料AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5 V)、擦写次数多(大于10 000次)、写入速度快(小于10 ms)、抗干扰能力强、数据不易丢失、体积小等特点。
而且他是采用了I2C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。
1 AT24C02的引脚功能AT24C02引脚如图1所示。
他的的1、2、3脚是3根地址线,用于确定芯片的硬件地址。
第8脚和第4脚分别为正、负电源。
第5脚SDA为串行数据输入/输出,数据通过这根双向I2C总线串行传送。
第6脚SCL为串行时钟,SDA和SCL为漏极开路端,在实际的应用当中都需要和正电源间各接一个5.1 kΩ的电阻上拉。
第7脚为WP写保护端,接地时允许芯片执行一般的读写操作;接正电源时只允许对器件进行读操作。
2 AT24C02的内部结构图2为AT24C02的内部结构图。
启动、停止逻辑单元 接收数据引脚SDA上的电平信号,判断是否进行启动和停止操作串行控制逻辑单元 根据SCL,SDA电平信号以及“启动、停止逻辑”部件发出的各种信号进行区分,并排列出有关的“寻址”、“读数据”和“写数据”等逻辑,将他们传送到相应的操作单元。
例如:当操作命令为“寻址”时候,他将通知地址计数器加1,并启动“地址比较”器进行工作。
在“读数据”时,他控制“Dout/确认逻辑”单元;在“写数据”时候,他控制“高压泵/定时”电路,以便向E2PROM电路提供编程所需要的高电压。
地址/计数器单元 产生访问E2PROM所需要的存储单元的地址,并将其分别送到X译码器进行字选,送到Y译码器进行位选。
高压泵/定时单元 由于E2PROM数据写入时候需要向电路施加编程高电压,为了解决单一电源电压的供电问题,芯片生产厂家采用了电压的片内提升电路。
电压的提升范围一般可以达12~21.5 V。
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;}。
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;}。
电气化自动技术 实验8-- 24C02读写-实验指导书

实验八 24C02读写实验一、实验概述使用I2C对24C02进行读写,记录开机的次数。
二、实验目的1、掌握单片机IO模拟I2C总线的方法。
2、了解EEPROM保存数据的特性。
三、实验预习要求1、AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。
AT24C02有一个16字节页写缓冲器。
该器件通过IIC总线接口进行操作,有一个专门的写保护功能。
2、器件寻址:前八位是地址地址信号,从最高位(MSB)开始,其中前四位是固定值1010,后三位有管脚A0、A1、A2的基地情况确定。
最后一位是读写控制信号,0表示写,1表示读。
若与SDA线发送过来的地址比较一致,则器件输出应答0,否则将返回等待状态。
器件内部地址寻址是在器件寻址之后,对256个字节进行寻址,直接传送8位地址信号(00-FF)对应于器件内部的地址。
四、实验原理在实际的应用中,保存在单片机 RAM 中的数据,掉电后就丢失了,保存在单片机的FLASH 中的数据,又不能随意改变,也就是不能用它来记录变化的数值。
但是在某些场合,我们又确实需要记录下某些数据,而它们还时常需要改变或更新,掉电之后数据还不能丢失,比如我们的家用电表度数,电视机里边的频道记忆,一般都是使用EEPROM 来保存数据,特点就是掉电后不丢失。
本实验使用的这个器件是 24C02,是一个容量大小是 2Kbits,也就是 256 个字节的 EEPROM。
一般情况下,EEPROM 拥有30 万到 100 万次的寿命,也就是它可以反复写入 30-100 万次,而读取次数是无限的。
24C02 是一个基于 I2C 通信协议的器件,因此,使用24C02还需要了解I2C通信协议。
I2C 多用于板内通信,比如单片机和EEPROM 之间的通信。
在硬件上,I2C 总线是由时钟总线 SCL 和数据总线 SDA 两条线构成,连接到总线上的所有器件的 SCL 都连到一起,所有 SDA 都连到一起。
单片机对存储器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);}。
最好的24C02储存开机次数实验 读写程序

24C02储存开机次数实验24C02是2K字节的串行EEPROM, 内部含有256个8位字节,该器件通过总线操作,并有专门的写保护功能。
串行EEPROM简称I2C总线式串行器件。
串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。
I2C总线是一种用于IC器件之间连接的二线制总线。
它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。
我们通过一个实验来了解24C02的读写操作过程:该实验功能是单片机复位一次,自动从24C02中读取数据,然后加1,最终数码管中的数据就是开机的次数,具有一定的实用意义。
相关原理:程序运行的照片:接线方法:1、接8位数码管的数据线。
将数码管部份的数据口 JP5接到CPU部份的P0口JP51.2、接8位数码管的显示位线。
将数码管部份的显示位口 JP8接到CPU部份的P2口JP52.3、用一根2PIN数据线一端插入CPU部份JP53(P3口)的P3.6,P3.7另外一端插入24C02部份的控制端JP38。
烧写后用手按复位键可以看到数码管每按一下加一。
程序流程图:汇编语言参考程序:SDA24 EQU P3.7 SCLK24 EQU P3.6 ORG 0000HAJMP MAINORG 0080HMAIN:CLR P3.7 ;打开写保护MOV DPTR,#TABMOV A,#00H ;读地址LCALL RD24CJNE A,#10,TTTT: JNC TT1AJMP TT2TT1: MOV A,#00TT2: MOV 30H,AMOVC A,@A+DPTRCLR P2.6 ;开数码管MOV P0,A ;送显示MOV A,30HINC AMOV B,AMOV A,#00HLCALL WT24AJMP $TAB: DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60HRD24: PUSH ACC ;读24C02子程序。
24C02读写程序

24C02读写程序HT49 MCU系列单片机读写HT24系列的EEPROM应用范例HT49 MCU系列单片机读写HT24系列的EEPROM应用范例文件编码:HA0017s简介:HT24系列的EEPROM是通过I2C协议控制其读写的。
HT49系列单片机的接口部分是简单I/O 口,可以用来很方便地采用I2C协议控制周边器件。
HT24系列的EEPROM总共8个管脚,三个为芯片地址脚A0、A1、A2,在单片机对它进行操作时,从SDA输入A0、A1、A2数据和芯片外部A0、A1、A2所接地址需一一对应。
一个为芯片写保护脚WP,WP脚接低电平时,芯片可进行读写操作;WP脚接高时,芯片只可进行读,不可进行写。
另外两个管脚为电源脚VCC,VSS。
用单片机对HT24系列的EEPROM进行控制时,HT24系列的EEPROM的外部管脚VCC、VSS、WP、A0、A1、A2根据需要,对应接上,SDA、SCL接到单片机控制脚上。
引脚名称I/O 功能描述A0~A2 I地址输入VSS I电源负极输入SDA I/O串行数据输入/输出SCL I串行数据传送时钟信号输入WP I写保护VCC I电源正极输入HT24系列的EEPROM根据型号不同,EEPROM的容量大小不同,当EEPROM的空间大于1页(256bytes)时,即大于2048bits,则HT49 MCU需要控制A0、A1、A2来确定写HT24系列的EEPROM 的第几页,HT24系列的EEPROM空间大小如下表所示:型号引脚A0、A1及A2使用方法容量大小HT24LC02 A0、A1、A2引脚作为器件地址输入,从SDA输入A0、A1、A2数据和芯片引脚A0、A1、A2所接状态需一一对应2K(256×8)HT24LC04 A1、A2引脚作为器件地址输入,从SDA输入A1、A2数据和芯片引脚A1、A2所接状态需一一对应,A0引脚浮空4K(512×8,2pages)HT24LC08 A2引脚器件地址输入,从SDA输入A2数据和芯片引脚A2所接状态需一一对应,其余引脚浮空8K(1024×8,4pages)HT24LC16 A0、A1、A2全部浮空,不必接16K(2048×8,8pages)HT49 MCU系列单片机读写HT24系列的EEPROM应用范例程式说明:本文是以HT49R30A-1控制HT24LC04为例的。
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)。
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总线中的信号都必须符合上述的有效性呢?只有两个例外,就是开始和停止信号。
开始信号:当SCL为高电平时,SDA发生从高到低的跳变,就定义为开始信号。
停止信号:当SCL为高电平时,SDA发生从低到高的跳变,就定义为结束信号。
开始和结束信号的时序图如下图所示:2、数据传输的字节格式SDA传送数据是以字节为单位进行的。
每个字节必须是8位,但是传输的字节数量不受限制,首先传送的是数据的最高位。
每次传送一个字节完毕,必须接收到从机发出的一个应答位,才能开始下一个字节的传输。
如果没有接受到应答位,主机则产生一个停止条件结束本次的传送。
那么从机应该发出什么信号算是产生了应答呢?这个过程是这样的。
当主器件传送一个字节后,在第9个SCL时钟内置高SDA线,而从器件的响应信号将SDA拉低,从而给出一个应答位。
好啦,了解了I2C传输数据的格式,现在来研究双方传送的协议问题。
3、 I2C数据传输协议I2C总线的数据传输协议如下:(1)、主器件发出开始信号(2)、主器件发出第一个字节,用来选通相应的从器件。
其中前7位为地址码,第8位为方向位(R/W)。
方向位为“0”表示发送,方向位为“1”表示接受。
(3)、从机产生应答信号,进入下一个传送周期,如果从器件没有给出应答信号,此时主器件产生一个结束信号使得传送结束,传送数据无效。
(4)、接下来主、从器件正式进行数据的传送,这时在I2C总线上每次传送的数据字节数不限,但每一个字节必须为8位(传送的时候先送高位,再送低位)。
当一个字节传送完毕时,再发送一个应答位(第9位),如上一条所述,这样每次传送一个字节都需要9个时钟脉冲。
数据的传送过程如下图所示:(四)、24C02芯片相关介绍AT24C02是带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,并且可以象普通RAM一样用程序改写。
它的容量是256个字节(00h~0ffh),有A2、A1、A0三位地址,可见I2C总线上可以连接8片AT24C02,它的寻址字节是1010 A2A1A0 R/W。
板上面24C02的电路连接如图所示:我们对引脚的功能作一个简单的解释:VCC,GND:电源、地引脚A2A1A0:地址引脚SCLK、SDA:通信引脚WP:写保护引脚从上面的电路连接知:A2A1A0=000,可见如果要对24C02进行写操作,寻址字节是1010 000 0;如果对24C02进行读操作,寻址字节是1010 000 1。
用单片机的P1.6脚作为串行时钟线,用P1.7脚作串行数据线。
(五)、程序分析写过程:(1)、主机首先发出开始信号(2)、发出写24C02的寻址字节1010 000 0,即0A0H(3)、发数据写入24C02的地址,本例中为01H(4)、往24C02中写入数据,这里是3个字节,分别为48h,0ebh,52h。
(5)、写完毕发出停止信号读过程:(1)、主机发出start信号(2)、发写24C02的寻址字节1010 000 0(大家可能要问:我们是读数据,为什么要发写信号呢?这是因为你首先要送出一个信号,说明从24C02中的哪个地址读取数据。
)(3)、发要读取的数据在24C02中的地址,即01h(4)、主机发start信号(5)、发读24C02的寻址字节1010 000 1(5)、从24 C02中读取数据(6)、读取完毕发出停止信号在这个程序中,我们把开始信号,结束信号、写一个字节数据、读一个字节数据都编制成为通用的子程序,便于在程序中随时调用。
发送和接受应答位的过程放到子程序中,这样可以使得程序结构简化。
具体的程序如下所示,希望大家认真理解。
三、实验程序Org 0000hI2cdata equ 30h ;发送数据缓冲区的首址2402data equ 01h ;接受缓冲区首址numdata equ 03h ;传送的字节数,传送3个字节Sda bit p1.7Scl bit p1.6Ajmp mainMain: Lcall init ;初始化给30h,31h,32h中存入0,1,2的段码Mainwr:Lcall start ;启动Mov r7,#0a0hLcall send ;发送写24C02的寻址字节Mov r7,#2402dataLcall send ;发送数据存入24C02的地址Mov r5,#Numdata ;欲发送的字节数Mov r0,#i2cdata ;发送缓冲区的首址wrloop:Mov a,@r0Mov r7,aInc r0Lcall sendDjnz r5, wrloop ;把3个字节的数据发送出去lcall stop ;停止lcall d1smov r5,#Numdata ; 要读取的字节数重新赋值Mainre:lcall start ;启动Mov r7,#0a0hLcall send ;发送写24C02的寻址字节Mov r7,#2402dataLcall send ;发接受缓冲区首址Lcall start ; 再次启动Mov r7,#0a1hLcall send ;发送读24C02的寻址字节Reloop: Lcall read ;调用读取一个字节数据的子程序mov p0,r7 ;把读进来的数送到p0口显示lcall d1slcall d1sDjnz r5,reloopLcall stop ;3字节读取完毕发出停止信号Ajmp $init: mov p2,#0ffh ;初始化,30h、31h、32h中存入0、1、2的段码mov 30h,#48hmov 31h,#0ebhmov 32h,#52hretstart: setb sda ;启动信号子程序,大家可以参考开始信号的时序图setb scllcall d5uclr sdalcall d5uclr sclretstop: clr sda ;停止信号子程序setb scllcall d5usetb sdalcall d5uclr sdaclr sclret;send是发送一个字节子程序send: mov r6,#08hmov a,r7 ;要发送的数在r7中sendlop1 : rlc a ;左环移,把A的最高位移入cymov sda,c ;把cy的值通过sda发送出去setb scl ;在scl上产生一个时钟lcall d5uclr scldjnz r6, sendlop1 ;重复8次,发送一个字节;cack是检查应答信号的子程序cack: setb sda ;主机首先拉高sdasetb scl ;发出一个时钟lcall d5usendlop2:mov c,sda ;读入sda的状态,如果是0表示接受到了应答jc sendlop2clr scl ;接受到应答位,结束时钟retread: mov r6,#08h ;读取一个字节子程序readlop1: setb sda ;置sda为输入方式setb scl ;发出一个时钟lcall d5umov c,sda ;读入sda状态rlc a ;把该位的状态移入A中clr scl ;结束时钟djnz r6,readlop1 ;重复8次,读入一个字节mov r7,a ;读进来的数放在r7中;sack是发送应答位子程序sack: clr sda ;拉低sda线setb scl ;发出时钟信号lcall d5uclr sclsetb sdaretd5u: nop ;延时5us子程序nopnopnopnopretd1s: mov r1,#100 ;延时1s子程序del1: mov r4,#20del2: mov r3,#0ffhdel3: djnz r3,del3djnz r4,del2djnz r1,del1retend大家把这个程序下载到测试板上面,发现数码管依次显示数字0、1、2;简洁的24C02读写汇编程序;--------------------------------------------I2C_SDA EQU P1.6 ; PIN 5I2C_SCL EQU P1.7 ; PIN 6;======================================== =====I2C_WRITE: ; WRITE 8 BYTES TO EEROM ; INPUT: A - A*8 = EEROM START ADDR; R0 - RAN START ADDR ; USE: C, A, R0, R6, R7ACALL I2C_STARTACALL OUTMOV R6, #8WR_LP:MOV A, @R0ACALL OUTINC R0DJNZ R6, WR_LPAJMP I2C_STOP;======================================== ==I2C_READ: ; READ 8 BYTES FROM EEROM ; INPUT: A - A*8 = EEROM START ADDR; R0 - RAN START ADDR; USE: C, A, R0, R6, R7ACALL I2C_STARTACALL OUTMOV R6, #8MOV A, #0A1H; #RDCMD ACALL OUTSBRDLP:MOV R7, #8SETB I2C_SDA INLP: CLR I2C_SCLACALL DELAY6SETB I2C_SCLNOPMOV C, I2C_SDARLC ADJNZ R7, INLPCLR I2C_SCLMOV @R0, AINC R0DJNZ R6, ACKLP;;;;----------------------------I2C_STOP:CLR I2C_SDAACALL DELAY5SETB I2C_SCLACALL DELAY5SETB I2C_SDADELAY6:NOPDELAY5:NOPRET;;-----------------------------I2C_START:SWAP ARR AMOV R6, AMOV A, #0A0H; #WTCMDACALL OUTSMOV A, R6RET;------------------------------- ACKLP:CLR I2C_SDASETB I2C_SCLACALL DELAY5CLR I2C_SCLAJMP BRDLP;======================= OUTS:SETB I2C_SDASETB I2C_SCLACALL DELAY5CLR I2C_SDAACALL DELAY5CLR I2C_SCL;======================== OUT:SETB CMOV R7, #9OTLP: RLC ANOPMOV I2C_SDA, CNOPNOPSETB I2C_SCLACALL DELAY5CLR I2C_SCLDJNZ R7, OTLPRET;======================== END;SDA EQU P1.6 ;(你可以根据你的情况变更引脚);SCL EQU P1.7;D15US,D1MS子程序分别为15uS和1mS延时程序,请根据你的晶体自行编写。