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

📄 daima38.asm

📁 <MCS-51系列单片机应用及接口技术>书中的源代码
💻 ASM
字号:
	SCL	BIT	P1.0                 ;EEPROM数据输入输出口
	SDA	BIT	P1.1                 ;EEPROM时钟口线
	EEP_ADDR	EQU        20H          ;地址缓冲区
	ORG		0000H                    ;程序开始
	LJMP	MAIN                    ;主程序
	ORG		0100H                    ;主程序开始 30H
MAIN:	MOV		SP,#050H                 ;设置堆栈
        LCALL 	INIT                      ;初始化
        ……
;**************************   写127字节的程序   **************************
WR127:	MOV	EEP_ADDR,#00H          ;数据在AT24C04中的首地址                         
        MOV	R1,#00H                  ;待存数据首偏址
        MOV	R0,#127                  ;需要存储的数据数量
LOOP1:	MOV	A,R1	                     ;获得首地址
	MOV	DPTR,#5000H              ;查数据表
	MOVC 	A,@A+DPTR             ;得到数据
	MOV 	B,A                       ;寄存
	MOV 	R2,EEP_ADDR             ;数据在AT24C04中的地址
	LCALL	 WT_MEM                ;写入一个字节数据
	INC	EEP_ADDR                       ;准备下一个地址
	INC	R1                               ;偏址加1
	DJNZ	R0,LOOP1                      ;准备下一个数据,重复写入
;**************************   读127字节的程序   **************************
RD127:	MOV		R1,#00H                  ;待读数据首地址
	MOV		R0,#127                   ;需要读取的数据数量
	MOV		DPTR,#5000H              ;要写到RAM地址
LOOP2:	MOV		A,R1                                  
	MOV		R2,A                      ;要读取的数据地址放到R2
	MOV 	B,#00H                       ;寄存器清零
	LCALL	RD_MEM                   ;从AT24C04读一个字节数据  
	ADD	DPTR,R1                  ;RAM地址
	MOV	@DPTR,B                 ;把读取的数据存到RAM里
	INC	R1                            ;地址加1 
	DJNZ	R0,LOOP2                 ;重复读出数据
	……
	SJMP	$                                       ;停止
INIT:	NOP                            ;初始化子程序
	CLR	SCL                                  ;时钟为低
	CLR	SDA                                  ;数据为低
	RET
;**********************  写AT24CXX字节子程序  *************************
WT_MEM:	NOP                       ;写入的地址在R2中,数据在B中
	ACALL	MEM_START       ;给AT24C04开始信号
	MOV	A,#0A0H           ;"写"命令字+片选地址信息
	ACALL	WR1                ;写入以上信息
MWRITE2:MOV	A,R2                  ;准备写入片内地址信息
	ACALL	WR1               ;写入
	MOV	A,B                ;准备数据
	ACALL	WR1                ;写入数据
	ACALL	MEM_STOP 	       ;发送停止信号,
;如果要重复写,可以不发结束信号,返回MWRITE2继续
;写下一个数据,写完后发送结束信号。
	RET                    ;返回,一个字节写结束
;*******************   AT24CXX读字节子程序   *********************
; 要读入的地址信息在R2中,返回的读取数据在B中
RD_MEM:	ACALL	MEM_START                     ;发送开始信号
	MOV	A,#0A0H                       ;"写"命令字+片选地址信号
	ACALL	WR1                           ;写入以上信息
	MOV	A,R2                         ;准备片内信息
	ACALL	WR1                          ;写入片地址信息
	ACALL	MEM_START                   ;重复发送开始信号,这里和写不同
	MOV	A,#0A1H                         ;准备命令字(读)+片选地值
	ACALL	WR1                           ;写入以上信息
	CLR	A                            ;准备接收读取的数据
	MOV	R3,#08H                      ;数据位数
	CLR	SCL                            ;时钟为低
RD1:	SETB	SCL                           ;时钟上跳
	NOP                                 ;等待数据出现
	LCALL	MDELAY                        ;延时等待
	MOV	C,SDA                        ;数据移入C
	RLC	A                             ;数据移入寄存器A
	CLR 	SCL                          ;时钟下跳,准备读取下一位数据
	LCALL	MDELAY  
	DJNZ	R3,RD1                       ;没有读完则继续,否则返回
	MOV	B,A                           ;数据送B
	ACALL	MEM_STOP                      ;发送结束信号
	RET                                ;返回
WR1:	MOV	R6,#08H                       ;写入8个字节数
WR2:	RLC	A                           ;A带进位左移
	MOV	SDA,C                       ;数据输出一位
	SETB	SCL                         ;向AT24C04锁存数据
	ACALL	MDELAY                      ;等待
	CLR	SCL                         ;准备写入下一个字节数据
	ACALL	MDELAY                      ;等待
	DJNZ	R6,WR2                      ;没有写完,继续
WR4:	LCALL	MDELAY                     ;等待写完8字节信息
	SETB	SCL                         ;发送第9个时钟作为应答信号
	LCALL	MDELAY                     ;等待,AT24C04应答信号
	CLR		SCL                       ;完成,清除时钟
	RET                              ;返回
;***********  发送开始信号  ********************
;开始信号:在时钟为高电平,数据线出现下跳;
MEM_START:
	SETB	SDA            ;数据线高电平
	SETB	SCL           ;时钟提高        
	NOP                   ;等待电平稳定
	CLR	SDA            ;数据下跳作为开始信号
	ACALL	MDELAY          ;延时
	CLR	SCL            ;时钟下跳
	ACALL	MDELAY          ;等待一段时间
	RET                           ;返回
;**************************   发送停止信号   **************************
;停止信号:在时钟为高电平,数据线出现上跳;
MEM_STOP:
	SETB	SCL                      ;时钟线高                   
	ACALL	MDELAY                   ;等待电平稳定
	SETB 	SDA                      ;数据线高,停止信号    
	ACALL 	MDELAY                   ;等待
	LCALL 	DELAY20MS                ;写周期延时
	RET                             ;返回
;**************************   短时间延时   **************************
MDELAY:	MOV		R7,#04H      
MDELAY1:NOP
	DJNZ	R7,MDELAY1
	RET
;**************************   20ms延时   **************************
DELAY20MS:
	MOV	R5,#40
DELAY1:	MOV	R4,#00H
DELAY2:	DJNZ	R4,DELAY2
	DJNZ	R5,DELAY1
	RET
	END

⌨️ 快捷键说明

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