1.3 8051的接口
数据池的每一数据位宽为8位,也就是每次从数据池取出一个单元的数据都为8位。数据池和指令池不同的是,它的构成更加复杂。指令池作为存放预先编译的指令汇集,它完全可以用ROM来代替(ROM是只能读不能写),我们只执行命令时,希望命令保持不变。数据池是一类数据的集合,它可以是RAM、某种特殊用途的寄存器,也可以是输入、输出引脚。
图1.2是某种8051单片机的内部架构框图。乍一看其全是条条框框的功能模块。不过不要紧,我们不是8051的嵌入式软件或硬件设计者,不必细究它们各自的详细含义。我们只需观其大略。
图1.2 8051单片机的内部架构框图
首先,通过该图了解它的引脚。最左边的边框,从上到下:VCC和VSS是供电引脚,PSEN用来读取外部指令池,ALE用来锁存输出的地址,EA是用来激活外界接入存放指令的ROM的,此三者都是用在外界连接存储空间的;RST用来对单片机复位。
最下部是晶振。XTAL1/XTAL2是两个连接着的晶振,一般来说,在12个周期的晶振时间内,CPU会执行一条8051指令。当然ARM9、Cortex-m0这样RISC架构的CPU会一个周期执行一条。8051的指令有它的特殊性,这个在后面会讲到。
剩下的是四个8位宽的接口:P0.0~P0.7、P1.0~P1.7、P2.0~P2.7、P3.0~P3.7。前面的接口我们大略知道它们的功用,而这四个接口既可以用作输入端口,也可以用作输出端口。它是单片机和芯片外部交换数据的主要通道。它既可以和EA、ALE、PSEN结合起来从外界读指令池的指令,也可以用作读取外界存放的数据池的数据,它还能用作通用接口(即GPIO)。
那么这四个接口(P0~P3)是如何被8051的处理器感知和使用的呢?P0、P1、P2和P3属于数据池的一部分,它们各自拥有不同的地址。它们的地址分别对应的是:80H、90H、A0H、B0H(后面的H代表前面的数据属于十六进制)。开发者在读P0的时候,只需要驱动C或汇编程序从80H的地址读取它对应的数据则可,那么单片机会把P0作为输入引脚,并将外界对它输入的电平信息告知处理器。处理器就会明确P0接口的状况如何,这就实现了读取操作。
同样,当开发者想改变P3接口的电平状态时,他可以对B0H地址写入他想写的字节数值。处理器会把写信息送到P3接口。那么P3就作为输出引脚,开发者想要的输出电平信息就反映在P3这7个引脚上了。
正因为这样,单片机只有一个,但我们可以连接P0~P3到不同的应用场合,并通过读取或改写它不同的端口状态来达到特定的使用需求。这就是单片机灵活通用的所在。单片机只是一种让开发者任意改变来满足自身需求的手段。
读者要问了,为什么是四组接口呢?单片机作为一种通用的手段,它只规定有四个,若觉得太少,可想其他方法来解决这个资源冲突。但如果在FPGA里面使用8051软核处理器,那就完全可按照自己的需求定制。当然除非是专精于8051单片机编程的程序员会觉得接口多了少了不习惯。但编者也相信他会因为FGPA的高度灵活和可配置性而改变他的习惯。
在这四大接口中,P3比较特殊,它可以充作他用。表1-1是它的其他功用的列表。
表1-1P3端口的可选功能引脚含义