蜂鸣器,继电器的控制
与led一样 蜂鸣器继电器的输出都有M74HC573锁存器的控制。
先放上原理图:
与其不同的是在锁存器与输出引脚之间有一个ULN2003
ULN2003
ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003不仅有驱动作用,而且有非门的作用;
从原理图上可知蜂鸣器的一个引脚接vcc一个引脚接到了ULN2003的第10引脚,对应着单片机的P06口;
继电器而言引脚接到了ULN2003的12引脚,与输入io引脚P04;
故用P06和P04能控制蜂鸣器和继电器,控制的蜂鸣器的引脚若是高电平1,蜂鸣器就不鸣响,反之低电平0就会鸣响。控制继电器引脚若是高电平1则继电器不吸合led灯不亮,反之引脚低电平继电器吸合led灯亮;结合到ULN2003有非门的作用可知。
PO4,P06送入0即低电平蜂鸣器和继电器不发挥作用
P04,P06送人高电平则发挥作用
与led一样都是先打开锁存器再向PO口送数。
这次我们优化了程序,我们建一个子程序来选择Y4,Y5,Y6,Y7的输出
只有当他们都为高电平是锁存器才打通
程序如下:
void hc138init(char n)
{
switch(n)
{
case(4):
P2=(P2&0x1f)|0x80; break;
case(5):
P2=(P2&0x1f)|0xa0; break;
case(6):
P2=(P2&0x1f)|0xc0; break;
case(7):
P2=(P2&0x1f)|0xe0; break;
}
}
为何这样写,大家可以思考一下,也可以用位定义。
再放上总程序:
#include<reg52.h> //头文件
#define uchar unsigned char
#define uint unsigned int
#define led P0 //宏定义
uchar a;
void delay(uint i) //延时
{
while(i--);
}
void hc138init(char n) //选控制端
{
switch(n)
{
case(4):
P2=(P2&0x1f)|0x80; break;
case(5):
P2=(P2&0x1f)|0xa0; break;
case(6):
P2=(P2&0x1f)|0xc0; break;
case(7):
P2=(P2&0x1f)|0xe0; break;
}
}
void init() //初始化 关闭蜂鸣器,继电器
{
hc138init(5);
P0=0x00;
}
void ledrun() //小灯亮灭两次再依次流水点亮 继电器吸合蜂鸣器响
{
hc138init(4);
P0=0x00;
delay(50000);
P0=0xff;
delay(50000);
P0=0x00;
delay(50000);
P0=0xff;
delay(50000);
for(a=0;a<8;a++)
{
P0=0X01;
P0=~(P0<<a);
delay(50000);
}
hc138init(5);
P0=0x10;
delay(50000);
P0=0x00;
delay(5000);
P0=0x40;
delay(50000);
P0=0x00;
delay(5000);
}
void main()
{
init();
while(1)
{
ledrun();
}
}