云计算百科
云计算领域专业知识百科平台

51汇编语言学习8:EEPROM读写(连续字节地址写入)

EEPROM的型号为24C02,通过I2C进行数据的读写。该程序可实现连续字节地址的数据写入(该程序连续写入8个地址)

$MOD51

SCL BIT P2.1
SDA BIT P2.0

ORG 0000H ;程序起始地址
LJMP MAIN
ORG000BH ;T0中断入口
LJMP INT_T0

;————————————————————————
ORG 1000H
MAIN:
MOV TMOD,#01H ;定时/计数器T0位方式1,16位定时/计数器模式
MOV TH0,#0FCH ;设置1ms(65536-1000=64536)
MOV TL0,#18H
MOV IE,#82H ;允许全局中断、T0中断
MOV IP,#00H ;所有中断优先级为0
CLR TR0
CLR F0

;连续写入数据
;—————————–
LCALL START
MOV A,#0A0H ;1010 0000
LCALL TRANS
LCALL GET_ACK
JNC MLOOP2
LJMP MLOOP1
MLOOP2:
MOV A,#00H ;0000 0000
LCALL TRANS
LCALL GET_ACK
JNC MLOOP3
LJMP MLOOP1

;开始连续写入数据
MLOOP3:
MOV A,#80H ;1000 0000
LCALL TRANS
LCALL GET_ACK
JNC MLOOP4
LJMP MLOOP1
MLOOP4:
MOV A,#81H ;1000 0001
LCALL TRANS
LCALL GET_ACK
JNC MLOOP5
LJMP MLOOP1
MLOOP5:
MOV A,#82H ;1000 0010
LCALL TRANS
LCALL GET_ACK
JNC MLOOP6
LJMP MLOOP1
MLOOP6:
MOV A,#83H ;1000 0011
LCALL TRANS
LCALL GET_ACK
JNC MLOOP7
LJMP MLOOP1
MLOOP7:
MOV A,#84H ;1000 0100
LCALL TRANS
LCALL GET_ACK
JNC MLOOP8
LJMP MLOOP1
MLOOP8:
MOV A,#85H ;1000 0101
LCALL TRANS
LCALL GET_ACK
JNC MLOOP9
LJMP MLOOP1
MLOOP9:
MOV A,#86H ;1000 0110
LCALL TRANS
LCALL GET_ACK
JNC MLOOP10
LJMP MLOOP1
MLOOP10:
MOV A,#87H ;1000 0111
LCALL TRANS
LCALL GET_ACK
JC MLOOP1

LCALL STOP
;—————————–
LCALL DELAY

;读取指定字地址的数据
;—————————–
LCALL START
MOV A,#0A0H ;1010 0000
LCALL TRANS
LCALL GET_ACK
JC MLOOP1

MOV A,#00H ;0000 0000
LCALL TRANS
LCALL GET_ACK
JC MLOOP1

LCALL START
MOV A,#0A1H ;1010 0001
LCALL TRANS
LCALL GET_ACK
JC MLOOP1

LCALL RECEIVE
LCALL NOACK
LCALL STOP
;—————————–

;可将数据发送到P0口连接的的LED灯来验证数据是否正确,也可通过串口验证
MOV P0,A

MLOOP:
JMP MLOOP
MLOOP1:
LCALL STOP
JMP MLOOP

RET
;————————————————————————

;————————————————————————
;#延时函数,可通过改变R2的值改变延时时间
DELAY:
MOV R2,#5
DLOOP1:
MOV TH0,#0FCH ;计时1ms(65536-1000=64536)
MOV TL0,#18H
SETB TR0 ;使能T0
DLOOP:
JB F0,DLOOP ;F0为1说明50ms计时还未完成,因此原地等待
SETB F0
DJNZ R2,DLOOP1

RET
;————————————————————————

;————————————————————————
;#起始信号
START:
SETB SDA ;SDA置高
SETB SCL ;SCL置高
NOP
CLR SDA ;SDA置低
NOP

RET
;————————————————————————

;————————————————————————
;#停止信号
STOP:
CLR SDA ;SDA置低
SETB SCL ;SCL置高
NOP
SETB SDA ;SDA置高
NOP

RET
;————————————————————————

;————————————————————————
;#主机发送应答信号
ACK:
CLR SCL ;SCL置低
CLR SDA ;SDA置低
NOP
SETB SCL ;SCL置高
NOP
CLR SCL ;SCL置低
SETB SDA ;SDA置高,释放总线
NOP

RET
;————————————————————————

;————————————————————————
;#主机发送非应答信号
NOACK:
CLR SCL ;SCL置低
SETB SDA ;SDA置高
NOP
SETB SCL ;SCL置高
NOP
CLR SCL ;SCL置低

RET
;————————————————————————

;————————————————————————
;#主机接收应答信号
GET_ACK:
SETB SDA ;SDA置高,释放总线
SETB SCL ;SCL置高
NOP
MOV C,SDA
CLR SCL

RET
;————————————————————————

;————————————————————————
;#发送函数,主机通过该函数发送数据
TRANS:
MOV R0,#8
TLOOP:
RLC A
CLR SCL ;SCL置低
NOP
MOV SDA,C ;移位Cy数据至SDA
SETB SCL ;SCL置高
NOP
CLR SCL ;SCL置低
NOP
DJNZ R0,TLOOP

RET
;————————————————————————

;————————————————————————
;#接收函数,主机通过该函数接收数据
RECEIVE:
MOV R0,#8
RLOOP:
CLR SCL ;SCL置低
NOP
SETB SCL ;SCL置高
NOP
MOV C,SDA ;移位SDA数据至Cy
RLC A
CLR SCL ;SCL置低
NOP

DJNZ R0,RLOOP

RET
;————————————————————————

;————————————————————————
;#T0中断处理函数,主要功能清除中断标志、停止计数
INT_T0:
CLR TR0
CLR F0

RETI
;————————————————————————

END

原理图:
在这里插入图片描述

赞(0)
未经允许不得转载:网硕互联帮助中心 » 51汇编语言学习8:EEPROM读写(连续字节地址写入)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!