一、ULN2003
- ULN2003(达林顿晶体管阵列)是一种NPN型驱动器,其作用之一就是增大电流驱动能力,可以驱动电机等外设。
- 此处驱动蜂鸣器,给定P25口高低电平就可以实现BEEP引脚的电平翻转
二、蜂鸣器
- 蜂鸣器是一种采用直流电压供电的电子讯响器。
- 按照驱动方式存在有源和无源之分,二者本质上的区别就是是否需要提供震荡源脉冲(频率)使得蜂鸣器响发声
- 有源蜂鸣器自带震荡源,只需要接通电源即可发声
- 无源蜂鸣器需要给定频率才可以发声,同时可以实现发出不同频率的声音
- 51单片机的IO口是一种弱上拉的模式,高电平驱动能力有限,想要实现电平翻转,必须要使用外部驱动电路去驱动蜂鸣器的端口
驱动电路主要分为两大类,第一种是三极管驱动,第二种是集成电路驱动
下图为三极管驱动电路图
下图为集成电路驱动电路图(ULN2003)
此处使用集成电路驱动蜂鸣器。图中可以看出,单片机的P25口连接在ULN2003一端,蜂鸣器的BEEP引脚接在ULN2003的另一端,控制P25高低电平实现BEEP电平反转,给定频率即可实现蜂鸣器发声
三、按键提示音代码
此处使用无源蜂鸣器,需要给定频率。
代码内容是按下K1-K4按键会有频率1000Hz、时间100ms的按键提示音,并在数码管上显示出1-4四个数字
下面是Buzzer.c文件
#include <REGX52.H>
#include <INTRINS.H>
sbit Buzzer = P2^5;
void Delay500us(void)//@11.0592MHz
{
unsigned char data i;
_nop_();
i = 227;
while (--i);
}
/*
函数功能:蜂鸣器按照1000Hz的频率响ms时间
形参:蜂鸣器响应时长
*/
void Buzzer_Time(unsigned int ms)
{
unsigned int i;
for(i=0;i<ms*2;i++)//控制时间:ms给100,蜂鸣器响100ms
{
Buzzer = !Buzzer;//蜂鸣器引脚电平翻转发声
Delay500us();//控制频率:每隔500us翻转一次
//高电平500us,低电平500us,T = 1000us,f = 1/10^-3(s) = 1000HZ
}
}
for循环中,通过延时500us实现电平翻转周期为1ms,得到频率为1000Hz。每次for循环是0.5ms,所以要想使得形参ms对应发声时间,则需要在for循环跳出条件中给ms x 2,最后在主函数调用Buzzer.Time(),参数给100就可以实现功能要求