2. 8155与8051单片机接口:地址锁存与译码、控制信号连接

好,咱们接着聊。上一章我们把8155的内部结构摸了个透,这一章就该真刀真枪地把它和8051连起来了。说实话,接口设计这块,是很多初学者容易翻车的地方。我当年第一次画这个电路图的时候,就因为一根地址线没接对,折腾了整整一个下午。

别担心,跟着我的思路走,你很快就能理清楚。

2.1 接口电路设计:先把“腿”对上

8051和8155之间怎么通信?说白了,就是靠一堆控制线和数据线。8051是主控,8155是外设。主控发号施令,外设乖乖执行。

我们先看看这两颗芯片的“腿”该怎么连。我习惯把连接分成三组来看:

  • 数据总线:8051的P0口(AD0~AD7)直接连到8155的AD0~AD7。注意,P0口是地址/数据复用的,所以后面必须加锁存器。
  • 地址锁存:8051的ALE引脚接锁存器(比如74LS373)的使能端,锁存器输出接8155的IO/M、CE、以及内部寄存器选择。
  • 控制信号:8051的RD、WR分别接8155的RD、WR。PSEN不用管,那是读程序存储器用的。

嗯,这里要注意一点:8155的CE(片选)引脚,必须由8051的高位地址线来产生。为什么?因为我们要给8155分配一个唯一的地址空间。

核心要点:8051的P0口是地址/数据复用的,ALE信号就是用来“分离”它们的。没有ALE,地址就锁不住,系统就会乱套。

2.2 地址锁存与译码:别让地址“跑偏”了

地址锁存这块,我多说两句。8051的P0口在ALE为高电平时输出地址低8位,ALE下降沿时锁存器把这个地址“抓住”。然后P0口就切换成数据模式了。

你想想看,如果没有锁存器,地址信号和数据信号就会在P0口上打架。8155根本分不清哪个是地址、哪个是数据。

我常用的锁存器是74LS373,便宜又好用。连接方式很简单:

8051 P0.0~P0.7 → 74LS373 D0~D7
8051 ALE → 74LS373 LE (锁存使能)
74LS373 Q0~Q7 → 8155 AD0~AD7 (同时作为地址低8位)
74LS373 OE → 直接接地 (一直输出)

至于地址译码,这就涉及到8155的片选信号CE了。8155内部有256个字节的RAM、6个I/O口、1个定时器。它们怎么被访问?靠的是IO/M引脚和地址线A2~A0。

我画个表格,你一看就明白:

IO/M A2 A1 A0 选中单元 地址范围(举例)
0 无关 256字节RAM 0x00~0xFF
1 0 0 0 命令/状态寄存器 0x00
1 0 0 1 PA口 0x01
1 0 1 0 PB口 0x02
1 0 1 1 PC口 0x03
1 1 0 0 定时器低8位 0x04
1 1 0 1 定时器高6位+模式 0x05

你看,只要IO/M为1,A2~A0就决定了访问哪个I/O口。那CE怎么接?我建议用8051的P2.7来选通8155。比如:

P2.7 → 8155 CE (低电平有效)
P2.6 → 8155 IO/M

这样,当P2.7=0、P2.6=0时,访问的是RAM区。当P2.7=0、P2.6=1时,访问的是I/O区。地址范围分别是:

  • RAM区:0x7F00 ~ 0x7FFF(假设P2.7=0,其他高位随意)
  • I/O区:0xBF00 ~ 0xBF05(P2.7=0, P2.6=1)

我的小技巧:实际项目中,我习惯把8155的地址映射到0x7F00~0x7FFF这段。因为P2.7是最高位,用起来最方便。而且这个地址段不容易和程序存储器冲突。

2.3 控制信号连接:让它们“握手”成功

控制信号这块,相对简单。8051的RD和WR直接连到8155的RD和WR就行。但有个坑,我必须要提醒你。

8051的RD和WR是低电平有效的,8155的也是。所以直接连没问题。但是,8051的ALE信号频率不能太高。我记得有一次,我把晶振从12MHz换成了24MHz,结果8155死活不工作。查了半天,发现是ALE频率太高,锁存器跟不上了。

我曾经踩过的坑:8155的ALE输入有最大频率限制,一般不超过10MHz。8051的ALE是晶振频率的1/6。所以晶振别超过60MHz。当然,8051本身也跑不了那么快,但还是要留个心眼。

另外,8155的RESET引脚要和8051的RESET连在一起。这样上电时两个芯片同时复位,状态一致。我见过有人忘了接RESET,结果8155里的寄存器全是随机值,系统一上电就乱跑。

最后,别忘了给8155接一个合适的晶振。8155内部有时钟发生器,但需要外部晶振。我一般用6MHz或12MHz的,和8051的晶振保持一致,这样时序上不会出问题。

2.4 完整的接口电路图(文字描述)

说了这么多,咱们把整个电路串起来。一个典型的8155+8051接口电路是这样的:

  1. 数据总线:P0.0~P0.7 → 74LS373 D0~D7 → 8155 AD0~AD7
  2. 地址锁存:ALE → 74LS373 LE,74LS373 Q0~Q7 → 8155 AD0~AD7(低8位地址)
  3. 高位地址:P2.7 → 8155 CE,P2.6 → 8155 IO/M
  4. 控制信号:RD → 8155 RD,WR → 8155 WR,RESET → 8155 RESET
  5. 时钟:6MHz晶振接8155 XTAL1和XTAL2

你看,其实没多少线。但每一条都很关键。我刚开始做的时候,总觉得线多就复杂,后来发现,只要分组去理,思路就清晰了。

嗯,这一章的内容就到这里。下一章我们开始写代码,让8155真正跑起来。到时候你会看到,硬件连对了,软件写起来就顺风顺水。