这个电子音乐门铃系统是我去年给邻居家小孩做的一个小项目,没想到后来成了小区里最受欢迎的门铃方案。用单片机控制音乐播放听起来简单,但要让门铃在各种环境下都稳定工作,还是有不少门道的。
传统的机械门铃声音单一,功能有限。而基于单片机的电子音乐门铃可以自定义铃声、调节音量,还能扩展更多智能功能。这个系统核心就是用单片机解码存储的音乐数据,通过功放电路驱动扬声器发声。相比市面上的成品门铃,自制方案成本能控制在20元以内,而且可玩性高得多。
整个系统由三个主要模块组成:
我选择STC89C52是因为它内置的定时器可以精确控制音符节拍,而且有足够的IO口来扩展功能。DAC0832虽然精度不算高,但对门铃应用完全够用,配合LM386功放能输出清晰的音乐声。
音乐数据存储在单片机的程序存储器中。我采用了简化的MIDI格式:
这种方案比直接存储PCM音频数据节省了大量空间,一首30秒的简单旋律只需要几百字节的存储空间。
音频电路是系统的关键部分,我调试了多次才达到理想效果:
code复制单片机P2口 -> DAC0832 -> 10kΩ电位器 -> LM386 -> 8Ω扬声器
电位器用来调节音量,LM386工作在20倍增益模式,外围电路只需要几个电容电阻就能工作。
注意:LM386的旁路电容一定要靠近芯片引脚放置,否则容易产生高频振荡噪声。
门铃按钮采用了硬件消抖设计:
这种双重消抖方案确保了每次按下都能可靠触发,不会出现误动作。
音乐播放的核心是一个状态机:
我使用了定时器0工作在模式1,通过调整TH0和TL0的值来产生不同频率的方波信号。
系统支持存储3首铃声,通过长按按钮切换:
状态切换通过定时器1计时实现,代码中使用了标志位来区分不同操作。
在制作电路板时要注意:
我第一次做板子时没注意这些,结果音乐里全是数字噪声,后来重新布局才解决。
没有声音输出:
音调不准:
按键不灵敏:
这个基础框架可以扩展很多实用功能:
我最近正在尝试加入蓝牙模块,这样可以直接用手机APP更换门铃音乐,比按钮切换方便多了。