作者:平凡单片机
- 第三个实验
上两次我们做过两个实验,都是让 P1.0 这个引脚使灯亮,我们可以设想:既然 P1.0 可以让灯亮,那么其它的引脚可不可以呢?看一下图 1 ,它是 8031 单片机引脚的说明,在 P1.0 旁边有 P1.1 , P1.2….P1.7 ,它们是否都可以让灯亮呢?除了以 P1 开头的外,还有以 P0 , P2 , P3 开头的,数一下,一共是 32 个引脚,前面我们以学过 7 个引脚,加上这 32 个这 39 个了。它们都以 P 字开头,只是后面的数字不一样,它们是否有什么联系呢?它们能不能都让灯亮呢?在我们的实验板上,除了 P10 之外,还有 P11 �� P17 都与 LED 相连,下面让我们来做一个实验,程序如下:
MAIN : MOV P1 , #0FFH
LCALL DELAY
MOV P1 , #00H
LCALL DELAY
LJMP MAIN
DELAY : MOV R7 , #250
D1 : MOV R6 , #250
D2 : DJNZ R6 , D2
DJNZ R7 , D1
RET
END
将这段程序转为机器码,用编程器写入芯片中,结果如何?通电以后我们可以看到 8 只 LED 全部在闪动。因此, P10 �� P17 是全部可以点亮灯的。事实上,凡以 P 开头的这 32 个引脚都是可以点亮灯的,也就是说:这 32 个引脚都可以作为输出使用,如果不用来点亮 LED ,可以用来控制继电器,可以用来控制其它的执行机构。
程序分析:这段程序和前面做过的程序比较,只有两处不一样:第一句:原来是 SETB P1.0 ,现在改为 MOV P1 , #0FFH ,第三句:原来是 CLR P1.0 ,现在改为 MOV P1.0 , #00H 。从中可以看出, P1 是 P1.0 �� P1.7 的全体的代表,一个 P1 就表示了所有的这八个管脚了。当然用的指令也不一样了,是用 MOV 指令。为什么用这条指令?我们把 P1 作为一个整体,就把它当作是一个存储器的单元,对一个单元送进一个数可以用 MOV 指令。
二、第四个实验
除了可以作为输出外,这 32 个引脚还可以做什么呢?下面再来做一个实验,程序如下:
MAIN : MOV P3 , #0FFH
LOOP : MOV A , P3
MOV P1 , A
LJMP LOOP
先看一下实验的结果:所有灯全部不亮,然后我按下一个按钮,第()个灯亮了,再按下另一个按钮,第()个灯亮了,松开按钮灯就灭了。从这个实验现象结合电路来分析一下程序。
从硬件电路的连线可以看出,有四个按钮被接入到 P3 口的 P32 , P33 , P34 , P35 。第一条指令的用途我们可以猜到:使 P3 口全部为高电平。第二条指令是 MOV A , P3 ,其中 MOV 已经见,是送数的意思,这条指令的意思就是将 P3 口的数送到 A 中去,我们可以把 A 当成是一个中间单元(看图 3 ),第三句话是将 A 中的数又送到 P1 口去,第四句话是循环,就是不断地重复这个过程,这我们已见过。当我们按下第一个按钮时,第( 3 )只灯亮了,所以 P12 口应当输出是低电平,为什么 P12 口会输出低电平呢?我们看一下有什么被送到了 P1 口,只有从 P3 口进来的数送到 A ,又被送到了 P1 口,所以,肯定是 P3 口进来的数使得 P12 位输出电平的。 P3 口的 P32 位的按钮被按下,使得 P32 位的电平为低,通过程序,又使 P12 口输出低电平,所以 P3 口起来了一个输入的作用。验证:按第二、三、四个按钮,同时按下 2 个、 3 个、 4 个按钮都可以得到同样的结论,所以 P3 口确实起到了输入作用,这样,我们可以看到,以 P 字开头的管脚,不仅可以用作输出,还可以用作输入,其它的管脚是否可以呢?是的,都可以。这 32 个引脚就称之为并行口,下面我们就对并行口的结构作一个分析,看一下它是怎样实现输入和输出的。
- 并行口结构分析:
1 、输出结构
先看 P1 口的一位的结构示意图(只画出了输出部份):从图中可以看出,开关的打开和合上代表了引脚输出的高和低,如果开关合上了,则引脚输出就是低,如果开关打开了,则输出高电平,这个开关是由一根线来控制的,这根数据总线是出自于 CPU ,让我们回想一下,数据总线是一根大家公用的线,很多的器件和它连在一起,在不同的时候,不同的器件当然需要不同的信号,如某一时刻我们让这个引脚输出高电平,并要求保持若干时间,在这段时间里,计算机当然在忙个不停,在与其它器件进行联络,这根控制线上的电平未必能保持原来的值不变,输出就会发生变化了。怎么解决这个问题呢?我们在存储器一节中学过,存储器中是可以存放电荷的,我们不妨也加一个小的存储器的单元,并在它的前面加一个开关,要让这一位输出时,就把开关打开,信号就进入存储器的单元,然后马上关闭开关,这样这一位的状态就被保存下来,直到下一次命令让它把开关再打开为止。这样就能使这一位的状态与别的器件无关了,这么一个小单元,我们给它一个很形象的名字,称之为“锁存器”。
2 、输入结构
这是并行口的一位的输出结构示意图,再看,除了输出之外,还有两根线,一根从外部引脚接入,另一根从锁存器的输出接出,分别标明读引脚和读锁存器。这两根线是用于从外部接收信号的,为什么要两根呢?原来,在 51 单片机中输入有两种方式,分别称为‘读引脚和‘读锁存器,第一种方式是将引脚作为输入,那是真正地从外部引脚读进输入的值,第二种方式是该引脚处于输出状态时,有时需要改变这一位的状态,则并不需要真正地读引脚状态,而只是读入锁存器的状态,然后作某种变换后再输出。
请注意输入结构图,如果将这一根引线作为输入口使用,我们并不能保证在任何时刻都能得到正确的结果(为什么?)。接在外部的开关如果打开,则应当是输入 1 ,而如果闭合开关,则输入 0 ,但是,如果单片机内部的开关是闭合的,那么不管外部的开关是开还是闭,单片机接受到的数据都是 0 。可见,要让这一端口作为输入使用,要先做一个‘准备工作,就是先让内部的开关断开,也就是让端口输出‘ 1 才行。正因为要先做这么一个准备工作,所以我们称之为“准双向 I/O 口”。
以上是 P1 口的一位的结构, P1 口其它各位的结构与之相同,而其它三个口: P0 、 P2 、 P3 则除入作为输入输出口之外还有其它用途,所以结构要稍复杂一些,但其用于输入、输出的结构是相同的。看图()。对我们来说,这些附加的功能不必由我们来控制,所以我们就不去关心它了。