一 \ 实验目的 93C46 串行 EEPROM 数据读写 1 学会 93C46 的操作指令, 掌握 93C46 读 / 写程序的编写 2 掌握 93C46 与单片机的接口方式二 实验说明 93C46/56/66 是 1K/2K/4K 位的串行电可擦写的 EPROM 93C46 的 1K 位 EPROM, 可以按 128 字节排列, 也可以 64 字节排列 93C46 芯片有 8 脚, 当 ORG 接 VCC 时作 64 字使用 当 ORG 接地时作 128 字节使用 本实验单片机 P3 口的低 4 位是 93C46 的控制线和数据线 CS 是片选端, 高电平有效 SK 是移位脉冲输入端 D1 是数据输入端 D0 是数据位输出端 ORG 接 5V,93C46 作 64 个字使用 如图 :93C46 指令表 起始位操作码 地址 数指 字节字字节字 说明 RWEN 1 00 11XXXX 读 / 写允许 RWDS 1 00 00XXXX 读 / 写禁止 ERAL 1 00 10XXXX 擦写指令 WRAL 1 00 01XXXX D7~D0 D15~D0 同一数据写片 WRITE 1 01 A6~A0 A5~A0 D7~D0 D15~D0 写指定单元 READ 1 10 A6~A0 A5~A0 读指定单元 ERASE 1 11 A6~A0 A5~A0 擦除指定单元 本实验提供 93C46 的读写操作软件, 有 5 条主要的命令 :READ WRITE WRAL ERASE 和 ERAL 其中 EWEN( 写允许 ) 和 EWDS( 写禁止 ) 操作命令已经包含在写入命令和擦除命令 当中了 程序中寄存器 R7 用来指定 93C46 的地址,R6 R5 分别用来存放待操作数据的高低 字节 对主程序操作只要在调用子程序之前把相应的内容写进 R7 R6 R5 中就可以了 三 实验内容及步骤 1 使用 80C51 单片机最小应用系统和 93C46 串行接口模块, 用扁平数据线连接单片机 P0 口与八位逻辑电平显示模块, 用导线连接 P1.0 到 CS,P1.1 到 SK,P1.2 到 DI,P1.3 到 D0,ORG 与 +5V 电源相接 2 用串行数据通信线连接计算机与仿真器, 把仿真器插到模块的锁紧插座中, 请注意 仿真器的方向 : 缺口朝上 3 打开 Keil uvision2 仿真软件, 首先建立本实验的项目文件, 接着添加 93C46.ASM
源程序, 进行编译, 直到编译无误 按程序要求设置断点 4 进行软件设置, 选择硬件仿真, 选择串行口, 设置波特率为 38400 5 打开模块电源和总电源, 点击开始调试按钮, 点击 RUN 按钮运行程序 查看寄存器 R7 R6 R5 的值, 查看发光管显示情况 6 按程序要求设置下一个断点, 继续上一步骤 验证 93C46 可读可写 7 93C46 先写入数据, 断电一段时间后, 再读出数据, 查看是否与写入值一致 四 93C46 的流程图及源程序 1. 源程序 CS_93C46 BIT P1.0 SK_93C46 BIT P1.1 DI_93C46 BIT P1.2 DO_93C46 BIT P1.3 BIT_CNT EQU 10H ; 移位次数 BIT_SEND EQU 11H ; 发送 Bit 数 DATSEND EQU 12H ; 待发送数据缓存 ORG 0000H LJMP MAIN ORG 0030H MAIN: LCALL ERAL ; 把芯片的内容全部擦除 MOV R7,#10H ; 读进 10H 的内容查看 LCALL READ MOV A,R5 MOV P0,A ; 显示 R5 的值 MOV P2,A ; 显示 R6 的值 ; 在这里设置断点, 查看读入内容应为 R6=0FFH 和 R5=0FFH ;SJMP $ MOV R7,#10H ; 把 1234H 写到 10H 中 MOV R6,#12H MOV R5,#34H LCALL WRITE MOV R6,#00H MOV R5,#00H ; 改变 R5 R6 的值, 以变和后面比较 MOV R7,#10H ; 读进 10H 的内容查看 LCALL READ MOV A,R5 MOV P0,A ; 显示 R5 的值 MOV P2,A ; 显示 R6 的值
;SJMP $ ; 在这里设置断点, 查看读入内容应为 R6=12H 和 R5=34H MOV R7,#10H ; 把 10H 内容擦除 LCALL ERASE MOV R7,#10H ; 读进 10H 的内容查看 LCALL READ MOV A,R5 MOV P0,A ; 显示 R5 的值 MOV P2,A ; 显示 R6 的值 ; 在这里设置断点, 查看读入内容应为 R6=0FFH 和 R5=0FFH ;SJMP $ MOV R6,#56H ; 把 5678H 写到全部内存中 MOV R5,#78H LCALL WRAL MOV R6,#00H MOV R5,#00H ; 改变 R5 R6 的值, 以变和后面比较 MOV R7,#10H ; 读进 10H 的内容查看 LCALL READ MOV A,R5 MOV P0,A ; 显示 R5 的值 MOV P2,A ; 显示 R6 的值 ; 在这里设置断点, 查看读入内容应为 R6=12H 和 R5=34H SJMP $ ; 名称 : 读指令 (READ 指令 ) ; 功能 : 把 93C46 中 R7 所指向的内存的资料读到 R6(H),R5(L) READ: MOV DATSEND,#06H ; 发送读操作指令 MOV DATSEND,R7 ; 发送写入地址 SETB DO_93C46 ; 准备读入资料 MOV BIT_CNT,#16 READ1: SETB SK_93C46 ; 产生一个时钟信号 SETB SK_93C46
MOV C,DO_93C46 ; 读取 DO 的信息 MOV A,R5 ; 移位保存 RLC A MOV R5,A RLC A MOV R6,A DJNZ BIT_CNT,READ1 ; 名称 : 写指令 (WRITE 指令 ) ; 功能 : 把 R6(H),R5(L) 的资料写到 93C46 中 R7 所指向的内存中 WRITE: LCALL WEN_93C46 MOV DATSEND,#05H ; 发送写入操作指令 MOV DATSEND,R7 ; 发送写入地址 MOV DATSEND,R6 ; 发送写入资料 MOV BIT_SEND,#08H MOV DATSEND,R5 MOV BIT_SEND,#08H LCALL WDS_93C46 ; 名称 : 写全部 (WRAL 指令 ) ; 功能 : 把 R6(H),R5(L) 的资料写到 93C46 的全部内存中 WRAL: LCALL WEN_93C46 MOV DATSEND,#11H ; 发送写全部操作指令 MOV BIT_SEND,#05H
MOV DATSEND,#00H MOV BIT_SEND,#04H MOV DATSEND,R6 ; 发送写全部资料 ( 高位 ) MOV BIT_SEND,#08H MOV DATSEND,R5 ; 发送写全部资料 ( 低位 ) MOV BIT_SEND,#08H LCALL WDS_93C46 ; 名称 :START_93C46 ; 功能 : 片选 93C46 做好读 / 写资料的准备 START_93C46: SETB DO_93C46 SETB DI_93C46 SETB CS_93C46 JNB DO_93C46,$ ; 查询器件是否繁忙 SETB SK_93C46 CLR CS_93C46 CLR DI_93C46 SETB CS_93C46 ; 名称 :STOP_93C46 ; 功能 : 停止对 93C46 操作 STOP_93C46: CLR DI_93C46 CLR CS_93C46 SETB DO_93C46 ; 名称 :WEN_93C46(EWEN 指令 )
; 功能 :93C46 写允许 WEN_93C46: MOV DATSEND,#04H ; 发送开始位和写允许操作码, 共 3 位 ; 调用发送子程序 MOV DATSEND,#30H ; 发送 6 位的指令操作码 ; 名称 :WDS_93C46(EWDS 指令 ) ; 功能 :93C46 写禁止 WDS_93C46: MOV DATSEND,#04H ; 发送开始位和写禁止操作码, 共 3 位 ; 调用发送子程序 MOV DATSEND,#00H ; 发送 6 位的指令操作码 ; 名称 :ERASE(ERASE 指令 ) ; 功能 : 擦除 93C46 中 R7 所指向的地址的内容 ERASE: LCALL WEN_93C46 MOV DATSEND,#07H ; 发送擦除指令 MOV DATSEND,R7 LCALL WDS_93C46
; 名称 :ERAL(ERAL 指令 ) ; 功能 : 擦除 93C46 所有内容 ERAL: LCALL WEN_93C46 MOV DATSEND,#04H ; 发送全部擦除指令 MOV DATSEND,#20H LCALL WDS_93C46 ; 名称 :SEND_DATA ; 功能 : 资料发送子程序, 把待发送资料 DATSEND 的低 BIT_SEND 位送到 DI 上 SEND_DATA: ; 因为为了使程序容易读懂, 前面把要发送的内容 ; 直接送给 DATSEND, 而现在就要把 DATSEND 中无 ; 用的位去掉, 把要发送的内容移到最高位来 MOV BIT_CNT,BIT_SEND MOV A,#08H ; 计算要移位的个数 CLR C SUBB A,BIT_CNT MOV BIT_CNT,A JZ SEND_DATA2 ; 如果发送的位数为 8 位, 则不用移位, 跳转 MOV A,DATSEND ; 把要送出资料的移到 DATSEND 的最高位 SEND_DATA1: RL A DJNZ BIT_CNT,SEND_DATA1 JMP SEND_DATA3 SEND_DATA2: MOV A,DATSEND ; 把要送出的 8 位资料 DATSEND 传给 A SEND_DATA3: MOV BIT_CNT,BIT_SEND SEND_DATA4: RLC A ; 移位元送出 BIT_SEND 位资料 JC SEND_DATA5 CLR DI_93C46 ; 发送 0 码 JMP SEND_DATA6
SEND_DATA5: SETB DI_93C46 ; 发送 1 码 SEND_DATA6: SETB SK_93C46 ; 产生移位元时钟信号 DJNZ BIT_CNT,SEND_DATA4 END 五 思考题 1. 改变硬件连线修改程序, 把 93C46 改为以字节形式排列, 存放数据 2. 当应用电路与此电路不同时只需更改软件包里引脚的定义就可以了 六 实验电路 CS SK DI DO 1 2 3 4 5 6 7 8 13 12 15 14 31 19 18 9 17 16 P10 P11 P12 P13 P14 P15 P16 P17 INT1 INT0 T1 T0 EA/VP X1 X2 RESET RD WR 8051 P00 P01 P02 P03 P04 P05 P06 P07 P20 P21 P22 P23 P24 P25 P26 P27 RXD TXD ALE/P PSEN 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 10 11 30 29 CS VCC SK DC DI ORG DO GND 93C46 VCC 0.1uF CAP GND