找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

关于93C46的读写程序,高手帮我看看哪里出问题了。。

[复制链接]
admin 发表于 2012-9-2 08:40:18 | 显示全部楼层 |阅读模式

本文包含原理图、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读写子程序结束★★★★★★★★★★★★★★★★★★★★★★★★
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-24 10:32 , Processed in 0.056207 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表