不积跬步无以至千里,不积小流无以成江海。
1、74HC573
这块板子也主要靠它和74HC138撑起外设的门面,138数电常讲,这里不再提及。
573可能有点陌生,其实也没啥,记住一点它是个锁存器,存状态的器件就行了。
非得深入了解的话,戳这里吧。
如果程序中使用完573后,记得及时的禁止使能!最好这样写
P2 = P2 & 0x1F;
2、ULN2003
这个可得好好说说,感觉挺好使的。
主要记住几个参数,
它是个驱动芯片,可以驱动诸如继电器和电机此类感性负载!
输出端可达500mA/50V.
感性负载的缘故,输出端具有的二极管学名续流二极管。
9脚即COM口,是内部7个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。所以最好接上VCC!
另外一个ULN2003是一个非门电路!!
更多信息,戳这里。
3、IO控制原理
干说的话,有点不直观,先来看看怎么驱动蜂鸣器吧。
板载蜂鸣器为有源蜂鸣器,只要两端有压差就会响!
也就是说我们让 N_BUZZ是低电平就OK了,再顺藤摸瓜找到N_BUZZ通往何处。
使用我们前面提到的ULN2003驱动的,记住它是非门。想要OUT7=0,那么只能IN7=1了,IN7对应到锁存器573,不改变状态,再对应到IO口就是P06了,也就是我们让 P0^6=1就行了! 这时候蜂鸣器就会响了。
确实是这样的,但是别忘了573上面的LE,是需要使能的。也就是Y5C=1即可,再根据上面的思顺藤摸瓜就来到了74HC02这个或非门
WR是J13上的,当我们是IO编程的时候,J13的2、3脚是相连的。
3脚GND,也即是说WR是接地的。那么此时的74HC02就是个非门了。
我们想要Y5C=1,那么Y5=0即可,Y5又是38译码器的输出,Y5等于0就是38译码器选中对应的引脚,因为它是低电平输出(数电有讲吧。。。)。也即是让CBA=101,CBA又分别对应P2口的765。那么一切就理清楚了。
只需要让P2 = (P2&0x1F|0xA0)即可。
#include
sbit Buzz=P0^6;
void main()
{
P2 = ((P2&0x1F)|0xA0);
Buzz = 1;
P2 = P2 & 0x1F;
while(1);
}
蜂鸣器确实响了吧,当然可以试试Buzz赋值0.。。。
关于继电器,它和蜂鸣器一样都是Y5C所在寄存器使能控制,只需改变相应的IO口,就可以实现控制继电器,直接上代码。
#include
sbit Buzz = P0^6;
sbit Relay = P0^4;
void main()
{
P2 = ((P2&0x1F)|0xA0); //使能573
Buzz = 0; //关闭蜂鸣器
Relay = 0; //关闭继电器
P2 = P2 & 0x1F; //禁止573
while(1);
}
LED灯不过是换成了Y4C,对应选中Y4就可以操作LED了,上代码。
#include
sbit Buzz = P0^6;
sbit Relay = P0^4;
void main()
{
P2 = ((P2&0x1F)|0xA0); //使能573
Buzz = 0; //关闭蜂鸣器
Relay = 0; //关闭继电器
P2 = P2 & 0x1F; //禁止573
P2 = ((P2&0x1F)|0x80);
P0 = 0x00; //点亮所有LED
P2 = P2 & 0x1F;
while(1);
}
后期当不用到LED、继电器和蜂鸣器的时候,记得直接关闭,乱响的话很容易影响心情的!
void CloseFucker()
{
P2 = (P2 & 0x1F) | 0x80;//关闭LED
P0 = 0xFF;
P2 = 0x00;
P2 = (P2 & 0x1F) | 0xA0;//关闭蜂鸣器继电器
P0 = P0 & 0xAF;
P2 = 0x00;
}