潜艇生活舱:AT24C08读写的问题

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/30 07:04:26
用AT89S51读写AT24C08。
不要求分页,也不要求连续写多于N个字节,就想寻址正确就行了。
现在是写不进去也读不出来,请指点一下源程序中的错误OK?
个人感觉错误在高8位和低8位寻址,但不知道怎么改。
以下为程序:
SCL BIT P3.6 ;定义用SCL代替程序中的位地址P3.6
SDA BIT P3.7 ;定义用SDA代替程序中的位地址P3.7
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
;*写数据之前的准备工作
LCALL START ;准备与24C02通信,建立开始信号。
MOV R7,#10100000B ;对24C02执行"写命令"的字节代码。
LCALL SEND_BYTE ;发送数据
;寻址0100H
MOV R7,#01H ;高8位地址01H
LCALL SEND_BYTE ;发送数据
MOV R7,#00H ;低8位地址01H
LCALL SEND_BYTE ;发送数据
MOV R5,#5 ;将要写入的字节数。特别注意:每次通信最多可发送8个字节。如有更多字节要发送,需要重新建立通信。
MOV DPTR,#TAB ;取数据表的地址指针
LOOP1: ;循环发送1个字节。写入一个字节后24C02自动增加地址指针,不需我们编程实现。
MOV A,#0
MOVC A,@A+DPTR ;从表中取出数据发送字节给24C02,并且写在从00H开始的地址中。
INC DPTR
MOV R7,A
LCALL SEND_BYTE
DJNZ R5,LOOP1
LCALL STOP ;8个字节发送完毕,建立停止信号
CLR P1.0 ;闪烁一个二极管,我们可以知道全部数据已经发送完毕。
LCALL USER_DLY ;用户延时设定,这里可接其他程序.

RE_SHOW:
;*读数据之前的准备工作LCALL START
;准备与24C02通信,建立开始信号。
MOV R7,#10100000B ;读之前要空写一次
LCALL SEND_BYTE ;发送数据
;寻址0100H
MOV R7,#01H ;高8位地址01H
LCALL SEND_BYTE ;发送数据
MOV R7,#00H ;低8位地址01H
LCALL SEND_BYTE ;发送数据
LCALL START ;再次建立新的开始信号
MOV R7,#10100001B ;对24C02执行"读命令"的字节代码
LCALL SEND_BYTE ;发送数据
MOV R5,#5 ;将要读出的字节数
LOOP2: ;每次读出1个字节。读出一个字节后24C02自动增加地址指针,不需我们编程实现。
LCALL READ_BYTE
CPL P1.0 ;闪烁一个二极管,我们可以知道已经读出1个字节的数据。
LCALL USER_DLY ;用户延时设定Djnz R5,LOOP2
LCALL STOP ;读取完毕发出停止信号
AJMP RE_SHOW ;重复此读数据的过程。
子程序没贴上,因为字数限制。

1\你是用模拟器连了板子跑么?是不是连线连错了?

2\另外我记得我以前都是读到buffer里面,再由buffer写的,你可以试一下
我用的是AT89c52 keil c写的, 因为语言不同, 所以提两个参考吧, 没写过纯指令的

朋友,你的问题这么专业,,,帮不上你了,浪费100好可惜呀!!

我觉得一方面可能是硬件连接的问题,另外,LZ前面的那个“写命令”的字节代码是哪儿来的?这个我搞不懂,因为现在也在纠结如何用单片机往存储器里读写数据,希望LZ可以解释下~~(因为提问时间较早,不知道解决没?)