实验六img)img)

元件

6116:2KB RAM,地址线 A0A10(11 根)、数据线 D0D7、控制端{WE}(写)、{OE}(读)、{CS}(片选)。
2716:2KB EPROM,地址线 A0A10、数据线 D0D7、控制端{OE}(读)、{CE}(片选)。
AT89C51:P0 口(地址 / 数据复用,需接锁存器 74HC573)、P2 口(高 8 位地址)。

连线

给 6116 和 2716 分配互不重叠的地址空间
eg:以 “6116 地址:0x20000x27FF;2716 地址:0x30000x37FF”


  1. 地址锁存 (P0 口→74HC573):
    AT89C51 的ALE(地址锁存允许)接 74HC573 的LE(锁存使能);
    AT89C51 的P0.0P0.7接 74HC573 的D0D7;
    74HC573 的Q0Q7接 6116 的A0A7 + 2716 的A0~A7。

  1. 高 8 位地址(P2 口):
    AT89C51 的P2.0P2.2接 6116 的A8A10 + 2716 的A8A10
    (因为 6116/2716 是 2KB,需要 11 根地址线,A0
    A10)

6116 的{~CS}:用 P2.5 控制(P2.5=0 时选中),所以P2.5接 6116 的{~CS};
2716 的{~CE}:用 P2.6 控制(P2.6=0 时选中),所以P2.6接 2716 的{~CE}。


  1. 数据总线(P0 口):
    AT89C51 的P0.0P0.7接 6116 的D0D7 + 2716 的D0~D7。

  1. 控制端
    6116 的{~WE}接 AT89C51 的WR(写控制);
    6116 的{~OE}接 AT89C51 的RD(读控制);
    2716 的{~OE}接 AT89C51 的RD(读控制)。
#include <reg51.h>
#include <absacc.h>  // 包含XBYTE、CODE等宏
 
// 定义6116的写地址(外部数据区)和读地址(外部程序区)
#define RAM_WRITE_ADDR 0x2030  // 6116写地址起始:0x2030
#define RAM_READ_ADDR  0x3030  // 6116读地址起始(当作程序区)
 
void main(void) {
    unsigned char i;
    unsigned char *ram_write_ptr = (unsigned char *)RAM_WRITE_ADDR;
    char code *ram_read_ptr = (char code *)RAM_READ_ADDR;  // MOVC方式用code指针
 
    // 1. 向6116的0x2030~0x2040写数据1、2…
    for(i=0; i<=0x10; i++){  // 从30H到40H共17个地址(0x40-0x30+1=17)
        ram_write_ptr[i] = i + 1;  // 写1、2…17
    }
 
    // 2. 用MOVC方式读6116的0x3030~0x3040数据(可在仿真中看变量值)
    unsigned char read_data;
    for(i=0; i<=0x10; i++){
        read_data = ram_read_ptr[i];  // MOVC指令读程序区
        // 这里可以加串口打印等操作,方便观察结果
    }
 
    while(1);  // 程序停在这里
}

2716是无仿真模型,替换成2732,就地址线多一根,其他一样 img)


没辙,最后换成MOVEX读取写入

    • -img)