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

📄 h42.asm

📁 单片机程序集合
💻 ASM
字号:



; 实验四十二 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	0a0h
ReadDeviceAddress	equ	0a1h

; ******************IIC器件驱动引脚定义*********************
SCL		equ	P1.0
SDA		equ	P1.1

; *******************读写数据缓冲定义***********************
ReadBuff	equ	40h
WriteBuff	equ	48h
RWLength	equ	30h
RomAddress	equ	31h

	org	0000h
	ljmp	Main

	org	0100h
; ***********************简单延时***************************
DelayMs:
	push	06
	nop
DelayMsLoop2:
	mov	r6, #0ffh
DelayMsLoop1:
	djnz	r6, DelayMsLoop1
	djnz	acc, DelayMsLoop2
	pop	06
	ret


; ********************启动IIC总线***************************
Start:
	setb	SDA
	setb	SCL
	clr	SDA
	clr	SCL
	ret

; ********************停止IIC总线***************************
Stop:
	clr	SCL
	clr	SDA
	setb	SCL
	setb	SDA
	ret

; **********************请求相应****************************
Ack:
	clr	SDA
	setb	SCL
	clr	SCL
	setb	SDA
	ret

; ******************不对IIC总线产生应答*********************
NoAck:
	setb	SDA
	setb	SCL
	clr	SCL
	ret

; *********************检查应答位***************************
TestAck:
	setb	SDA
	setb	SCL
	mov	C, SDA
	clr	SCL
	nop
	nop
	nop
	ret

; *******************向IIC总线写数据************************
Write8Bit:
	push	07
	mov	r7, #8
Write8BitLoop:
	rlc	a
	mov	SDA, C
	setb	SCL
	clr	SCL
	nop			; 此处建议加入几个NOP指令降低MCU对器件操作的速度
	nop
	nop
	djnz	r7, Write8BitLoop
	pop	07
	ret


; ***************从IIC总线上读数据子程序********************
Read8Bit:
	push	07
	clr	a
	mov	r7, #8
Read8BitLoop:
	clr	C
	setb	SCL
	mov	C, SDA
	rlc	a
	clr	SCL
	nop			; 此处建议加入几个NOP指令降低MCU对器件操作的速度
	nop
	nop
	djnz	r7, Read8BitLoop

	pop	07
	ret

; ******************向EEPROM中写入数据块********************
AT24C02WriteBlock:
	clr	ea
	mov	r0, #WriteBuff
	inc	RWLength
	anl	RWLength, #0f0h	;对于24C02, 一个页为8字节,所以最大的块写操作字节数为8*/
	mov	r7, RWLength
	call	Start
	mov	a, #WriteDeviceAddress
	call	Write8Bit
	call	TestAck
	mov	a, RomAddress
	call	Write8Bit
	call	TestAck
AT24C02WriteBlockLoop:
	mov	a, @r0
	call	Write8Bit
	call	TestAck
	inc	r0
	djnz	r7, AT24C02WriteBlock
	call	Stop
	mov	a, #10
	call	DelayMs
	ret


; *************从EEPROM中读出数据块到指定RAM中**************
AT24C02ReadBlock:
	clr	ea
	mov	r0, #ReadBuff
	mov	r7, RWLength
	call	Start
	mov	a, #WriteDeviceAddress
	call	Write8Bit
	call	TestAck
	mov	a, RomAddress
	call	Write8Bit
	call	TestAck
	call	Start
	mov	a, #ReadDeviceAddress
	call	Write8Bit
	call	TestAck
AT24C02ReadBlockLoop:
	call	Read8Bit
	mov	@r0, a
	call	Ack
	inc	r0
	djnz	r7, AT24C02ReadBlock
	call	NoAck
	call	Stop
	ret


; ****************向EEPROM中写入单字节数据******************
AT24c02WriteByte:
	clr	ea
	call	Start
	mov	a, #WriteDeviceAddress
	call	Write8Bit
	call	TestAck
	mov	a, RomAddress
	call	Write8Bit
	call	TestAck
	mov	a, @r0
	call	Write8Bit
	call	TestAck
	call	Stop
	mov	a, #10
	call	DelayMs
	ret

; ***********从EEPROM中读出单字节数据到指定RAM中************
AT24c02ReadByte:
	clr	ea
	call	Start
	mov	a, #WriteDeviceAddress
	call	Write8Bit
	call	TestAck
	mov	a, RomAddress
	call	Write8Bit
	call	TestAck
	call	Start
	mov	a, #ReadDeviceAddress
	call	Write8Bit
	call	TestAck
	call	Read8Bit
	mov	@r0 ,a
	call	NoAck
	call	Stop
	ret


SetReadBuff:
	mov	r0, #ReadBuff
	mov	r7, RWLength
SetReadBuffLoop:
	mov	@r0, a
	inc	r0
	djnz	r7, SetReadBuffLoop
	ret


SetWriteBuff:
	mov	r0, #WriteBuff
	mov	r7, RWLength
SetWriteBuffLoop:
	mov	@r0, a
	inc	r0
	djnz	r7, SetWriteBuffLoop

	ret


Main:
	mov	SP, #60h
	;  读写缓冲初始化
	mov	a, #00
	mov	RWLength, #8
	call	SetReadBuff
	mov	a, #00
	mov	RWLength, #8
	call	SetWriteBuff

	;  写缓冲初始化
	mov	r0, #WriteBuff
	mov	r7, #8
	mov	a, #55h
InitWriteBuffLoop:
	mov	@r0, a
	inc	a
	inc	r0
	djnz	r7, InitWriteBuffLoop

	;  从地址0开始按字节方式写入8个数据'0'
	mov	RomAddress, #0
	mov	r7, #8
	mov	r0, #WriteBuff
WriteLoop:
	call	AT24c02WriteByte
	inc	RomAddress
	inc	r0
	djnz	r7, WriteLoop

	;  按字节方式读出数据
	mov	RomAddress, #0
	mov	r7, #8
	mov	r0, #ReadBuff
ReadLoop:
	call	AT24c02ReadByte
	inc	RomAddress
	inc	r0
	djnz	r7, ReadLoop

	;  按写Page方式从地址0开始写入WriteBuff指向的8个数据
	mov	RomAddress, #0
	mov	RWLength, #8
	mov	r0, #WriteBuff
	call	AT24C02WriteBlock

	;  按连续读取方式读出从地址0开始的8个数据
	mov	RomAddress, #0
	mov	RWLength, #8
	mov	r0, #ReadBuff
	call	AT24C02ReadBlock
	jmp	$

	end

⌨️ 快捷键说明

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