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

📄 1.asm

📁 24CO2读写和存取数据,程序已经通过Keil51调试
💻 ASM
字号:
	SDA EQU P2.0
	SCL EQU P2.1
	Address EQU 08H
	I2CData EQU 09H
	ORG 0040H
	LJMP START;转入主程序.
START:
	MOV SP,#60H
	MOV Address,#00H
	MOV I2CData,#0FH
	MOV P0,I2CDATA
     	CALL DELAY
	CALL I2C_WRITE    ;写入数据.
     	MOV I2CDATA,#0F0H 
 	MOV P0,I2CDATA
     	CALL DELAY
       	MOV Address,#00H
	CALL I2C_READ
	MOV I2CData,A       ;读出数据.
    	MOV P0,I2CDATA
     	CALL DELAY
	NOP
     	NOP
     	LJMP START
//*******************************************
/*------------------------------------------------------

读一个字节     Address地址   Data读出的数据

------------------------------------------------------*/
I2C_READ:
I2C_READ_A:
	LCALL I2C_START
	MOV A,#10100000B ;从器件地址位是000,并且对从器件进行写操作。
    	                 ;不要有所疑问为什么这么操作。因为这是一个选择性读的操作,主器件发送从器件地址和它想读取的字节数据的地址执行一个伪写操作。
	LCALL I2C_SEND8BIT
	LCALL I2C_ACK
	JC I2C_READ_A ;=1,表示无确认,再次发送   C为1转移。
       	MOV A,Address
        LCALL I2C_SEND8BIT
 	LCALL I2C_ACK       
I2C_READ_B:
	LCALL I2C_START
        MOV A,#10100001B ;//从器件地址位是000,并且对从器件进行读操作。
        LCALL I2C_SEND8BIT
        LCALL I2C_ACK
        JC I2C_READ_B   ;//C=1转移,表示无确认,再次发送。
        LCALL I2C_RECEIVE8BIT
        MOV I2CData,A
        LCALL I2C_ACK
        LCALL I2C_STOP
RET
;//*******************************************************

;//*******************************************************
;接收八位数据
;//主器件接收从器件指定地址的8位数据。
I2C_RECEIVE8BIT:
	MOV B,#08H
	CLR A
        SETB SDA
I2C_RECEIVE8IT_A:
	SETB SCL
        NOP
        NOP
        MOV C,SDA
        RLC A
        CLR SCL
        DJNZ B,I2C_RECEIVE8IT_A
	RET
;//*******************************************************


;//*******************************************************
;/*------------------------------------------------------

;写一个字节     Address地址   I2CDatata写入的数据

;------------------------------------------------------*/
I2C_WRITE:
I2C_WRITE_A:
        LCALL I2C_START   ;调用I2C总线的起始信号的程序。
        MOV A,#10100000B ;从器件地址位是000,并且对从器件进行写操作。
        LCALL I2C_SEND8BIT
        LCALL I2C_ACK
        JC I2C_WRITE_A ;      //=1,表示无确认,再次发送。 C为1转移。
        MOV A,Address
        LCALL I2C_SEND8BIT
        LCALL I2C_ACK       
        MOV A,I2CData
        LCALL I2C_SEND8BIT
        LCALL I2C_ACK       
	LCALL I2C_STOP
	RET 
;发送开始信号
;//I2C总线的起始信号的程序。
I2C_START:
        SETB SCL
        SETB SDA
        NOP
        NOP
        CLR SDA
        NOP
        NOP
        CLR SCL
	RET
;送八位数据
;//主器件送从器件8位数据。
I2C_SEND8BIT:
        MOV B,#08H
I2C_SEND8BIT_A:       
        RLC A
        MOV SDA,C
        SETB SCL
        NOP
        NOP
        CLR SCL
        DJNZ B,I2C_SEND8BIT_A
	RET
;发送接收确认信号
I2C_ACk:
        SETB SDA
        SETB SCL
        NOP
        NOP
        JB SDA,I2C_ACK0 ;SDA为1跳转。
        CLR C     
        SJMP I2C_ACK_END
I2C_ACK0:
        SETB C
I2C_ACK_END:
        CLR SCL
	RET
;发送结束信号
I2C_STOP:
	CLR SDA
        NOP
       	NOP
        SETB SCL
        NOP
        NOP
        SETB SDA
	RET
delay:
	MOV R7,#0FFH
DEL1: 
	MOV R6,#0FFH
DEL2: 
	MOV R5,#10
DEL3:
	DJNZ R5,DEL3
	DJNZ R6,DEL2
	DJNZ R7,DEL1
	RET 
	END

⌨️ 快捷键说明

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