基于51单片机的电子节拍器设计

2024-03-11 13:20杨辉
机电信息 2024年3期
关键词:节拍器数码管中断

摘 要:节拍器是一种专门用来打奏拍子的设备,它可以使练音者或练琴者正确掌握乐曲速度,对音乐练习达到事半功倍的效果。鉴于此,设计了一款电子式节拍器,以AT89C51为控制核心,通过C语言设计程序,充分利用单片机内部中断和定时系统控制外部电路,准确产生拍子,且实现了节拍类型和节拍速度的实时调节、数码管的清晰显示。该节拍器音色优美、精度较高,具有很好的视觉和听觉效果。

关键词:节拍器;单片机;中断;数码管

中图分类号:TP202    文献标志码:A    文章编号:1671-0797(2024)03-0032-04

DOI:10.19514/j.cnki.cn32-1628/tm.2024.03.008

0    引言

在音乐的教学和学习中,学习者的音准感和节奏感非常重要,但是速度感同样不可忽视,精准地确定所需要表达的速度,在音乐学习和创作中逐步建立敏锐的速度感对于一个优秀的音乐人尤为重要。节拍器就是在各种速度中发出稳定节拍的装置,它不仅可以提高音乐练习的效率,而且能提高练习者的注意力,使演奏更均匀平衡[1]。目前主流的节拍器有机械式和电子式两种,机械式节拍器调节不便,不宜携带,精确度不高且价格昂贵,所以本次设计将要完成一个电子式节拍器[2]。它基于单片机系统,不仅能发出声音信号,同时能在数码管上显示当前的节拍类型和节拍速度,使用者可以通过键盘实时更改节拍类型、调整节拍速度。设计采用单片机的中断程序实现按键检测、数码管扫描和蜂鸣器发音等一系列功能。

1    硬件设计

节拍用于控制各个音的快慢,即各个音产生及持续的时长,在单片机中可用延时程序或定时器来控制。节拍器发出的强弱拍声音由两个不同的频率驱动,每个拍子的时长由另一个定时器控制。设计基于AT89C51芯片完成,运行的单片机最小系统中,用P0口作为数码管的接口,用P1.6端口作为蜂鸣器电路信号输出口,用P2口高四位作为按键的接口;T0中断用于定期扫描按键输入模块、数码管显示模块和节拍延时模块,T1中断用于反转蜂鸣器发出不同频率的音。

本系统分为两个部分,一部分是节拍类型切换,另一部分是节拍速度调整。对于节拍的处理,使用单片机C语言来编写,用定时器T1来控制脉冲频率发音,用定时器T0来控制每个节拍的时长[3],电路共5个按键。具体功能如下:

按键A和按键B用于切换节拍类型,使节拍类型在1~6几个档位间循环,分别实现1/4拍、2/4拍、3/4拍、4/4拍、3/8拍、6/8拍这些常用拍子。复位电路按键用于停止节拍器发音,且复位后节拍类型显示0。按键C和按键D用于调整节拍速度,初始节拍速度设置为90拍/min。按下按键,数码管实时显示节拍器当前的参数值。节拍速度在40~200拍/min循环。根据节拍速度可以求出每个节拍的时长,即一个音符该唱多长时间。设计中以四分音符为一拍,则八分音符的时长为四分音符的一半,时长越短,节奏越轻快[4]。

