AT89S51驱动AT93C66



如今单片机程序都流行用C语言编写,所以新款的单片机外围接口芯片如串行时钟芯
片,串行存储芯片等等的驱动程序多半都是用C语言写的.比如,笔者发现一款经典的芯
片AT93C66(至少其性价比很高,而且简单易用),其驱动程序在很多资料上可以看到,
但几乎都是用C语言编写的,这样就给那些一贯使用汇编语言的工程师们(或者在必须使
用汇编语言的地方)带来诸多不便,笔者也用到过此芯片,由于主程序是用汇编语言编写
的,所以笔者只得将AT93C66的C语言驱动程序"翻译过来",经过验证,用在仪器上保
留数据,效果很理想.
现将此驱动程序介绍如下,仅供大家参考,希望能给您带来一点帮助或启示,还请多多
指教.
一,接线说明
AT89S51 AT93C66
P0.2 --------------------- CS
P0.6 --------------------- SK
P2.2 --------------------- DI
P2.6 --------------------- DO
注释:1,此连接与参考资料上的有所不同,是依据实际应用而定的,其中P2.6脚还可以
与其它外设复用,这样便可以节约内部资源,占用最少的单片机I/O口.
2,本程序是用单片机的普通I/O口来模拟串行口实现对AT93C66进行读写的.
二,子程序清单如
;**************************************************************************
;子程序说明:将一个字节的数据写入到AT93C66中指定的位置
;占用资源:R2保存写入AT93C66中的内部地址,R3保存要写的数据
;子程序调用:DEL4T,CLOCK ,SENT
;**************************************************************************
WRITE: SETB P0.2;
MOV R1 ,#09H ;送擦写允许指令
ACALL SENT ;调用模拟串行发送子程序
MOV R1,#80H
ACALL SENT
CLR P0.2 ; AT93C66 复位
ACALL DEL4T;
SETB P2.6
PDF created with pdfFactory trial version www.pdffactory.com
2
SETB P0.2 ;送擦写指令
MOV R1,#0EH
ACALL SENT
MOV A ,R2 ;送擦写地址
MOV R1,A
ACALL SENT
CLR P0.2
ACALL DEL4T
SETB P0.2
WL1: JB P2.6, WL2 ;等待擦完
SJMP WL1
WL2: CLR P0.2
ACALL DEL4T
SETB P0.2 ;送写地址指令
MOV R1, #0AH
ACALL SENT
MOV A, R2 ;送写地址
MOV R1, A
ACALL SENT
MOV A, R3 ;送写数据
MOV R1, A
ACALL SENT
CLR P0.2
ACALL DEL4T
SETB P0.2
WL3: JB P2.6, WL4 ;等待写完
SJMP WL3
WL4: CLR P0.2
ACALL DEL4T
RET
;**************************************************************************
;子程序说明:从AT93C66中指定的位置读出一个字节
;占用资源:R2保留要读的内部地址, A中存放读出的一个字节数据
;子程序调用:DEL4T,CLOCK,SENT,RECEIVE
;**************************************************************************
PDF created with pdfFactory trial version www.pdffactory.com
3
READ: SETB P0.2
MOV R1,#0CH;送读地址指令
ACALL SENT
MOV A, R2 ;送读地址
MOV R1,A
ACALL SENT
ACALL RECEIVE;调用模拟接受子程序
CLR P0.2
ACALL DEL4T
RET
;**************************************************************************
;子程序说明:延时子程序
;占用资源:无
;子程序调用:无
;**************************************************************************
DEL4T: NOP
NOP
NOP
NOP
NOP
NOP
RET
;**************************************************************************
;子程序说明:模拟时钟子程序
;占用资源:无
;子程序调用:无
;**************************************************************************
CLOCK: CLR P0.6
NOP
NOP
NOP
NOP
NOP
NOP
SETB P0.6
NOP
NOP
NOP
PDF created with pdfFactory trial version www.pdffactory.com
4
NOP
NOP
NOP
RET
;**************************************************************************
;子程序说明:模拟串行发送子程序
;占用资源: R0,R1
;子程序调用:无
;**************************************************************************
SENT: MOV R0,#08H
MOV A,R1
SD0: RLC A
JNC SD2
SETB P2.2
ACALL CLOCK
SD1: DJNZ R0,SD0
RET
SD2: CLR P2.2
ACALL CLOCK
SJMP SD1
;**************************************************************************
;子程序说明: 模拟串行接收子程序
;占用资源:R1,A(接受的一个字节的数据在A寄存器中)
;子程序调用:无
;**************************************************************************
RECEIVE: MOV R1,#08H
RE1: ACALL CLOCK
MOV C,P2.6 ;利用进位(C)位作为数据缓冲
RLC A
DJNZ R1,RE1
RET

版权所有:单片机教程网 2007
Email:erd51@163.com qq:58565254