AT24C02EEPROM读写程序

合集下载

I2C总线AT24C02存储器读写程序

I2C总线AT24C02存储器读写程序
respons();//写完后调用应答函数
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地址读数据

24c02读写程序大全

24c02读写程序大全

24c02读写程序大全2C总线的应用(24C02子程序)// 对24C02的读、写// extern void DelayMs(unsigned int);// extern void Read24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes);// extern void Write24c02(unsigned char *RamAddress,unsigned char Ro mAddress,unsigned char bytes);/***************************************************************************/#define WriteDeviceAddress 0xa0#define ReadDviceAddress 0xa1#include <reg52.h>#include <stdio.h>#include <absacc.h>/***************************************************************************/sbit SCL=P2^7;sbit SDA=P2^6;bit DOG;/***************************************************************************/void DelayMs(unsigned int number) {unsigned char temp;for(;number!=0;number--,DOG=!DOG) {for(temp=112;temp!=0;temp--) {}}}/***************************************************************************/void Start() {SDA=1;SCL=1;SDA=0;SCL=0;}/***************************************************************************/void Stop() {SCL=0;SDA=0;SDA=1;}/***************************************************************************/void Ack() {SDA=0;SCL=1;SCL=0;SDA=1;}/***************************************************************************/void NoAck() {SDA=1;SCL=1;SCL=0;}/***************************************************************************/bit TestAck() {bit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);}/***************************************************************************/void Write8Bit(unsigned char input) {unsigned char temp;for(temp=8;temp!=0;temp--) {SDA=(bit)(input&0x80);SCL=1;SCL=0;input=input<<1;}}/***************************************************************************/void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsign ed char number) {Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();for(;number!=0;number--) {Write8Bit(*Wdata);TestAck();Wdata++;}Stop();DelayMs(10);}/***************************************************************************/ unsigned char Read8Bit() {unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp--) {SCL=1;rbyte=rbyte<<1;rbyte=rbyte|((unsigned char)(SDA));SCL=0;}return(rbyte);}/***************************************************************************/void Read24c02(unsigned char *RamAddress,unsigned char RomAddress, unsigned char bytes) {//unsigned char temp,rbyte;Start();Write8Bit(WriteDeviceAddress);TestAck();Write8Bit(RomAddress);TestAck();Start();Write8Bit(ReadDviceAddress);TestAck();while(bytes!=1) {*RamAddress=Read8Bit();RamAddress++;bytes--;}*RamAddress=Read8Bit();NoAck();Stop();}[单片机应用]24c02的读写程序电子工匠发表于2007-1-4 22:33:07;---------------从24C02整组读数据RD_INI: LCALL DELAYRD_AREA: LCALL DELAYLCALL STARTLCALL DELAYLCALL WRITE ;24C02信息的读入LCALL DELAYLCALL ACKLCALL DELAYJC RD_AREAMOV R2, #8CLR P1.7 ;起始地址为00 ADDR_0: LCALL DELAYLCALL DELAYSETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, ADDR_0LCALL ACKLCALL DELAYJC RD_AREALCALL DELAYLCALL STARTMOV R0, #SAVE0MOV R3, #8 ;6个字节LCALL DELAYLCALL READLCALL DELAYLCALL ACKJC RD_AREARD_R_0: LCALL DELAYLCALL DELAYLCALL RD_INFOLCALL DELAYINC R0DJNZ R3, RD_R_1lcall ack_2lcall delayLCALL STOPRETrd_r_1: lcall ack_1sjmp rd_r_0;---------------向24C02整组写数据WR_INI: LCALL DELAYLCALL STARTLCALL DELAYLCALL WRITELCALL DELAYLCALL ACKLCALL DELAYJC WR_INICLR P1.7MOV R2, #8WR_W_0: LCALL DELAY ;写地址SETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, WR_W_0LCALL DELAYLCALL ACKLCALL DELAYJC WR_INIMOV R0, #SAVE0MOV R3, #8 ;6个字节WR_W_1: LCALL WR_INFOLCALL DELAYLCALL ACKLCALL DELAYJC WR_INIINC R0DJNZ R3, WR_W_1LCALL DELAYLCALL STOPRET;---------------24C02启动START: SETB P1.7SETB P1.6LCALL DELAYCLR P1.7LCALL DELAYCLR P1.6RET;---------------24C02读命令字;片选为"00";---------------------------- READ: MOV A, #10100001B MOV R2, #8RD1: RLC AMOV P1.7, CSETB P1.6LCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, RD1RET;---------------24C02写命令字;片选为"00";---------------------------- WRITE: MOV A, #10100000B MOV R2, #8WR1: RLC AMOV P1.7, CSETB P1.6LCALL DELAYCLR P1.6CLR P1.7LCALL DELAYDJNZ R2, WR1RET;---------------24C02结束命令字STOP: CLR P1.7LCALL DELAYSETB P1.6LCALL DELAYSETB P1.7LCALL DELAYCLR P1.6RET;---------------24C02的应答信息ACK: SETB P1.7SETB P1.6LCALL DELAYmov a, p1MOV C, a.7LCALL DELAYCLR P1.6RETack_1: CLR P1.7 ;应答SETB P1.6lcall delayCLR P1.6lcall delaySETB P1.7lcall delayRETack_2: SETB P1.7 ;非应答SETB P1.6lcall delayCLR P1.6CLR P1.7lcall delayRET;---------------24C02的读;R0:数据的存储地址;-------------------------------- RD_INFO: SETB P1.7LCALL DELAYMOV R2, #8MOV R7, #0MOV A, #0RD_I_0: SETB P1.6LCALL DELAYMOV A, P1MOV C, A.7LCALL DELAYCLR P1.6MOV A, R7RLC AMOV R7, ALCALL DELAYDJNZ R2, RD_I_0MOV @R0, ARET;---------------24C02的写;R0:数据的写数据地址;-----------------------------------WR_INFO: MOV A, @R0MOV R2, #8WR_O_0: RLC AMOV P1.7, CLCALL DELAYSETB P1.6LCALL DELAYLCALL DELAYCLR P1.6LCALL DELAYDJNZ R2, WR_O_0RET24Cxx I2C EEPROM字节读写驱动程序,芯片A0-A1-A2要接GND(24C65接VCC,具体看DataSheet)。

