前言
STC单片机IO口四种工作模式准双向口,推挽输出,高阻输入,开漏输出
一.IO口四种工作模式
STC89C52单片机的IO口都是准双向口,而后期的单片机功能强了IO的工作模式也就多了起来,以STC8G单片机为例,所有IO口有4种工作模式,确切的说所有IO口的每一个位(每一个引脚)都有4种工作模式:准双向口,推挽输出,高阻输入,开漏输出。也可以是不同的引脚有不同的模式。
单片机上电以后:除P3.0和P3.1外,其余所有IO口均为高阻态,用户在使用IO口前必须先设置IO口的工作模式(就是这个要求,让本人吃了多次亏)明明程序没有问题,就是无输出,检查程序一遍,发现未配置IO口,人家是默认高阻态呢,哪里来的输出?
所以之后的程序,写了一个架构,如下(配置IO口工作模式),不管用不用先设置成准双向口模式。
端口模式如何配置
void main()
{
P3M0=0x00;
P3M1=0x00;
P5M0=0x00;
P5M1=0x00;
while(1)
{
LED=~LED;
delay(100);
}
}
当然我的程序架构是有点问题的,我是将IO口统统准双向,当遇到要让不同的管脚设置不同的模式怎么办?(查看数据手册-知道有模式配置寄存器)
端口模式配置寄存器(PxM0,PxM1)
这是STC15系列的数据手册 查阅可知:每组IO口是由两组特殊功能寄存器联合控制的(以P1口举例)
两个寄存器每一位,组成两位的控制码,00-01-10-11来对应每一位的控制模式 比如控制P1口,即SFR:P1M1/P1M0; 如果控制P5口,即SFR:P5M1/P5M0 这两个寄存器。(STC单片机一共有5组IO口,每组IO口对应两个控制寄存器,即一共有10组SFR端口控制模式寄存器)
要注意一点的是,这些寄存器地址均不支持位寻址,所以配置时,只能采用直接向SFR以十六进制赋值的方式。
比如P1.0要求开漏输出模式,P1.1为高阻输入模式等等(如图)… 则对应寄存器P1M1=0x03;P1M0=0x09;对应程序就这样赋值即可(其他端口也是如此)
1.准双向口模式
这个模式又叫弱上拉,是标准的8051输出模式。 STC89C51单片机的P1/P2/P3口都是准双向口,即不但能够输出数据,也能够输入数据,但为什么是“准双向口”,而不是“双向口”?(准双向口电路如下)
由一个NPN三极管,外加反相器和一个上拉电阻组成(实际电路是MOS管,但三极管可以实现一样的功能)作为IO口,首先要有输出数据的功能,那么准双向口是怎么输出数据的?
SW1拨向高电平侧,代表输出的内部数据为1(高电平),高电平传递至反相器后,三极管基极即为低电平,低电平使三极管Q1截止,那么准双向口自然是通过上拉电阻那条路(电流流10k电阻至输出端),拉为高电平(即我们想要传递的内部数据高电平这样传递出去),也就是常说的拉电流。受10k电阻限制,拉电流非常弱。
SW0拨向低电平侧(代表输出内部数据为低电平),低电平经反相器后,为高电平,此时三极管导通,输出端则被强行下拉为低电平。输出0时,三极管把输出端和地导通,电流则可以从输出端,经三极管直接到地,这样可以从端口接收很强的电流,也就是我们常说的灌电流能力强。
以上则是把准双向口如何输出数据,提供拉电流,如何接收灌电流说清楚了,下面则是说如何输入了?
准双向口的输入线是直接从端口上引出来的,内接干扰抑制,和施密特触发器(不用详解),现在先把按键按下,SW2下拨,接入低电平,即输入0,低电平经过端口线(SW_PORT),输入数据线(U3/U2),传递到内部。
输入高电平,(Vcc经SW2,按键,输入端,再到数据线)即输入内部数据(高电平);那为什么是准双向口呢?此时三极管的集电极为截止状态,截止时,端口线被10k电阻弱上拉,如果此时端口(SW2)接低电平,很容易拉下来,此状态时,准双向口输入没有问题。
如果SW1接低电平,三极管导通,端口线将被强行下拉至低电平。因为下拉非常强烈,端口SW2即使接高电平,也不能把端口拉高,所以此时不能输入高电平,低电平(SW2拨下)可以正常输入,至输入数据端,至内部数据。
在输入数据前,SW1拨上,把三极管截止,就能顺利的把端口数据输入进来,所以单片机使用准双向口时,为了确保能正常读取端口状态,读前先写1,把三极管截止(即这就是准双向口的由来,准即提前准备的意思)
准双向口的特点
1.拉电流弱 2.能读能写 3.灌电流能力强 4.读前先写1,使三极管(晶体管)截止【否则很可能读不了1】
2.开漏输出模式
此模式,内部上拉电阻断开,加外部上拉电阻,才可读外部状态,也可对外输出高电平。例如STC89C51单片机的P0口;所谓开漏,是指MOS管漏极开路,或三极管集电极开路。 结构如图:
与准双向口相比,就差一个上拉电阻,先接入低电平(SW1拨下),低电平经反向变为高电平,高电平使三极管导通,输出端由于经三极管下拉到地,呈低电平,也就把0传递出来了。
将SW1拨上,即高电平经反向为低电平,三极管截止,此时输出端悬空,高电平并没有顺利传输出来,则说明开漏输出只能输出低电平,不能输出高电平。
上述是输出,下面讲解输入:
同理,SW1拨上接高电平,三极管截止,输入端接高电平(SW2拨上),高电平沿端口,经输入数据线传入内部(高电平传输没有问题),同理SW2拨下一样能正常传递进来。
若SW1拨下,即三极管导通,,端口线经三极管强下拉至地,所以此时尽管端口接高电平,那么输入数据线为低电平,即外部高电平没有传输进来;现在把端口开关SW2拨低电平侧,低电平通过数据输入线可以顺利传递进来。
由此可见开漏模式在输入的时候和准双向口一样,必须读前先写1,把三极管截止才能读到端口状态。补充一点:若SW1拨下接0时,接收灌电流能力强
开漏输出模式作用
说了半天,感觉开漏输出模式和准双向口差不多呢?而且还不能输出高电平,要它何用?
特长:1.输出端外加上拉电阻,立即变为准双向口模式,功能完全一样, 2.实现电平转换:输出电平完全由外部上拉电阻的电源决定(比如这里36v)
3.开漏输出模式具有线与功能:例如多路信号同时输入,只有同时输入高电平(SW2,SW3,SW4,SW5,SW6拨上),才能将高电平输入数据输入端至内部,只要有一路或几路SW拨下,输入数据就是低电平。
总结此模式:
优点:1.电平转换。2.线与功能。3.上拉准双向。4.灌电流能力强 缺点:1.只能输出低电平,不能输出高电平。2.准输入口(读前写1,三极管截止)
3.推挽输出模式
这个模式又叫强上拉,很适合大电流输出,能输出20MA的拉电流,如下 单片机管脚的推挽输出由两只三极管(或场效应管)组成,这两只晶体管始终处于一个导通另外一个截止的状态。而三极管又是电流控制元件:以小电流来控制大电流,(如下)左边是P型三极管,当基极有小电流输入,则集电极大电流可以流向发射极;而对于右边N型三极管,只有基极有小电流流出时,那么发射极的大电流可以向集电极流。
而在推挽电路,单片机给管脚高电平的时候,让上面的NPN型三极管导通,下面的PNP三极管截止,此时单片机管脚有大电流输出Vout,形成“推”,即为拉电流;
当单片机给管脚低电平的时候,N型三极管导通,P型三极管截止,此时电流从管脚流入单片机,形成"挽",即灌电流;单片机在此模式时有很强的驱动能力,而拉电流能达到20MA左右;灌电流的驱动能力更强。
4.高阻输入模式
此模式:电流即不能流入也不能流出。
相当于开关全部断开…
|