⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 24c02.asm

📁 AVR开发板范例程序,WS开发板配套_51_汇编源程序
💻 ASM
字号:
;******************************************************************
;********************      WWW.QLMCU.COM     **********************
;*****************  AT24C02串行E2PROM的读写实验  ******************
;**********************    FOSC= 11.0592MHz    ********************
;******************** design by benladn911 ************************
;***********************   2005/05/05   ***************************
;******************  Email:lanbing51@126.com  *********************
;!!!!!!!!!!!!!!!!!!!!!!!!!读写操作成功!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

;AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。在AT89C51试验开发板上它们都接地,
;第 8 脚和第 4 脚分别为正、负电源。
;第 5 脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,在实验开发板上和单片机的 P2.7 连接。
;第 6 脚SCL为串行时钟输入线,在实验开发板上和单片机的 P3.6 连接。
;SDA和SCL都需要和正电源间各接一个 4.7K 的电阻上拉。第 7 脚需要接地。


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


;AT24系列EEPROM在开始状态后需紧接一个8位器件地址,以进行应读写操作。
;设备寻址码的高4位为1、0、1、0,对于AT24C01/02,寻址码高4位后面的三位是器件寻址码,
;与它们的硬连线管脚相对应。最低应是读写选择位即方向位(R/W)。
;(R/W)为“0”表示发送,即主器件把信息写到所选择的从器件;
;(R/W)为“1”表示主器件将从从器件读信息。
;具体的格式如下:
;1010 A2 A1 A0 R/W
;   1010 0000B-----写卡器件地址 !!!!!!!!!!!!!!!!!!!!
;   1010 0001B-----读卡器件地址 !!!!!!!!!!!!!!!!!!!!

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

;************************************************************************************
;***************************字节写入模式写数据(WRITE_BYTE)
;************下列程序中的参数为:R6= =目的地址,A= =数据;数据如下:
;*********************************************************************操作成功!!!

SCL EQU P3.6
SDA EQU P2.7  ;端口定义

ORG 0000H
LJMP START

ORG 0100H
START:
       MOV DPTR,#TAB
       
       MOV R6,#00H ;写入字节地址的设置

       LCALL XXX   ;写入第一页(8个字节的数据,24C01/02一次最多只能写 8 个字节!!!)

       LCALL DELAY ;调用大概 1mS 延时,此延时程序非常必要!!!
       LCALL DELAY
       LCALL DELAY
       LCALL DELAY

;----------------------READ THE FIRST BYTE--------------
RRRR:  MOV R1,#00H  ;THE FIRST BYTE'S ADDRESS
       LCALL DDD
       LCALL DELAY
       LCALL DELAY
       CLR P3.7   ;***选通LED的公共端
       MOV P0,80H
       LCALL DELAY1

;----------------------READ THE SECOND BYTE-------------
LOOPPP:INC R1      ;THE SECOND BYTE'S ADDRESS
       LCALL DDD
       LCALL DELAY
       LCALL DELAY
       CLR P3.7   ;***选通LED的公共端
       MOV P0,80H
       LCALL DELAY1

       MOV R1,#00H
       LJMP RRRR


;--------------------------------写入数据//2005.05.05
XXX:
MOV P1,#0FFH
MOV A,#00H

PUSH ACC  ;保存A中的数据
LCALL START_IC  ;发开始信号

MOV A,#0A0H  ;写入器件地址设置为 A0H
LCALL WR_BYTE

MOV A,R6  ;写入字节地址
LCALL WR_BYTE
POP ACC  ;恢复A中数据

LCALL WRITE_BYTE    ;写入第一页的数据

LCALL STOP_IC
RET

;--------------------------------读取一个数据//2005.06.27// OK!!!
DDD:

    MOV A,#00H
    
PUSH ACC  ;保存A中的数据
LCALL START_IC  ;发开始信号

MOV A,#0A0H  ;写入器件地址,表示选中该器件
LCALL WR_BYTE

MOV A,R1 ;写入字节地址---------------地址设置!!!!!!!
LCALL WR_BYTE
POP ACC  ;恢复A中数据

MOV P2,#0FFH
MOV P3,#0FFH
LCALL START_IC

MOV A,#0A1H    ;*****读器件时地址必须设置为 A1H !!!!!
LCALL WR_BYTE

LCALL RD_BYTE  ;读出第一个字节
MOV 80H,A
NOP
NOP

LCALL STOP_IC
RET


;---------------------------------------------------------------------
WRITE_BYTE:       ;字节写入模式写数据(WRITE_BYTE)
      MOV R7,#08  ;欲写入数据个数的设定,一次最多只能写入 8 各字节的数据(对24C01/02而言!!!!)

LOOP: MOV A,#00H
      MOVC A,@A+DPTR
      LCALL WR_BYTE  ;写入数据
      INC R6   ;增加字节地址!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      INC DPTR
      DJNZ R7,LOOP
      RET
;----------------------------------------------------------------------


;*******************************************************************************
;*********************************以下为各功能子程序****************************
;*******************************************************************************

;-------------------------------------------------------------------
;-----------------------------开始条件------------------------------
START_IC:

CLR SCL ; SCL低电平时才允许SDA更改
NOP  ;加入空指令延时以确保信号可靠
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
CLR SCL
NOP
RET

;----------------------------------------------------------------------------------
;-------------------写一字节数据到EEPROM,程序中已包含应答子程序!!!-----------------
;----------------------------------------------------------------------------------
WR_BYTE:
MOV R5,#08  ;一字节8位数据
CLR SCL

NOP
NOP
WR_BYTE1:RLC A  ;带进位位左移,A.8->C
MOV SDA,C   ; SCL低电平时改变SDA上的数据
NOP
SETB SCL  ;拉高SCL把数据发送出去
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,WR_BYTE1;  依次发送A中的8位数据
SETB SDA
SETB SCL
JB SDA,$ ;  等待IC卡确认信号
CLR SCL
NOP
nop
RET

;---------------------------------------------------------------------------
;--------------------------从EEPROM读一字节(RD_BYTE)//2005.06.27 ---------
;---------------------------------------------------------------------------
RD_BYTE:

MOV R5,#08
SETB SDA;设备SDA为读状态
CLR A;清空A寄存器
RD_BYTE1:
MOV C,SDA;读一位数据到进位位
RLC A;左移数据到A.0
SETB SCL
NOP
NOP
CLR SCL
NOP
NOP
DJNZ R5,RD_BYTE1;依次读出8位数据到A中
RET;无应答信号

;利用该程序可将读出的数据存放在A中。需要注意的是:读数据的器件不是通过确认状态来应答的,
;而是随后产生一个停止状态。


;-----------------------------------------------------------------------
;------------------------------------停止条件
STOP_IC:

CLR SCL
NOP
NOP

CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
NOP
NOP
CLR SDA

RET

;-------------------------------------------------------------------------
TAB:
    DB 01H,02H,04H,08H,05H,06H,07H,08H

;-------------------------------------------------------------------------

DELAY: MOV R4,#2;延时程序,延时1000微秒= 1mS  FOSC=6MHz
DD3:MOV R5,#124
   DJNZ R5,$
   DJNZ R4,DD3
   RET

DELAY1: MOV R4,#10H     ;一秒延迟子程序
DELAY11:MOV R5,#255
DELAY41:MOV R6,#0FFH
        DJNZ R6,$
        DJNZ R5,DELAY41
        DJNZ R4,DELAY11
        RET

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -