您当前的位置:五五电子网电子知识单元电路娱乐-游戏电路使用51单片机实现简易电子琴的设计 正文
使用51单片机实现简易电子琴的设计

使用51单片机实现简易电子琴的设计

点击数:7903 次   录入时间:03-04 12:01:37   整理:http://www.55dianzi.com   娱乐-游戏电路

  该系统外部设置8个按键作为琴键,使用者可以通过按键控制蜂鸣器发出不同音阶的乐音,即:1、2、3、4、5、6、7和1(高音)。
  
  设计者可通过按键演奏简单的音乐。
  
  单片机系统中最常用的输入方式是键盘。键盘按键可通过多种方式与单片机的连接,如独立式、行列矩阵式、专用芯片等。本系统中由于单片机可用引脚较多,为简化设计,采用独立式接法。即在单片机的一个I/O口上接一个按键。采用排电阻为8个按键外接上拉电阻。
  
  通过单片机实现电子琴演奏,实质就是将不同按键和特定频率的方波信号对应起来,以方波信号驱动蜂鸣器发出乐音。下面简单介绍一下乐音的特性。乐音实际上是有固定频率的信号。在音乐理论中,把一组音按音调高低的次序排列起来就成为音节,也就是1、2、3、4、5、6、7和高音1。高音1的频率正好是中音1频率的2倍,而且音节中各音的频率跟1的频率之比都是整数之比。
  
  为了发出某一特定频率的乐音,可以控制单片机的一个I/O口产生该频率的方波信号,经过电流放大后驱动蜂鸣器发出该乐音。对于方波的产生,可以启用单片机的一个定时器进行计时,产生溢出中断。中断发生时,将输出引脚的电平取反,然后重新载入计数器初始值。
  
  因此,正确的设置定时器的工作模式和初始计数值是发出乐音的基础。例如中音l,其频率是523Hz,则周期为T=l/523=1912μs,半个周期为956μs。根据单片机计数器计数的机器周期,就可以算出计数器的预置初始值应为多少。例如,假设采用的单片机的一个计数周期需要12个时钟周期,当采用12MHz晶振时,一个计数周期即lμs。要定时956μs,只需设置其计数初值为计数最大计数值减去956。对应不同的按键,调节Tl的溢出时间,即可输出不同频率的乐音,这样就实现了简易电子琴的设计。
  
  形成每个乐音音高的频率是固定的,下表列出了一个8度以及其上下共16个音的音名、频率及定时器Tl初值对照(设晶体频率为12MHz)。

  该简易电子琴的硬件电路设计较简单,通过Pl口进行按键扫描,从P0.1口输出方波信号,经三极管放大后驱动蜂鸣器发出声响。系统硬件电路如下图所示。

电子琴原理图

  系统程序主要包括按键扫描及键值处理模块、定时器控制模块。主程序流程如下图所示。主程序调用键值处理子程序Get_Key()获取键值,并返回键值对应的数组索引值,然后调用Play()函数启动或停止蜂鸣器发声。

  主程序代码如下:

  根据系统采用的晶振频率和所用单片机的机器周期计算各音阶对应的计数器初始值,存储在数组中供程序使用。
  
  子程序Get_Key()为键值读取子函数。系统按键采用单线单键接法,程序采用扫描方式读取。程序扫描到按键后并不直接返回键值,而是查找键值表keymode[],获取并返回键值对应的索引值i。这样处理方便后续程序将键值转换为该键对应的计数器初值。代码如下:

  系统初始化子程序Sys_lnit用于设定定时器工作模式,开启中断。代码如下:

  子程序Play()根据子程序Get_Key()返回的按键值,决定是否开启定时器1。在中断处理子函数中,通过取反PO.1引脚控制蜂鸣器呜叫。子程序Play()代码如下:

  定时器Tl主要用于生成各音阶对应的方波频率。在Tl的中断服务程序中,通过将P0.1引脚取反后输出方波信号,通过对Tl重新赋计数初值生成不同的方波频率。代码如下:

  该设计实现了一个简易的电子琴,并给出了硬件电路图及软件程序。在软件设计中,通过键盘扫描子程序读取键值,返回键值对应的索引值。根据索引值决定是否启动Tl运行。
  
  在Tl中断服务程序中,根据索引值对Tl重新赋初值并对蜂鸣器驱动口电平取反获得相应频率的方波信号,从而实现了乐音输出。
  
  该设计体现了电子音乐发生的基本原理和设计方法。设计者可以对该设计进行功能扩展,如增加按键,实现更多音阶的输入和响应;或者可以设置功能选择键,增设播放预存电子音乐的功能等。




本文关键字:单片机  电子琴  娱乐-游戏电路单元电路 - 娱乐-游戏电路