本帖最后由 青蓝pisces 于 2017-2-6 22:08 编辑
首先简单介绍一下51单片机的总线: 51单片机的总线为了节省引脚,P0端口采用复用结构,复用了地址线的低8位和8位数据线。 解复用的电路这里暂时不讲述,如果大家有兴趣可以回帖提出,我会写个附录说一下。 使用74HC573配合51单片机的ALE(Address Latch Enable 地址锁存使能)信号, 从宏观上来看这个总线就变成了一个经典的并行总线,有16根地址线,8根三态的数据线,一个WR(Write)信号一个RD(Read)信号。
在WR信号有效期间数据线上的信号被存进对应地址的存储单元, 在RD信号有效期间对应地址单元的数据被送上总线,随后被CPU接收。
是不是很简单粗暴呢?
首先我们要给这两个寄存器分配地址,这里我以0x8000为基地址,向后偏移,即我们的两个寄存器所在地址空间为0x8000-0x8001。 想明白了这些,就开始设计外设寄存器的电路。 74HC573对输入输出各有一个信号来控制,即LE(Latch Enable 锁存使能)和OE(Output Enable 输出使能)。 当LE有效时输出等于输入,当LE无效时输出保持不变,与输入无关。 当OE无效时输出为高阻状态,有效时输出为正常高低电平。 那么我们只要设计好这两个信号的来源就算是完成了工作。
首先我们知道只有在地址满足要求并且写信号有效时总线的数据才能被写入寄存器。 所以LE连接一个与门,与门的两个输入信号: 一个是总线的WR信号(由于是低电平有效还需要一个非门进行反相) 一个暂时叫作地址有效信号。 图 - LE信号的组成
那么这个地址有效信号又由基地址有效和偏移地址有效两个信号相与组成,所以地址有效信号处也要作为一个与门的输出。 而这个与门的两个输入信号分别为基地址有效信号和偏移地址有效信号。 图 - 地址有效信号的组成
这里我们的基地址是0x8000,所以基地址有效信号可以简单的通过多输入与门实现(这里我们用了两个8输入与门和一个2输入与门)。 由于我们用地址线的低4位做了偏移地址(由74HC154译码为16个信号低电平有效信号), 所以将高12位相与(由于最高位是1,所以最高位要取反),这样就得到了基地址有效信号。 而偏移地址有效信号则可以直接从74HC154译码器中接出对应0的这根线,并进行取反。 图 - 地址译码器
这样我们就完成了一个寄存器的写操作电路,接下来实现读操作电路。 其实它们在总线端的逻辑是相同的,只是接到了不同的位置。 由于这里的数据需要连接到外部使用,所以不能直接接到数据总线, 而是需要通过一组三态门进行控制,当它需要被送上总线时打开三态门的使能,其他时候关闭三态门保持高阻状态,释放总线。
为了方便起见,我们使用特殊接法的74HC573来代替三态门(也可以用74HC244), 将74HC573的LE固定接高电平,它就退化为了一个三态门,OE信号即是三态门的输出控制信号。 将前面的写有效信号中的总线WR信号换为总线RD信号,就成为了读有效信号, 将这个信号接到三态门的OE引脚,这个外设寄存器就算完成了。
图 - 方向控制
图 - 两个寄存器之间的关系
接下来我们将这个外设寄存器电路复制3份,并排放置,就形成了4个外设寄存器。 将它们的偏移地址有效信号分别替换为1、2、3三根线,则CPU可以以0x8000-0x8003这4个地址访问到这4个寄存器。 接下来我们以2个寄存器为一组,来实现8位并行IO口外设。 按照我们的规划,可以将0x8000和0x8002两个寄存器作为两个IO端口(我们这里命名为PortA和PortB)的数据寄存器,将0x8001和0x8003作为它们的控制寄存器。 那么两个数据寄存器其实已经达到了要求,直接将寄存器的输出线引出即可。 而两个控制寄存器也只需要将输出线的最高位连接到数据寄存器的OE端即可完成控制方向的功能。
图 - 最终效果
这样我们的硬件就完成了! 为了演示这一过程,我提供了完整的仿真工程和软件工程,欢迎大家下载把玩。
接下来我将讲解固件库的代码。
|