历史上的今天
返回首页

历史上的今天

今天是:2025年01月14日(星期二)

正在发生

2018年01月14日 | 51单片机读写AT24C02串行E2PROM

2018-01-14 来源:eefocus

24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动加1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的写入时间,一次操作可写入多达8个字节的数据。

;这是将0600H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序

ORG 0000H 

SCL BIT P3.4;定义24C02的串行时钟线 
SDA BIT P3.5;定义24C02的串行数据线

LJMP START
START:LCALL STAR;调用
MOV R2,#08H;一个数据有8位
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
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
SDATA:MOV R0,#08H
LOOP0:RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R0,LOOP0
RET
ACK:SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
CLR SCL
RET
STOP:CLR SDA
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
ORG 0600H
DB 0A0H,10H,01H,02H,03H,04H,05H,06H
END

  读写子程序如下:

;写串行E2PROM子程序EEPW
; R3=10100000(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)
; (R4)=片内字节地址
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数n
EEPW: MOV P1,#0FFH

  CLR  P1.0  ;发开始信号
  MOV  A,R3  ;送器件地址
  ACALL  SUBS
  MOV  A,R4  ;送片内字节地址
  ACALL SUBS
AGAIN: MOV A,@R1
  ACALL SUBS ;调发送单字节子程序INC   R1
  DJNZ  R7,AGAIN;连续写n个字节
  CLR    P1.0  ;SDA置0, 准备送停止信号
  ACALL DELAY ;延时以满足传输速率要求
  SETB   P1.1  ;发停止信号
  ACALL DELAY
  SETB   P1.0
  RET

SUBS: MOV R0,#08H ;发送单字节子程序
LOOP: CLR P1.1
  RLC  A
  MOV  P1.0,C
  NOP
  SETB P1.1
  ACALL DELAY
  DJNZ R0,LOOP ;循环8次送8个bit
  CLR  P1.1
  ACALL DELAY
  SETB P1.1
REP: MOV C,P1.0
  JC  REP  ;判应答到否,未到则等待
  CLR  P1.1
  RET

DELAY: NOP
  NOP
  RET

;读串行E2PROM子程序EEPR
;(R1)=欲读数据存放地址指针
;; R3=10100001(命令1010+器件3位地址+读/写。 器件地址一个芯片,是000)
;(R4)=片内字节地址
;(R7)=连续读字节数

EEPR: MOV P1,#0FFH
  CLR  P1.0  ;发开始信号
  MOV  A,R3  ;送器件地址
  ACALL SUBS   ;调发送单字节子程序
  MOV A,R4   ;送片内字节地址
  ACALL SUBS
  MOV P1,#0FFH
  CLR P1.0   ;再发开始信号
  MOV A,R3
  SETB ACC.0  ;发读命令
  ACALL SUBS
MORE: ACALL SUBR
  MOV @R1,A
  INC R1
  DJNZ R7,MORE
  CLR P1.0
  ACALL DELAY
  SETB P1.1
  ACALL DELAY
  SETB P1.0 ;送停止信号
  RET

SUBR: MOV  R0,#08H ;接受单字节子程序
LOOP2: SETB  P1.1
  ACALL DELAY
  MOV C,P1.0
  RLC A
  CLR P1.1
  ACALL DELAY
  DJNZ R0,LOOP2
  CJNE R7,#01H,LOW
  SETB P1.0  ;若是最后一个字节置A=1
  AJMP SETOK
LOW: CLR P1.0  ;否则置A=0
SETOK: ACALL DELAY
  SETB  P1.1
  ACALL DELAY
  CLR  P1.1
  ACALL DELAY
  SETB P1.0  ;应答毕,SDA置1
  RET

  程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。


推荐阅读

史海拾趣

All Sensors公司的发展小趣事

近年来,All Sensors通过与深圳电通纬创微电子股份有限公司的合作,成立了中美合资企业——深圳华美澳通传感器有限公司。这一合资企业的成立,不仅加强了All Sensors在中国市场的地位,也为其在全球范围内的业务拓展提供了有力支持。华美澳通公司利用All Sensors的专利技术,专业从事MEMS压力传感器及应用模组的研发、生产及销售,为电子行业提供了更多优质的产品和服务。

GigPeak公司的发展小趣事

