- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
90c51汇编c51IIC总线EEPROM
/***********************************
【ilong 编写 e-mail:lyj051031448@163.com qq:825240885】
【功能】 IIC对EEPROM 的读写
【参数与说明:】
P2.0:SCK
P2.1:SDA
P2.2:WP
30H :要写的数据的首地址
31H :要写的数据的长度
32H :EEPROM 写数据的首地址
33H :读的数据保存的首地址
34H :读的数据长度
35H :EEPROM 读数据的首地址
36H :从机地址
高四位(选从机类型)为“1010”(EEPROM),
低四位的前三位(A2,A1,A0)为选从机地址,
最后位为0,由程序设置要写,还是要读
【问题】:写操作时,只有在停止总线后,EEPROM才回将其缓存里的数据写入ROM里,
而停止总线后在执行读操作就会出错。
如果发送完写完后,直接启动读,读会成功,但写失败
***********************************/
SJMP START
ORG 0030H
CLR 00H //收到应答检查 标志位
MOV 30H,#00H
START:
MOV 40H,#46H //Fuck You
MOV 41H,#75H
MOV 42H,#63H
MOV 43H,#6BH
MOV 44H,#00H
MOV 45H,#59H
MOV 46H,#6FH
MOV 47H,#75H
MAIN:
MOV 36H,#0A4H //选从机
MOV 30H,#40H //设置写参数
MOV 31H,#08H
MOV 32H,#30H
LCALL MSDATA //启动总线并发送(写)数据
LCALL D_S
MOV 33H,#60H //设置读参数
MOV 34H,#04H
MOV 35H,#20H
LCALL MRDATA //再启动总线并接收(读)数据
LCALL STOP_IIC //停止总线
wait: jnb 02h,wait
MSDATA: //MCU发(写)数据
LCALL STA_IIC //启用IIC总线
MOV A,36H //获取从机地址,
CLR ACC.0 //写操作
LCALL WRBYT //发送
LCALL CACK //检测应答
MOV A,32H //获取,要写入的EEPROM首地址
LCALL WRBYT //发送
LCALL CACK //检测应答
WR_S: MOV R1,30H //获取要发送数据的首地址
MOV A,@R1
LCALL WRBYT //发送一字节数据
LCALL CACK //检测应答
INC 30H
DEC 31H
MOV R2,31H
CJNE R2,#00H,WR_S //是否发送指定长度
LCALL STOP_IIC //停止IIC总线
RET
MRDATA: //MCU接收(读)数据
LCALL STA_IIC //启动IIC总线
MOV A,36H //获取从机地址
CLR ACC.0 //写操作(伪写,来使EEPROM的指针指向要读的地址)
LCALL WRBYT //发送
LCALL CACK
MOV A,35H //发送要读取的地址
LCALL WRBYT
LCALL CACK
LCALL STA_IIC //为关闭的情况下,再次启动IIC总线,
MOV A,36H //获取从机地址
SETB ACC.0 //读操作
LCALL WRBYT
LCALL CACK
//读取数据==========
S_R: MOV R1,33H //获取接收首地址
LCALL RDBYT //接收一字节数据
MOV @R1,A //保存到MCU
LCALL NACK //发送应答信号,准备接收下一字节数据
INC 33H
DEC 34H
MOV R2,34H
CJNE R2,#01H,S_R //是否接收指定长度数据,到01H而不到00H是因为最后需要发送一个非应答,不让从机再发送数据
MOV R1,33H
LCALL RDBYT //接收一字节数据
MOV @R1,A //保存到MCU
LCALL MNACK //发送非应答
// LCALL ST
文档评论(0)