本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
程序就是下面这样,我先调用AT93WRIT,然后调用AT93READ,比较结果不匹配,不知道是读有问题还是写有问题,或者两部分都不对,分析了很久没有头绪,求高手帮我看看,多谢指点!!!!
单片机用的是89C51,芯片是AT93C46,DI和DO口连到同一个口复用。
CS bit P2.2
DIO bit P2.0
CLK bit P2.1
ADDH equ 40H ;操作指令
ADDL equ 41H ;操作指令+地址
_93add equ 42H ;地址
_93data equ 43H ;数据
;★★93c46读写子程序★★★★★★★★★★★★★★★★★★★★★★★★
;资源:程序中用到R6,操作地址为_93add,收、送数据_93data
;使用8位操作,ORG接地
;调用程序
AT93READ: ;读
CLR CS ;初始
CLR DIO
MOV ADDH,#11B ;读指令110
MOV ADDL,#00000000B ;传送指令和地址
MOV _93add,#00H
MOV A,_93add
ORL A,ADDL
MOV ADDL,A ;地址加入
LCALL READDATA ;读指令
RET
AT93WRIT: ;写允许
CLR CS ;初始
CLR DIO
MOV ADDH,#10B
MOV ADDL,#01100000B ;9346允许擦除指令
LCALL WRICOMM ;写允许擦写指令
;写数据
MOV ADDH,#10B ;写指令101
MOV ADDL,#10000000B ;传送指令和地址
MOV A,_93add
ORL A,ADDL
MOV ADDL,A ;地址合成加入
LCALL WRIDATA ;将_93data中的数据写到片中
EWEND: ;写禁止
MOV ADDH,#10B
MOV ADDL,#00000000B
LCALL WRICOMM ;写禁止
RET
;******* 9 3公共子程序************************************
;写不含地址的指令,如,写允许、禁止、擦除等
;**************************************************************
WRICOMM: SETB CS ;复位
MOV R6,#8
MOV ACC,ADDH ;送出指令字
WCOM: RLC A
MOV DIO,C ;移出到C并送DIO端
LCALL D15US
SETB CLK
LCALL D15US
CLR CLK
LCALL D15US
DJNZ R6,WCOM
MOV R6,#8
MOV ACC,ADDL ;送出地址
WADD: RLC A
MOV DIO,C ;移出到C并送DIO端
LCALL D15US
SETB CLK
LCALL D15US
CLR CLK
LCALL D15US
DJNZ R6,WADD
CLR CS
RET
;******* 9 3公共子程序************************************
;写数据???OP+地址+ADDH+ADDL 数据由_93data传来;
;**************************************************************
WRIDATA: SETB CS ;复位
MOV R6,#8
MOV ACC,ADDH ;送出指令字
WSCOM: RLC A
MOV DIO,C ;移出到C并送DIO端
LCALL D15US
SETB CLK
LCALL D15US
CLR CLK
LCALL D15US
DJNZ R6,WSCOM
MOV R6,#8
MOV ACC,ADDL ;送出地址
WSADD: RLC A
MOV DIO,C ;移出到C并送DIO端
LCALL D15US
SETB CLK
LCALL D15US
CLR CLK
LCALL D15US
DJNZ R6,WSADD
MOV R6,#8
MOV ACC,_93data ;送出数据
WSDAT: RLC A
MOV DIO,C ;移出到C并送DIO端
LCALL D15US
SETB CLK
LCALL D15US
CLR CLK
LCALL D15US
DJNZ R6,WSDAT
CLR CS
SETB DIO
JNB DIO,$ ;等待写完
RET
;******* 9 3公共子程序************************************
;读数据,命令+地址=ADDH+ADDL;读出的数据在_93data中
;-----------------------------------------------------
READDATA: SETB CS ;复位
MOV R6,#8
MOV ACC,ADDH ;送出指令字
RSCOM: RLC A
MOV DIO,C ;移出到C并送DIO端
LCALL D15US
SETB CLK
LCALL D15US
CLR CLK
LCALL D15US
DJNZ R6,RSCOM
MOV R6,#8
MOV ACC,ADDL ;送出地址
RSADD: RLC A
MOV DIO,C ;移出到C并送DIO端
LCALL D15US
SETB CLK
LCALL D15US
CLR CLK
LCALL D15US
DJNZ R6,RSADD
SETB DIO
MOV R6,#8
READD: LCALL D15US ;读时,先时钟,后数据
SETB CLK
LCALL D15US
CLR CLK
LCALL D15US
MOV C,DIO ;读取数据
RLC A
DJNZ R6,READD
CLR CS ;CS=0
MOV _93data,A
CLR DIO
CLR CS
RET
;******延时子程序************************************************
;串行时钟延时程序(15US) 12M晶体
;----------------------------------------------------------------
D15US: PUSH PSW ;3区
SETB RS0
SETB RS1
MOV R4,#8
DJNZ R4,$
POP PSW
RET
;★★93c46读写子程序结束★★★★★★★★★★★★★★★★★★★★★★★★ |