AT24C02的读写

AT24C02的读写
; R3=10100000(命令1010+器件3位地址+读/写。器件地址一个芯片,是000)
; (R4)=片内字节地址
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数n
EEPW: MOVP1,#0FFH
CLRP1.0;发开始信号
MOVA,R3;送器件地址
ACALLSUBS
MOVA,R4;送片内字节地址
RET
;读串行E2PROM子程序EEPR
;(R1)=欲读数据存放地址指针
;; R3=10100001(命令1010+器件3位地址+读/写。器件地址一个芯片,是000)
;(R4)=片内字节地址
;(R7)=连续读字节数
EEPR: MOVP1,#0FFH
CLRP1.0;发开始信号
MOVA,R3;送器件地址
MOV DPTR,#0600H;定义源数据的位置
LOOP:MOV A,#00H
MOVC A,@A+DPTR
LCALL SDATA
LCALL ACK
JC LOOP
INC DPTR
DJNZ R2,LOOP
LCALL STOP;调用停止子程序
STAR:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
应答毕sdaret程序中多处调用了delay子程序仅两条nop指令这是为了满足i2c总线上数据传送速率的要求只有当sda数据线上的数据稳定下来之后才能进行读写即scl线发出正脉冲
AT24C02的读写
作者:来源:阅读次数:372
AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。

C51编写的AT24C02详细的读写程序

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个数码管。

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写