为了进一步增强市场地位和扩大产品线,GigPeak在2010年实施了一项重要的并购战略。公司成功收购了另一家在光纤通信领域具有深厚技术积累的企业,这次并购不仅为GigPeak带来了先进的产品线和研发资源,还显著提升了其在全球市场的份额。通过整合双方的优势资源,GigPeak在光纤通信领域的技术实力和市场份额均实现了质的飞跃。

Easy Braid公司的发展小趣事

Easy Braid的发展离不开一支强大的研发团队。公司注重人才的引进和培养,为研发团队提供了良好的工作环境和充足的研发资金。在研发团队的努力下,Easy Braid不断推出具有创新性和实用性的新产品,满足了市场的多样化需求。同时,研发团队还积极参与行业标准的制定和推广工作,为整个电子行业的发展做出了贡献。

GE Oil & Gas Digital Solutions公司的发展小趣事
在电子技术教学实验中,作为演示电阻测量原理的教具。
Altitude Technology公司的发展小趣事

在电子行业中,合作与共赢是企业发展的重要途径。Altitude Technology深知这一点,因此积极寻求与其他企业的合作机会。通过与一家知名芯片制造商建立战略合作关系,Altitude Technology获得了更先进的芯片供应和技术支持,进一步提升了产品的竞争力。同时,公司还与其他企业开展了一系列合作项目,共同推动电子行业的发展。

高博(GBG)公司的发展小趣事

品质是企业生存之本。谷峰公司始终将产品质量放在首位,建立了严格的质量控制体系,确保每一款产品的性能和质量都达到行业领先水平。同时,公司还注重品牌建设,通过参加国际展会、发布新产品、提供优质服务等方式,不断提升GOFORD品牌的知名度和美誉度。如今,GOFORD已成为电子行业可信赖的高可靠性功率器件供应商之一。

问答坊 | AI 解惑

请教非门的作用??

请教一下:信号从光耦接收出来,到达两个四个并联的非门再与两个非门串联来驱动三极管,其中这些非门的作用是为了增强驱动能力的作用吗? [ 本帖最后由 qmchen 于 2009-3-18 10:16 编辑 ]…

查看全部问答>

IGBT 损坏后结果情况

IGBT损坏后,有哪些结果情况?比如IGBT开路,但开路后IGBT的续流二极管还继续有用吗?…

查看全部问答>

我的PXA270的板子晶振不动,请帮忙解决

大家好,我仿照北京奥尔斯的pxa270开发板做了一个板子。按照他们的开发板,电源没有用任何电源管理芯片,全都是LDO直接恒定输出各个电压(不用PWR_EN和SYS_EN控制),他的开发板能跑,按道理来说这种设计应该没有问题。 现在我的板子能JTAG烧写boo ...…

查看全部问答>

cpu风扇转速

如何设置cpu风扇的转速呢,我的生音太大…

查看全部问答>

将要进入嵌入软件开发 的人

各位大哥们,我还是一个大一的学生,现在听说嵌入开发还可以,所以就有一点想向这一方面发展,但是现在在我面前的一个问题就是 我不知道要学那些东西,我也是一个计算机班的学生,这是不是有很大的优点. 所以就想问一下大哥们的应该出什么方向入手好一 ...…

查看全部问答>

LPC2103匹配中断进不了

#include<LPC21xx.h> #define uint8  unsigned char#define uint32 unsigned intvoid Timer0_ISR(void) __attribute__ ((interrupt));uint8 num; void DelayNs(uint32 dly){  uint32 i;  for(;dly>0;dly--)  &nbs ...…

查看全部问答>

stm32can节点问题

你好,我使用的是stm32,外围带mcp2551,做为节点的时候,通讯一般都是没有问题的,可以接收和发送。接收是采用中断方式。 但是目前遇到一个问题,整个总线有5个节点,一个是监听的,方便pc得到信息。 我使用STM32的can来代替一个节点进行数 ...…

查看全部问答>

请教小数的处理,和小数的输出!

我AD采样的范围是0 - 2.5 V , 采样肯定是小数, 其类型应该是 float 型吧? 假如其采样点储存在float型数组内, 经过一系列运算后 如何使其转换成十进制数据 输出? 是有固定程序么? 比如将其转换成BCD码! 还请高手指点!…

查看全部问答>

麻烦哪位能给我传一份LM3S9B96的Startup.s

因为9B96有Port J,可是Startup.s里的中断向量表里没有Port J的“IntDefaultHandler”,所以进不去中断。如果谁有麻烦给我一份啊。谢谢先。 zzgezi@126.com. …

查看全部问答>