在8051单片机片外扩62256芯片(32K Bytes RAM),将其映射到8051芯片的外部数据空间地址0x8000—0xFFFF并编程实现对62256芯片RAM自检,在P1.0口驱动绿色LED,P1.1口驱动红色LED,当自检通过时绿色LED每秒闪烁1次,红色LED不亮;当自检不通过时红色LED每秒闪烁2次,绿色LED不亮。使用Proteus软件设计原理图,使用Keil软件进行单片机程序设计,最后采用Proteus进行仿真。
时间: 2023-10-15 10:06:52 浏览: 201
首先需要将62256芯片与8051单片机进行连接,建立外部数据空间地址0x8000—0xFFFF的映射关系。可以使用74HC373锁存器来实现地址线的扩展。具体连接方式如下图所示:
![image.png](attachment:image.png)
其中,OE和WE信号连接到P3口,A0~A14地址线连接到74HC373锁存器的D0~D14端口,A15地址线连接到74HC373锁存器的OE端口。62256芯片的数据线连接到P0口。
接下来是自检程序的编写。62256芯片的自检主要是对芯片的读写功能进行测试。我们可以先将芯片所有地址位置为0xFF,然后写入一个数据并读出来,判断读出的数据是否和写入的相同。程序如下所示:
```c
#include <reg52.h>
sbit LED_GREEN = P1^0; // 绿色LED连接到P1.0口
sbit LED_RED = P1^1; // 红色LED连接到P1.1口
// 62256芯片地址线扩展使用的74HC373锁存器连接方式
sbit ADDR_LATCH = P2^0; // 地址锁存器的锁存控制信号,连接到P2.0口
sbit ADDR_OE = P2^1; // 地址锁存器的输出使能信号,连接到P2.1口
sbit ADDR_DATA = P2^2; // 地址锁存器的数据输入信号,连接到P2.2口
// 62256芯片的读写控制信号连接方式
sbit RAM_OE = P3^6; // 62256芯片的输出使能信号,连接到P3.6口
sbit RAM_WE = P3^5; // 62256芯片的写使能信号,连接到P3.5口
void delay_ms(unsigned int ms) // 延时函数,单位为毫秒
{
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<1141; j++);
}
void write_ram(unsigned int addr, unsigned char dat) // 向62256芯片写入一个字节
{
ADDR_LATCH = 0; // 地址锁存器的锁存控制信号置低
ADDR_DATA = addr & 0xFF; // 将地址低8位写入锁存器的数据输入端口
ADDR_LATCH = 1; // 地址锁存器的锁存控制信号置高,锁存地址
ADDR_DATA = addr >> 8; // 将地址高6位写入锁存器的数据输入端口
RAM_OE = 1; // 先将输出使能信号置高,禁止输出
RAM_WE = 0; // 将写使能信号置低,准备写入数据
P0 = dat; // 将要写入的数据写入到数据口
RAM_WE = 1; // 将写使能信号置高,写入数据
RAM_OE = 0; // 将输出使能信号置低,准备输出数据
}
unsigned char read_ram(unsigned int addr) // 从62256芯片读取一个字节
{
unsigned char dat;
ADDR_LATCH = 0; // 地址锁存器的锁存控制信号置低
ADDR_DATA = addr & 0xFF; // 将地址低8位写入锁存器的数据输入端口
ADDR_LATCH = 1; // 地址锁存器的锁存控制信号置高,锁存地址
ADDR_DATA = addr >> 8; // 将地址高6位写入锁存器的数据输入端口
RAM_OE = 0; // 先将输出使能信号置低,准备输出
dat = P0; // 读取数据口上的数据
RAM_OE = 1; // 将输出使能信号置高,禁止输出
return dat;
}
void main()
{
unsigned int addr;
unsigned char dat;
LED_GREEN = 0; // 绿色LED初始状态不亮
LED_RED = 0; // 红色LED初始状态不亮
// 将62256芯片所有地址位置为0xFF
for(addr=0; addr<32768; addr++)
write_ram(addr, 0xFF);
// 写入一个数据并读出来
write_ram(0x0000, 0x55);
dat = read_ram(0x0000);
// 判断读出的数据是否和写入的相同
if(dat == 0x55)
{
LED_GREEN = 1; // 自检通过,绿色LED每秒闪烁1次
while(1)
{
LED_GREEN = ~LED_GREEN;
delay_ms(500);
}
}
else
{
LED_RED = 1; // 自检不通过,红色LED每秒闪烁2次
while(1)
{
LED_RED = ~LED_RED;
delay_ms(250);
LED_RED = ~LED_RED;
delay_ms(250);
}
}
}
```
程序中使用了两个函数`write_ram()`和`read_ram()`来分别向62256芯片写入一个字节和从62256芯片读取一个字节。在`main()`函数中,首先将62256芯片所有地址位置为0xFF,然后将一个数据0x55写入地址0x0000,再从地址0x0000读取数据并判断读出的数据是否和写入的相同。如果相同,则自检通过,绿色LED每秒闪烁1次;如果不相同,则自检不通过,红色LED每秒闪烁2次。
最后使用Proteus进行仿真,验证程序的正确性。将程序烧录到8051单片机中,并连接LED和62256芯片,运行仿真,可以看到当自检通过时,绿色LED每秒闪烁1次,红色LED不亮;当自检不通过时,红色LED每秒闪烁2次,绿色LED不亮。仿真结果如下图所示:
![image.png](attachment:image.png)
阅读全文