单片机程序设计实践教程_第17章_EEPROM器件AT24C02读写
1.加深对IIC总线通信工作方式及原理的理解; 2.掌握24C02芯片的功能以及在本开发板中所起的作用; 3.掌握EEPROM器件电路的连接方法; 4.理解对24C02进行写和读控制的软件编制方法; 5.在达到以上四点目标的基础上,根据本章“项目扩展任 务”中提出的问题,以组或个人为单位,在规定时间里 完成扩展项目任务。
4
图17-1 24C02读写项目的电路原理图 17- 24C02读写项目的电路原理图
5
17.3 系统板上硬件连线
PMY单片机开发板上24C02读写控制项目的连接插线设置如图 17-2所示。
24C02读写项目的连接插线设置 图17-2 开发板上24C02读写项目的连接插线设置 17- 开发板上24C02
3
17.2 项目任务
24C02读写控制项目的电路原理图如图17-1所示。在第17章已 经介绍过,STC89C52RC单片机本身不包含I2C总线通信控制器的 功能,为了与具有I2C总线通信和存储功能的EEPROM器件24C02 芯片进行数据交换,STC89C52RC单片机必须利用自身的两根 I/O线(这里是P14和P15引脚),作为I2C的SDA和SCL信号线,利 用 软 件 模 拟 产 生 I2C 通 信 协 议 规 定 的 传 输 数 据 信 号 , 以 完 成 与 24C02芯片之间的数据交换。 本次项目应完成以下程序设计:通过C51嵌入式软件对24C02指 定的多个连续地址写入指定数值,再读出已写入24C02器件地址的 数值,并在七段LED数码管上进行显示。
14
如何在项目中实现24C02 24C02的读写 17.6.3 如何在项目中实现24C02的读写
程序中的_24C02_WriteByte函数是向指定从地址器件的特定寄 存器地址写入一个字节数据,虽然与数字钟设计项目程序中的 PCF8563_WRINIT函数功能类似,但只是完成了向从器件传送一 个字节数据的功能。而PCF8563_WRINIT函数则完成向从器件指 定地址写入多个指定字节数据,在本项目主程序main中的以下语 句同样可以实现主器件(STC89C52RC)向指定从器件(24C02) 的指定地址连续写入多个字节的功能: /*************以下语句为向24C02写入数据*****************/ _24C02_Fillbyte(20,0xff); //将前20字节用0xff填充 for(i=0;i<16;i++) _24C02_WriteByte(i,DispDat[i]); //将数组DispDat设定的 显示代码写入到24C02 /*************以上语句为向24C02写入数据*****************/

24c02读写程序大全

24c02读写程序大全
SETB SDA24
CLR SCLK24
CALL START24;启动
MOV A,#0A0H
CALL SHIFT8;移位
CALL ACK;响应
POP ACC
>SETB;应答毕,SDA置1
>RET
>程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传
送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正
脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。
>
>下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范
>ACALL SUBS
>MORE: ACALL SUBR
>MOV@R1,A
>INCR1
>DJNZ R7,MORE
>CLR
>ACALL DELAY
>SETB
>ACALL DELAY
>SETB;送停止信号
>RET
>SUBR: MOVR0,#08H ;接受单字节子程序
>LOOP2: SETB
>ACALL DELAY
TT2:MOV30H,A
MOVCA,@A+DPTR
CLR;开数码管
MOVP0,A;送显示
MOVA,30H
INCA
MOVB,A
MOVA,#00H
LCALLWT24
AJMP$
TAB:DB28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
RD24: PUSH ACC;读24C02子程序。

AT24C02串行E2PROM的工作原理与读写

AT24C02串行E2PROM的工作原理与读写

AT24C02串行E2PROM的工作原理与读写串行EEPROM中,较为典型的有ATMEL公司的AT24CXX系列和AT93CXX等系列产品。

简称I2C总线式串行器件。

串行器件不仅占用很少的资源和I/O线,而且体积大大缩小,同时具有工作电源宽、抗干扰能力强、功耗低、数据不易丢失和支持在线编程等特点。

I2C总线是一种用于IC器件之间连接的二线制总线。

它通过SDA(串行数据线)及SCL (串行时钟线)两根线在连到总线上的器件之间传送信息,并根据地址识别每个器件:不管是单片机、存储器、LCD驱动器还是键盘接口。

1.I2C总线的基本结构:采用I2C总线标准的单片机或IC器件,其内部不仅有I2C接口电路,而且将内部各单元电路按功能划分为若干相对独立的模块,通过软件寻址实现片选,减少了器件片选线的连接。

CPU不仅能通过指令将某个功能单元电路挂靠或摘离总线,还可对该单元的工作状况进行检测,从而实现对硬件系统的既简单又灵活的扩展与控制。

