本帖最后由 tlled 于 2023-1-16 10:15 编辑
#申请原创# @21小跑堂
现在ARM芯片的内部存储和外设资源很丰富了,最近翻出了几个老旧芯片,设计个测试板来学习下51单片机总线的使用。
一、硬件方面
51单片机是学习MCU入门的基础,之前在教程上学习过外部总线的扩展方式。我设计这个板子主要是了解外设总线扩展的使用。
外扩了2片6264(8K*8)RAM芯片,1片27C512芯片,1片UM82C55芯片和单色12864显示屏模块
1.1、硬件实物图
1.2、电路图原理图
1.3、外部总线
51单片机低8位地址线和数据线是共用的,需要地址锁存器来区分地址和数据线,比较常用的是74LS373或74LS273,我在原理图中设计兼容了这两种芯片。
这里使用到了MCU的ALE--地址锁存信号
外部总线使用了74LS138译码器来扩展外部设备的片选信号,连接示意图如下
电路图中,实际的连接。
这次测试的外部RAM地址总线地址:
第一片6264地址范围:0000H~1FFFH (8K) , 在这个地址范围内,地址A15,A14,A13选择Y0端口,使能(U4)6264芯片
第二片6264地址范围:2000H~3FFFH (8K) , 在这个地址范围内,地址A15,A14,A13选择Y1端口,使能(U5)6264芯片
二、程序方面
分别在RAM1(U4)和RAM2(U5)写入256个字节,变打印输出。
访问外部总线设备使用到XBYTE,这个在头文件#include "absacc.h"中定义,使用时,要包含这个头文件。
2.1、程序代码
#include "config.h"
void main(void)
{
uint ram_addr=0;
Init_Uart();
TimerInit();
//RAM1
send_char_com(0x2A);
for(ram_addr=0;ram_addr<256;ram_addr++)
{
XBYTE[ram_addr]=ram_addr;
send_char_com(ram_addr);
}
send_char_com(0x2B);
for(ram_addr=0;ram_addr<256;ram_addr++)
{
send_char_com(XBYTE[ram_addr]);
}
//RAM2
send_char_com(0x2C);
for(ram_addr=0;ram_addr<256;ram_addr++)
{
XBYTE[0x2000+ram_addr]=ram_addr;
send_char_com(ram_addr);
}
send_char_com(0x2D);
for(ram_addr=0;ram_addr<256;ram_addr++)
{
send_char_com(XBYTE[0x2000+ram_addr]);
}
while(1)
{
}
}
2.2、测试输出
这里测试,我使用了STC89C52芯片,来完成外部RAM芯片的读写。
2A开头是写入RAM1的数据,2B开头是从RAM1读出的数据
2C开头是写入RAM2的数据,2D开头是从RAM2读出的数据。
电路图原理图:
SCH_M51_BOARD.pdf
(611.07 KB)
|
点赞
传统51单片机RAM较小,大多需要外扩RAM,方便处理大量数据。在某些情况下,用普通51单片机通过片外扩展RAM要比直接使用增强型51单片机更能节约成本。