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接口电路是这样的:
- 数据总线:P0.0~P0.7 → 74LS373 D0~D7 → 8155 AD0~AD7
- 地址锁存:ALE → 74LS373 LE,74LS373 Q0~Q7 → 8155 AD0~AD7(低8位地址)
- 高位地址:P2.7 → 8155 CE,P2.6 → 8155 IO/M
- 控制信号:RD → 8155 RD,WR → 8155 WR,RESET → 8155 RESET
- 时钟:6MHz晶振接8155 XTAL1和XTAL2
你看,其实没多少线。但每一条都很关键。我刚开始做的时候,总觉得线多就复杂,后来发现,只要分组去理,思路就清晰了。
嗯,这一章的内容就到这里。下一章我们开始写代码,让8155真正跑起来。到时候你会看到,硬件连对了,软件写起来就顺风顺水。