本帖最后由 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读出的数据。
电路图原理图:
|