一.单片机I/O 口的输出实验
1.实验程序
程序如下:
LOOP:MOV P1,#0FFH ; LCALL DELAY ; MOV P1,#00H ; LCALL DELAY ; LJMP LOOP ;
调试,写入源代码,编译,下载,看到了什么?8 只LED 灯都在闪烁(注意:前面的实验是让一个LED 灯闪烁),分析一下程序:
2.程序分析
这段程序和前面的程序比较,有两处不同,第1 条,原来是SETB P1.0,现在改为MOV P1,#0FFH,第3 条,原来是CLR P1 ,现在改为MOV P1,#00H 。为什么这样改了之后就变成了8 只LED 灯同时闪烁了?原来P1 代表了P1.7-P1.0 的全部,我们把它当作一个存储器单元(即一个字节),不过对一个存储器单元送数就应该用MOV 指令了;在这里P1(P1.7-P1.0 )接的是LED 灯(也就是负载),它起到了一个输出端的作用。那如果把P1 改为P2 或P3 或P4 行不行呢?答案是肯定的,为什么?我们稍后再谈,接着看第2 个实验。二.单片机I/O 口的输入实验
1.实验程序
程序如下:
MAIN:MOV P3,#0FFH ;
把程序下载到单片机,按下第1 个按钮,第1 个LED 灯亮了,按下第2 个按钮,第2 个LED 灯亮了,松开按钮,相应的灯就灭了,是不是有点象工业控制中的点动控制原理。分析一下这个程序:
2.程序分析
看附图的硬件接线图,有4 个按钮分别接到了P3.2,P3.3,P3.4,P3.5 ,引脚上。再来分析一下程序,第1 条,使P3 口(包括P3.7-P3.0 )全部为高电平(为什么MOV P3,#0FFH 能使P3 口全部为高电平,我们在下一课中讨论);第2 条MOV A,P3;MOV 我们已经知道,是送数的意思,这条指令的意思就是把P3 口的数送到A 中去,A 是什么呢?我们也可以把它看成一个中间单元,就象R7 寄存器一样,第3 条指令就是把A 中的数送到P1 口去;第4 条是循环,这些我们都已经见过,当我们按下P3.2 所连接的按钮时,#0FFH 这个数就被送到了A 中,通过程序又送到了P1,使P1.2 输出低电平,LED3 就亮了,按下P3.3-P3.5 连接的按钮,对应的LED4-LED6 也亮了,松开按钮,相应的LED 灯就灭了。如果把按钮接到P2.0-P2.7 或P4.0-P4.7 可不可以呢?当然可以。所以在这里P3 口又起到了一个输入端的作用。
由上面两个实验我们得出结论,凡是以P 开头的管脚都可以用作输入输出口,在89C51 中这32 个管脚我们就称之为并行口。它们实际上就是特殊功能存储器SFR (什么是特殊功能寄存器,我们后面再讲)中的四个,记作P0,P1,P2,P3,它们都是双向通道,即既可以作为输出口,也可以作为输入口,作输出时数据可以锁存,作输入时数据可以缓冲,那么它们是怎么实现输入输出功能的呢?继续往下看。
三.单片机并行口的结构分析先来看看输入结构:
1.输入结构
I/O 口作为输入口时有两种工作方式,即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。比如取反,置位,清零等等指令;而读端口时才真正地把外部的数据读入到内部总线,图中的两个三角形表示的就是输入缓冲器,CPU 将根据不同的指令,分别发出“读端口”或“读引脚”信号,以完成不同的操作,这是硬件自动完成的,不需要我们操心。
读引脚时,也就是把端口作为外部输入线时,首先要通过外部指令把端口锁存器置“1”,然后再实行读引脚操作,否则就可能读入出错。为什么?看上面的图,如果不对端口置“1”,端口锁存器原来的状态有可能为“0”(Q 端为0,Q^为1)加到场效应管栅极的信号为“1”,该场效应管就导通,对地呈现低阻抗,此时即使引脚上输入的信号为“1”,也会因端口的低阻抗而使信号变低,使得外加的“1”信号读入后不一定是“1”,若先执行置“1”操作,则可以使场效应管截止,引脚信号直接加到三态缓冲器中,实现正确的读入。由于在输入操作时还必须附加一个准备动作,所以这类I/O 口被称为“准双向”口,MCS-51 的P0,P1,P2,P3 口作为输入/输出口时都是“准双向”口。接下来让我们再看另一个问题,从图中可以看出,这四个端口还有一个差别,除了P1 口外,P0,P2,P3 口都还有第二功能,这些第二功能又是作什么用的呢?
2.端口的工作原理(1)。P0 口
先来看P0 口,从图中可以看到,P0 口的内部有一个2 选1 的选择器,受内部信号的控制,如果在图中的位置则处在I/O 口工作方式,此时相当于一个“准双向口”,输入时须先将口置“1”,每根口线可以独立定义为输入或输出,但是须在口线上加上拉电阻。如果将开关往另一个方向,则就是另一个功能—作为地址/数据复用总线用,此时不能逐位定义为输入/输出,它有两种用法:当作数据总线用时,输入8 位数据;而当作地址总线用时,则输出8 位地址。再强调一点,当P0 口作为地址/数据总线用之后,就再也不能作I/O 口使用了。讲到这里,也许大家会感到困惑,什么叫作地址/数据复用?这其实是当单片机的并行口不够用时,需要扩展输入输出口时的一种用法,知道了P0 口,再来看P1 口。
(2)。P1 口
同P0 不同,P1 口只能作为I/O 口使用,但它的内部有一个上拉电阻,所以连接外围负载时不需要外接上拉电阻,这一点P1,P2,P3 都一样,务必请大家注意。
(3)。P2 口
P2 口作为I/O 口线用时,与P0 口一样,当内部开关向另一个方向时,即作地址输出时,可以输出程序存储器或外部数据存储器的高8 位地址,并与P0 口输出的低地址一起构成16 位的地址线,从而可以分别寻址64K 的程序存储器或外部数据存储器,同样地址线是8 位一起自动输出的,不能象I/O 口线那样逐位定义。
(4)。P3 口
P3 口作为I/O 口线用时,同P1 口相同,也是“准双向口”;不同的是,P3 口的每一位都有另一种功能,也叫第二功能,各位的功能如下,它们的具体作用我们用到时再详细解释。
既然单片机的引脚有第二功能,那么CPU 是如何来区分的呢?这是一个令许多初学者困惑的问题,其实单片机的第二功能是不需要人工干预的,也就是说只要CPU 执行到相应的指令,就自动转成了第二功能。了解了各个I/O 口的功能和作用,再来给大家讲解一下单片机I/O 与外围电路的连接方法。
四.单片机I/O 口的连接方法
当单片机的I/O 口作输出时可以直接与外部设备连接,不过由于在实际的应用中,由于其驱动电流是有限的(P0 口10mA,P1,P2,P3 口20mA),所以我们常常需要通过接口电路来扩展它的驱动能力,在单片机的后向通道控制系统中,常用的功率控制器件有机械继电器、晶闸管、固态继电器等等,下面我们将以机械继电器和固态继电器的应用为例介绍其具体的使用方法。
1. 单片机与机械继电器的接口
单片机的一个I/O 口只能灌入20mA 的电流,所以往往不足以驱动一些功率开关(比如稍大一点的机械继电器等),此时,就应该采用必要的扩展电路,如何来实现单片机与机械继电器的接口呢?其实很简单,我们通常采用下面的接法(如图),为了防止前向通道信号的干扰,常采用一些光电隔离器件,比如光电耦合器4N25,PC814 等,当单片机的P1.0 脚输出为低电平时,光藕受电导通,Q1 饱和开通,继电器吸合,负载电路接通。这里请注意☺:P0-P3 口作输出控制端时,应尽量采用低电平控制方法,这是因为在低电平时,I/O 口允许灌入的电流比高电平时要大,一般情况下,低电平的灌入电流为高电平的4 倍。
另外为了防止电压间的互相干扰,继电器的工作电压VDD 与单片机的工作电压VCC 不要使用同一个电源,接地端也不要连在一起,即所谓的模拟地与数字地分开,驱动管的电流要大于继电器的工作电流,其他的元件就不讲了,大家自行分析一下。讲了单片机与继电器的接口,再来介绍与固态继电器的接口方法,接着往下看:
2. 单片机与固态继电器的接口
普通继电器由于开关速度慢、易跳火、易机械磨损,通常用于要求不高的场合,在某些特殊应用场合,比如防火、防爆等系统中,则应采用固态继电器。固态继电器是一种无触点的电子继电器,它的输入端只要很小的控制电流,可以与单片机的I/O 口直接连接;输出则采用双向晶闸管控制,其输入输出间均通过内部光电耦合器隔离,可以防止信号间的干扰,是单片机接口的理想器件,随着其技术的成熟,应用的广泛,价格也已经非常的便宜,1A/250V 的目前在10 元左右,它与单片机的连接方法如图所示,当“-”端所接的P1.0 为低电平时,SSR 导通,负载工作。除了以上两种连接方法外,单片机与TTL,CMOS 管等都可以连接。.
|