由于本次设计的电子节拍器要实现按键输入、数码管显示、蜂鸣器发音等功能,利用Proteus仿真设计的硬件电路如图1所示,实现过程为:以AT89C51作为控制核心,通过按键输入来改变节拍类型和节拍速度,74HC245芯片在数码管LED小灯和单片机I/O口间起电流缓冲作用,防止电流产生瓶颈效应,保证通道足够畅通[5]。74HC245具有双向缓冲作用,无任何逻辑功能,1引脚DIR是方向引脚,当1引脚输入为高电平时,使B等于A的状态。74HC138芯片开启数码管段选功能,显示当前节拍类型和节拍速度[6]。段的选择(指该段的亮灭)是通过单片机的P0口控制,经过74HC245驱动,再将T0中断以1 ms为定时,实现4个数码管的动态显示。电路设计中,4个数码管都是共阳极,第一个数码管用于显示节拍类型,后三个数码管用于显示节拍速度。由于本次节拍器的设计中用到的按键较少,所以按键部分选用独立式按键。4条输入线分别连接到单片机的P2.4~2.7端口上。发声部分的蜂鸣器电路采用无源蜂鸣器设计,BUZZ引脚连接至单片机P1.6端口,由于蜂鸣器电流依然相对较大,所以用三极管来驱动,并加连一个100 Ω的电阻来限流,此外还增加一个D4续流二极管,从而很好地避免电感电流的反向冲击,接续关断电流。程序控制单片机I/O口反转,使蜂鸣器发出有节奏的声音[7]。电子节拍器复位电路为含手动开关复位的复位电路,连接到单片机的9引脚RST(Reset)复位引脚上。复位按键可作为节拍器的停止发音开关。

2    软件设计

本设计软件部分全部用C语言编写,软件程序由主程序、数码管显示子程序、按键输入子程序和音频输出子程序几个模块组成。主程序用来开启74HC138使能和启动定时器T0、T1,T0中断负责按键检测,刷新数码管显示和控制每个拍子的时长,T1中断控制单片机I/O口反转,使蜂鸣器发音。现就各个程序模块的执行流程分别进行叙述。

2.1    主程序流程

图2为系统主程序流程图。当给节拍器上电后,数码管显示节拍类型为0,此时无节拍,节拍器不发音。当按下A、B键后,切换节拍类型,节拍器开始打拍;按下C、D键开始动态调整节拍速度;按下复位键,节拍器回到上电时状态。

2.2    音频输出子程序

节拍器开始打奏节拍时,发出的强弱拍声音实质为两个不同的脉冲频率产生,由单片机内部的T1中断控制,通过反转与蜂鸣器电路连接的单片机I/O口来实现,过程如图3所示。

2.3    数码管显示和按键检测子程序

节拍器的数码管显示和按键检测执行过程都是用T0中断实现,每1 ms刷新一次数码管显示且检测一次按键状态值并保存,连续检测四次,如果四次检测到的按键状态值相同,说明按键已经稳定地按下或弹起,相应地要改變按键值,即实现了按键消抖功能。同时备份当前按键状态(按下或弹起),方便下次检测比较用。

3    系统调试

在上电前确保电路中不存在短路和断路的情况,这是整个调试过程的第一步,也是最重要的一步。万用表是这一步骤的主要工具,用万用表的两个探头检测电路中是否存在短路和断路等情况,特别要注意焊点是否虚焊、焊点之间有无短接以及焊点的美观,确保电路没有开路、短路问题。

实物电路没问题后,接下来从电子节拍器的显示、按键和声音等方面进行调试:

(1)显示观察:起初将程序烧录单片机运行时,发现数码管在显示时有些不应亮的段似乎微微在发亮,但持续的时间很短,只是一闪而过。这是数码管消影问题,解决方法是在数码管刷新之前关闭所有的段,改变好位选后再打开即可。即在数码管扫描程序switch(i)代码之前,加入P0=0xFF,这样数码管所有的段都关闭了,当把位选“ADDR”全部赋值之后,再给P0赋对应的值即可,数码管“鬼影”问题就顺利解决。程序如下:

static unsigned char i = 0;  //动态扫描的索引

P0 = 0xFF;   //显示消影

switch (i)

{

case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=LedBuff[0]; break;

case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=LedBuff[1]; break;

case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=LedBuff[2]; break;

case 3: ADDR2=0; ADDR1=1; ADDR0=1; i=0; P0=LedBuff[3]; break;

default: break;

}

(2)声音调试:在设计电子节拍器时,暂不确定强拍和弱拍该用什么频率较为合适,通过在程序中反复修改频率,烧录单片机进行测试,最终决定用1 400 Hz和1 000 Hz两个频率来表示强弱拍,起始拍和其余拍声音区别明显,短促有力更耐聽,在钢琴弹奏环境中清晰可闻。