I2C总线接口电路结构如图1所示。

从图中可以看出:对于时钟及数据传送,串行数据I/O端SDA一般需要用外部上拉电阻将其电平拉高。

2.双向传输的接口特性:传统的单片机串行接口的发送和接收一般都分别用一条线,如MCS51系列的TXD和RXD,而I2C总线则根据器件的功能通过软件程序使其可工作于发送或接收方式。

当某个器件向总线上发送信息时,它就是发送器(也叫主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。

主器件用于启动总线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。

I2C总线的控制完全由挂接在总线上的主器件送出的地址和数据决定。

总线上主和从(即发送和接收)的关系不是一成不变的,而是取决于此时数据传送的方向。

SDA和SCL均为双向I/O线,通过上拉电阻接正电源。

当总线空闲时,两根线都是高电平。

连接总线的器件的输出级必须是集电极或漏极开路,以具有线“与”功能。

24c02读写程序

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。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;--------------------------------------------------------------------------------------------------------------------- ;本程序是针对AT89S52单片机编制的EEPROM读写程序(2013.8.4测试通过);本程序在4MHZ、12MHZ和24MHZ分别测试通过;AT24C02的A0、A1、A2均接GND,设备地址高7位为(1010)000;WP接GND,充许对EEPROM正常读写;本程序仅作学习交流之用。

;--------------------------------------------------------------------------------------------------------------------- SCl equ P2.0 ;SCL接A T89S52的P2.0端口,作为EEPROM的串行输入时钟SDA equ P2.1 ;SDA接AT89S52的P2.1端口,作为主机与EEPROM之间信息串行传输总线WRITEDATA equ 08H;拟写入EEPROM的数据在主机中的存贮单元地址READDATA equ 09H ;从EEPROM读取的数据存放到主机存贮单元地址EPROMADDRESS equ 0AH;拟随机读写EEPROM的存贮单元地址;------------------------------------------------ORG 00HLJMP MAIN;------------------------------------------------ORG 50HMAIN: MOV SP,#20H;防止堆栈影响已用内存数据;以下为写EEPROM过程mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同MOV WRITEDA TA,#01010010B;该数字可以随意输入,并将读和写的数据进行比较;如读数正确则按将读出数据在P1口输出,可在P1口各位分别接LED灯直观显示出来。

LCALL WRITEEEPROMR;以下为读EEPROM过程mov EPROMADDRESS,#09H;该地址可以随意输入(00H~FFH),但读和写的地址须相同LCALL READEEPROMR;以下为EEPROM读写操作验证MOV A,WRITEdataMOV B,AMOV A,READDATACJNE A,B,MAIN1MOV P1,READDATA;写入数和读出数相等时,读出的数据在P1口输出并按位分别控制LED灯直观显示sJMP $MAIN1: MOV P1,#00H;写入数和读出数相等时,LED灯全亮;以下可接其它主程序,此处暂为死循环SJMP $;--------------------------------------------------------------------------------------------------------------------- ;WRITEEEPROMR是随机写EEPROM(AT24C02)子程序;入口1:EEPROMADRESS(拟读写EEPROM存贮单元地址,00~FFH);入口2:WRITEDATA(拟写入EEPROM的字节数据在主机的存放地址);--------------------------------------------------------------------------------------------------------------------- WRITEEEPROMR:;第1步,启动EEPROM读写操作lcall startEEPROM;调用启动子程序;第2步,输入设备号和功能选择码即10100000BMOV A,#10100000B;1010是规定的,000是设备地址,最低位0表示拟执行写操作LCALL SENDDA TA;调用串行发送字节数据子程序;第3步查询EEPROM应答信号情况LCALL WAITACK;调用应答响应子程序;第四步,传送数据拟贮存地址给EEPROM的地址指针MOV A,EPROMADDRESS;将拟贮存数据的EEPROM贮存单元地址送入SENDDATA子程序的入口ALCALL SENDDA TA;第五步,查询EEPROM应答信号情况LCALL WAITACK;调用应答响应子程序;第六步,传送8位数据到EEPROM缓存区,该循环完成第二个8时序(时序1~8)MOV A,writedataLCALL SENDDA TA;第七步,查询EEPROM应信号情况,完成第三个应答时序(时序9)LCALL WAITACK;调用应答响应子程序;第五步,主器件产生一个停止信号,即在scl高位时SDA由低到高跳变信号;让EEPROM自主启动内部写周期,将EERPOM缓存区数据写入EEPROMclr sdasetb SCL;该两句有两个作用,一方面是本次EEPROM操作的停止命令,让EEPROM 启动写周期;SETB SDA;另一方面,为下一次EEPROM读写操作作好了准备,只等启动命令到来。

;第六步,延迟等待写周期完成,否则影响下一次的读写EEPROM操作。

;应根据晶振频率调整下列的延迟时间MOV R0,#0FFHDELAYLOOP: NOPNOPNOPNOPNOPNOPNOPDJNZ R0,DELAYLOOPRET;----------------------------------------------------------------------------------------------------;随机读EEPROM(A T24C02)子程序;入口:EEPROMADRESS(拟读EEPROM存贮单元地址,00~FFH);出口:READDATA(读出字节数据在主机的存放地址);---------------------------------------------------------------------------------------------------- READEEPROMR:;第1步,启动EEPROM读写操作(时序0)lcall startEEPROM;调用启动子程序(时序1~8)?;第2步,输入设备号和功能选择码即10100000BMOV A,#10100000B;1010是规定的,000是设备地址,最低位0表示拟执行写操作LCALL SENDDA TA;调用串行发送字节数据子程序;第3步查询EEPROM应答信号情况(时序9)LCALL WAITACK;调用应答响应子程序;第四步,传送数据拟贮存地址给EEPROM的地址指针(时序1~8)MOV A,EPROMADDRESS;将拟贮存数据的EEPROM贮存单元地址送入SENDDATA子程序的入口ALCALL SENDDA TA;第五步,查询EEPROM应答信号情况(时序9)LCALL WAITACK;调用应答响应子程序;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;以上五步均属于伪写操作。

;因未实际输入输出数据和写周期,其内部数据地址指针不作变化,仍指向刚输入的地址;以下实际就是立即读操作,读出数据指针所指的地址单元内容,分六个步骤:;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;(1)启动EEPROM读写操作(时序0)?lcall startEEPROM;调用启动子程序;(2)输入设备号和功能选择码即10100001B;此处R/W位(最低一位)取1,表明读操作;使用了8个SCL时钟时序(时序1~8)MOV A,#10100001BLCALL SENDDA TA;(3)查询EEPROM应答信号情况(时序9)?LCALL WAITACK;(4)EEPROM输出一个8位数据到SDA总线上,主机作接收处理,使用8个SCL 时钟时序(时序1~8)lcall receivedataMOV READDATA,A;(5)不产生应答信号,但应保留应答时序SETB sclCLR scl;(6)主机发出停止信号clr sdasetb SCL;该两句是结束时序SETB SDARET;--------------------------------------------------------------------------------------------------------------------- ;STARTEEPROM子程序:向EEPROM发出读写操作的开始信号,在一个SCL时钟时序内完成(时序0);--------------------------------------------------------------------------------------------------------------------- STARTEEPROM:SETB SCLSETB SDA;停止EEPROM操作,为下一次写作准备CLR SDA;在SCL为高电平时,SDA由高变低,发出启动信号clr scl;完成一个时钟时序RET;---------------------------------------------------------------------------------------------------------------------;SENDDATA子程序:主机向EEPROM串行发送1个字节数据;入口:约定需发送的字节数据存在A中;使用资源:A、CY、R0;--------------------------------------------------------------------------------------------------------------------- SENDDATA: ;使用8个完整的SCL时钟时序(时序0~8)MOV R0,#08HSENDDATALOOP:RLC A;带CY的A内容循环左移位,先高位后低位MOV SDA,C;将位信息送到SDA线Setb scl;在SCL上升沿将SDA信息送入EEPROM缓存区Clr sclDJNZ R0,SENDDA TALOOPRLC A;让A和CY内容恢复为入口前状态,在某些情况上很有必要。

相关文档
最新文档