当Y5C有效时,P0口可以控制蜂鸣器、继电器等,不过,由于单片机驱动能力有限,一般会采用ULN2003等是大电流驱动装置,如图,经过573锁存器输出后接了一个ULN2003,可直接驱动继电器等大电流的装置。需要注意的是ULN2003是个非门电路,输出与输入相反。例如下图中的当P0.6为低电平时,BUZZ为高电平。
蜂鸣器
电路如下,由图可知,当BUZZ为0,即P0.6为1时,蜂鸣器响。
继电器
电路如下,由图可知,当N_RELAY为0,即P0.4为1时,上方有电流通过,K1接通到m2,m2为低电平,继电器工作。(注意:由于不同板的电路图不同,继电器工作时的引脚高低也不尽相同,比如我的板是为0的时候继电器打开,但有的板则是为1继电器打开)
代码如下:
#include"reg51.h"
sbit fmq=P0^6;
void Delay(unsigned int t)//简单的延时函数
{
while(t--);
while(t--);
while(t--);
}
void Init_74HC138(unsigned char n)
{
switch(n)
{
case 4://Y4有效,P0直接控制LED
P2=(P2 & 0x1f) | 0x80;
break;
case 5://Y5有效,P0控制蜂鸣器、继电器
P2=(P2 & 0x1f) | 0xa0;
break;
case 6://Y6有效,P0控制数码管位选
P2=(P2 & 0x1f) | 0xc0;
break;
case 7://Y7有效,P0控制数码管段选
P2=(P2 & 0x1f) | 0xe0;
break;
}
}
//*************主函数************
void main()
{
Init_74HC138(5);//Y5有效,P0口控制蜂鸣器
while(1)
{
fmq=1;//蜂鸣器响
Delay(10000);
fmq=0;//蜂鸣器不响
Delay(10000);
}
}
整体程序相对而言比较简单,唯一需要注意的是对74hc138的片选函数进行了改进,相对于之前的子程序(如下)代码量小了些。一个是一位一位的进行设置,一个是通过P2口直接设置,后一种逻辑可能有些复杂,但对于代码的书写量却大大减少,节省时间。
void Init74HC138(unsigned char n)
{
switch(n)
{
case 4://Y4有效,P0直接控制LED
HC138_A=0;
HC138_B=0;
HC138_C=1;
break;
case 5://Y5有效,P0控制蜂鸣器、继电器
HC138_A=1;
HC138_B=0;
HC138_C=1;
break;
case 6://Y6有效,P0控制数码管位选
HC138_A=0;
HC138_B=1;
HC138_C=1;
break;
case 7://Y7有效,P0控制数码管段选
HC138_A=1;
HC138_B=1;
HC138_C=1;
break;
}
}