(3)按键测试:初期程序中没加入按键消抖代码,经常按一下按键,数字却不止加1,而是加2或者更多,于是考虑按键消抖问题。最后通过单片机T0中断的1 ms定时来解决,每1 ms中断就记录一次按键状态,记录四次,如果四次按键状态一样,说明按键已稳定按下或弹起。将程序烧录单片机测试,即使快速按下按键,数字也能准确地加1,实现了按键消抖功能[8]。程序如下:

unsigned char i;

static unsigned char keybuf[4] = {  //按键扫描缓冲区

0xFF, 0xFF, 0xFF, 0xFF   };

//将一行的4个按键值移入缓冲区

keybuf[0] = (keybuf[0] << 1) | KEY_IN_1;

keybuf[1] = (keybuf[1] << 1) | KEY_IN_2;

keybuf[2] = (keybuf[2] << 1) | KEY_IN_3;

keybuf[3] = (keybuf[3] << 1) | KEY_IN_4;

//消抖后更新按键状态

for (i=0; i<4; i++)  //4个按键,所以循环4次

{

if ((keybuf[i] & 0x0F) == 0x00)

{   //连续4次扫描值为0,即4 ms内都是按下状态时,可认为按键已稳定地按下

KeySta[i] = 0;

}

else if ((keybuf[i] & 0x0F) == 0x0F)

{   //连续4次扫描值为1,即4 ms内都是弹起状态时,可认为按键已稳定地弹起

KeySta[i] = 1;

}

}

(4)节拍器精度测试:使用秒表测量节拍器400拍所用时间。节拍速度分别为90、120、160拍/min的时候,用时分别为267.7、200.7、151.3 s,误差分别为0.22%、0.35%、0.86%,节拍器精度较高。

4    结束语

最终将程序烧录硬件电路,经测试,节拍器能打奏响亮而有规律的节奏,并可任意切换不同类型节拍,节拍速度也可实时调整。数码管能清晰地显示当前节拍类型和节拍速度,无论是音乐初学者还是专业音乐人,都能轻松上手,调节一个适合自己的速度,练习起来效果显著。该节拍器基于单片机设计,成本较低,可靠性高,使用方便,控制功能强,容易产品化,若将产品外形工艺化,市场空间广阔。

[参考文献]

[1] 吴迪.跳动的音符——浅析钢琴教学中节拍器的重要性[J].北方音乐,2018,38(24):130-131.

[2] 刘惠明.钢琴学习过程中节拍器的功能及应用[J].音乐时空,2014(24):188-189.

[3] 宋雪松.手把手教你学51单片机 C语言版[M].北京:清华大学出版社,2014.

[4] 杨梦雅,黄堂森,邵金侠,等.基于单片机演奏音阶设计[J].信息技术与信息化,2021(4):143-145.

[5] 吴静进,何尚平,万彬.MCS-51单片机原理与应用[M].重庆:重庆大学出版社,2019.

[6] 黄有全,李桂平.多功能节拍器的研制[J].电子技术,2004(11):56-58.

[7] 孙可旭.基于Atmega16的LED电子节拍器的设计[J].电声技术,2009,33(增刊1):35-37.

[8] 张红军.C语言下的抗干扰消抖按键程序设计研究[J].数码世界,2018(1):349-350.

收稿日期:2023-10-10

作者简介:杨辉(1992—),男,云南云龙人,硕士研究生,助理讲师,研究方向:电子信息技术。

猜你喜欢
节拍器数码管中断
节拍器
节拍器上的数学知识
Arduino编程
MC9S08FL16单片机数码管静态显示分析
单片机控制的四位数码管动态显示编程
基于Qt的数码管数字编码系统的设计与实现
跟踪导练(二)(5)
千里移防,卫勤保障不中断
音乐节拍器引导胸外心脏按压频率的可行性研究1)
为什么要使用节拍器