在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-11-29 21:04:21 浏览: 119
DSP外扩存储器相关问题
这是一道比较典型的单片机外部扩展RAM的题目,下面我将为你详细介绍实现方法。
1. 硬件连接
62256芯片的接口如下图所示:
![62256芯片接口](https://img-blog.csdn.net/20180126163045724?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvMV9jaGFuZ2Vf/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
其中A0~A14为地址线,D0~D7为数据线,/WE和/OE为写使能和读使能信号,Vcc为芯片电源,GND为地线,/CE为芯片使能信号,一般连接到低电平。而8051芯片的外部扩展数据空间地址为0x8000~0xFFFF,因此需要将62256芯片映射到该地址空间。
具体连接方式如下:
- 将62256芯片的A0~A14连接到8051芯片的地址线P2.0~P2.14;
- 将62256芯片的D0~D7连接到8051芯片的数据线P0.0~P0.7;
- 将62256芯片的/WE和/OE分别连接到8051芯片的P3.6和P3.7;
- 将62256芯片的/CE连接到GND;
- 将62256芯片的Vcc和GND分别连接到电源和地线。
连接完成后,可以在Keil软件中进行地址映射,具体方法如下:
- 打开Keil软件,点击Project菜单,选择选项“Options for Target…”;
- 在弹出的对话框中,选择“Target”选项卡,在“Code Range”中填写0x0000~0x7FFF,在“Data Range”中填写0x8000~0xFFFF;
- 点击“OK”按钮保存设置。
2. 编程实现
在编程实现时,需要完成以下几个任务:
- 对62256芯片进行自检;
- 根据自检结果驱动LED闪烁。
具体实现方法如下:
首先需要定义62256芯片的地址和数据寄存器:
```c
sfr RAM_ADDR_H = 0x84; // 定义外部RAM地址高位寄存器
sfr RAM_ADDR_L = 0x83; // 定义外部RAM地址低位寄存器
sfr RAM_DATA = 0x80; // 定义外部RAM数据寄存器
sbit RAM_WE = P3^6; // 定义62256芯片的写使能信号
sbit RAM_OE = P3^7; // 定义62256芯片的读使能信号
```
然后编写自检函数RAM_Check(),该函数通过循环写入和读出数据来检测62256芯片是否正常:
```c
void RAM_Check()
{
unsigned int i;
unsigned char temp;
for (i = 0; i < 0x8000; i++) // 循环写入数据
{
RAM_ADDR_H = i >> 8;
RAM_ADDR_L = i & 0xFF;
RAM_DATA = i & 0xFF;
RAM_WE = 0;
RAM_WE = 1;
}
for (i = 0; i < 0x8000; i++) // 循环读出数据并比较
{
RAM_ADDR_H = i >> 8;
RAM_ADDR_L = i & 0xFF;
RAM_OE = 0;
temp = RAM_DATA;
RAM_OE = 1;
if (temp != (i & 0xFF))
{
LED_Red_Blink(2); // 自检不通过,红色LED每秒闪烁2次
while (1); // 停止程序执行
}
}
LED_Green_Blink(); // 自检通过,绿色LED每秒闪烁1次
}
```
在自检函数中,先通过循环写入数据来初始化62256芯片的所有存储单元,然后循环读出数据并与写入的数据比较,如果有不一致的情况则表示自检不通过,驱动红色LED每秒闪烁2次;否则表示自检通过,驱动绿色LED每秒闪烁1次。
最后,编写LED驱动函数LED_Green_Blink()和LED_Red_Blink(),分别用于驱动绿色和红色LED的闪烁:
```c
void LED_Green_Blink()
{
while (1)
{
P1 ^= 0x01;
delay(500);
}
}
void LED_Red_Blink(unsigned char times)
{
unsigned char i;
while (1)
{
for (i = 0; i < times; i++)
{
P1 ^= 0x02;
delay(500);
}
delay(500);
}
}
```
其中,delay()函数用于延时一段时间,具体实现如下:
```c
void delay(unsigned int t)
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 100; j++);
}
```
3. Proteus仿真
在Proteus软件中,可以将62256芯片和LED分别作为外部设备和输出设备添加到电路图中,然后连接到8051芯片的相应引脚。具体方法如下:
- 打开Proteus软件,选择“Schematic Capture”;
- 从左侧工具栏中选择62256芯片和LED,并拖动到电路图中;
- 右键单击62256芯片和LED,选择“Edit Properties”;
- 在弹出的对话框中,设置62256芯片的型号为“ATMEL AT62C256”,设置LED的颜色和初始状态;
- 连接62256芯片和LED到8051芯片的相应引脚;
- 完成电路图设计后,点击“Run”进行仿真。
4. 完整程序代码
```c
#include <reg52.h>
sfr RAM_ADDR_H = 0x84; // 定义外部RAM地址高位寄存器
sfr RAM_ADDR_L = 0x83; // 定义外部RAM地址低位寄存器
sfr RAM_DATA = 0x80; // 定义外部RAM数据寄存器
sbit RAM_WE = P3^6; // 定义62256芯片的写使能信号
sbit RAM_OE = P3^7; // 定义62256芯片的读使能信号
void delay(unsigned int t);
void RAM_Check();
void LED_Green_Blink();
void LED_Red_Blink(unsigned char times);
void main()
{
RAM_Check(); // 进行RAM自检
while (1); // 停止程序执行
}
void RAM_Check()
{
unsigned int i;
unsigned char temp;
for (i = 0; i < 0x8000; i++) // 循环写入数据
{
RAM_ADDR_H = i >> 8;
RAM_ADDR_L = i & 0xFF;
RAM_DATA = i & 0xFF;
RAM_WE = 0;
RAM_WE = 1;
}
for (i = 0; i < 0x8000; i++) // 循环读出数据并比较
{
RAM_ADDR_H = i >> 8;
RAM_ADDR_L = i & 0xFF;
RAM_OE = 0;
temp = RAM_DATA;
RAM_OE = 1;
if (temp != (i & 0xFF))
{
LED_Red_Blink(2); // 自检不通过,红色LED每秒闪烁2次
while (1); // 停止程序执行
}
}
LED_Green_Blink(); // 自检通过,绿色LED每秒闪烁1次
}
void LED_Green_Blink()
{
while (1)
{
P1 ^= 0x01;
delay(500);
}
}
void LED_Red_Blink(unsigned char times)
{
unsigned char i;
while (1)
{
for (i = 0; i < times; i++)
{
P1 ^= 0x02;
delay(500);
}
delay(500);
}
}
void delay(unsigned int t)
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 100; j++);
}
```
阅读全文