今天本来还想继续感慨,没想到冲哥讲的上难度了,内容到不复杂,前面都是些Keil的配置和C语言的语法知识,但到了后期讲到P0M0、P0M1,P4M0、P4M1的时候,我相信大家都有些疑惑,而且PPT上写的是P0M1、P0M0,正好和冲哥写的是反向的,这都是为什么呢?
下面我给大家从软件层面补习一下!
首先回答第一个问题:
1.提问:“明明只是要控制P00的节点引脚,为什么还要控制P40的引脚?”
1.回答:我们在操作C8051(或则C89C52)芯片的时候,一般都是P^0的写法,即操作哪组灯就编写哪组,但是Ai8051U的控制逻辑不同,请看下图:
那个VCC就是供电电压,你可以认为就是电池的正极,那个红框就是开关,即如果要让电流流到下面就要打通P40(就是P4.0),所以先给P40打开,然后三极管才能通,之后打开P00才可以构成回路,那个P00(就是P0.0)就是负极,之后大家就知道了,即形成了回路,灯就亮了。
2.提问:“为什么要设置P40=0;P00=0呢?为什么不设置成P40=1;P00=1呢?”
2.回答:因为赋值为0代表为负极接入,即VCC是正极3.3V,流入到P40、P00时候,他俩肯定得是电池的负极啊。而如果给P40=1、P00=1,则表示接入正极,即VCC、P40、P00都为3.3V,那正极对正极就没电流了,因此P40=0;P00=0。这时有的朋友就问了,这个电路图哪有什么正极和负极啊,我们初中、高中学的物理都是一个完整的回路,这个根本就看不出来啊!没错这图表达的意思比较简要,实际上的接法和你的初高中原理是一样的,只是内部复杂了一些,所以芯片的引脚接法图根本就没画全,误导你觉得芯片电路很难度,我就这么告诉你,芯片就是你初中学的电路并联、串联啥的,别想太难就好了。
3.提问:“关于P0M0、P0M1,到底是啥?!并且下图是如何计算的?”
3.回答:P0M0、P0M1(类似的还有P1M0,P1M1;P2M0,P2M1以此类推)是通过这两个属性配置P0组引脚电位、逻辑状态的配置项,即P0组有8个引脚,每个引脚有四种电位逻辑状态,分别是“准双向口”,“推挽输出”,“高阻输入”,“开漏输出”。
就拿P00来说,P00有4中状态,
假如P0组的引脚只有两种状态,那么仅需要P0M0就够用了,P0M0是一个字节(8位),即二进制为 0000 0000,其中每一位标志一个引脚状态,如下:
0:表示“准双向口”
1:表示“推挽输出”
举例 P0M0为 0100 0000 则表示 P06 为 “推挽输出”,其他7个都是“准双向口”。(因为二进制的bit排序是从右到左的,此低到高的)
而事实偏偏P0的引脚有四种状态,单靠P0M0就不够了,所以还需要加1位,也就是出现P0M1,其中P0M1用在第二位、高位上,也就是如下:
00:表示“准双向口”
01:表示“推挽输出”
10:表示“高阻输入”
11:表示“开漏输出”
其中最左的一位就是由P0M1表示的,最右一位是由P0M0表示的,M1、M0也正符合二进制的从右到左,低到高的顺序,所以冲哥的PPT里面的代码写的是 “P0M1=0;P0M0=1”,而不是“P0M0=0;P0M1=1”,估计是原创是想让大家了解高低位的顺序,而故意为之。
在冲哥的视频里面也体现了这个说法,如下图:
其中左面红框里就说明了M1是代表高位,并放到了左边。
好的,感谢stc这么有意义的一课,继续坚持!!!
附件说明:
OK最后我们说一下,这四种状态代表什么(网上找的例图,可能又不准确的地方,还请指正):
准双向口
准双向I/O模式与标准51相比,虽然在内部结构上不同,但是在用法上相同,比如要作为输入时,都必须先写“1”置成高电平,然后才能去读引脚的电平状态。
准双向口,也就是说不是真正的双向口,真正意义上的双向口是需要通过设置专门的“输入输出方向寄存器”将IO口设为输入模式或者输出模式,才能实现对应的输入输出功能。而准双向口则不需要设置,作为输出时直接向口线寄存器写;作为输入时则需要先向IO口写1再去读。准双向口的内部电路结构如下如所示:
由图可以看出当口线寄存器为1时,左边的场效应管断开,右边的场效应管导通,于是输出被电源上拉为1,输出高电平;当口线寄存器为0时,左边的管子导通,右边的管子截止,输出管脚相当于直接通过左边的管子接地,输出低电平。在读取数据时,如果口线寄存器的值为1,当管脚接低电平时,采集到时输入数据为1,反之为0,这种情况下是可以正确的读取数据的,但是如果口线寄存器的值为0 ,则左边的场效应管导通,输出相当于直接与地线相连,此时无论外部输入为高电平还是低电平,采集到的输入数据都是0,这样就不能正确的读取数据了。所以对于准双向口,作为输入口使用时,必须先向该IO口写1,再读取,这就是准双向口的特点。
推挽输出
不论输出高电平还是低电平都能驱动较大的电流,比如输出高电平时可以直接点亮LED(要串联几百欧限流电阻),而在准双向I/O模式下很难办到。
与准双向口类似,只是右边的场效应管为强上拉作用,因而输出电流较大,适用于需要大电流驱动的场合。在使用推挽结构时,要注意不要将两个IO口短接,因为如果一个IO口为高电平而另外一个为低电平时,会有很大的电流流入芯片,可能烧坏芯片。
高阻输入
高阻输入模式的特点是只能作为输入使用,但是可以获得比较高的输入阻抗,这在模拟比较器和ADC应用中是必需的。如下图
当IO口处于高阻态时,我们也将其称为浮空输入状态,此时其电平是不确定的,既不是高电平也不是低电平。我们可以想象成,单片机在检测IO口的电平高低时,相当于在CPU里面有一个类似电压表的东西,并且这个电压表内阻很大,假设内阻为100MΩ(示意图如下)。在这里,我们可以把这个电压表的内阻称为这个IO口此时的输入电阻。
现在设想,当我不小心用手碰到了IO端口,而由于人体本身就是阻值很大的导体,周围有很多电磁波干扰,手上可能存在一些很微弱的电流,这个时候,电压表的读数就会发生变化,单片机读取的电平高低就会变。高阻态表现出来的结果就是外界。
开漏输出
开漏模式与准双向模式相似,但是没有内部上拉电阻,输出0时为低电平,输出1时为高阻状态。开漏模式的优点是电气兼容性好,可以提高输出高电位的电压值,如通过电阻接12V,则输出的高电平就是12V了,如果外部上拉电阻接3V电源,就能和3V逻辑器件接口,如果上拉电阻接5V电源,又可以与5V逻辑器件接口。此外,开漏模式还可以方便地实现“线与”逻辑功能。
开漏(open drain),这里的“漏”指的是场效应管的漏极(drain),对应于三极管的集电极(collector),开漏就是指场效应管的漏极保持开路,直接接出作为输出口,如下图所示:
从图中可以看出,当口线寄存器为0时,管子导通,输出直接通过管子接地,输出低电平;当口线寄存器为1时,管子截止,输出脚相当于悬空,为高阻态,因此开漏输出接口不能够正确的输出高低电平。对于开漏输出结构,输出必须接上拉电阻,才能够正常使用,如下图所示:
外接了上拉电阻后,当口线寄存器为0时,输出被电源上拉为高电平,口线寄存器为0时,输出口通过管子直接接地,为低电平,这样就可以正确的读取外部数据了。 很多芯片都提供开漏输出结构,这是因为开漏输出结构有很多优点: a. 充分利用外部电路的驱动能力,减小芯片内部的驱动,从而降低芯片的功耗,提高芯片工作稳定性 b. 可以通过改变上拉电源的电压,改变信号的传输电平,比如某芯片的输出为3.3V电平,其输出口的上拉电源可以为5V,这样就很方便的实现了电平转换。 当然,开漏输出也存在明显的缺点:在输出脉冲信号时,在脉冲的上升沿,电源通过上拉无源电阻对负载充电,其速度较慢,导致上升时间变长,因而会导致脉冲上升沿变坏,上拉电阻阻值越大,充电时间就越长,因此其速度越慢,而阻值较小时,其功耗又会变大,因此在设计时要兼顾速度和功耗。而对于下降沿,电源通过芯片内部的场效应管放电,其速度较快,所以上拉电阻对脉冲的下降沿影响不大,某些情况下可以考虑用下降沿输出。
|