电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
课程设计系列之电子琴
分 享
扫描二维码分享
课程设计系列之电子琴
课程设计
51单片机
电子琴
入门电子设计
关注
发布时间: 2021-04-07
丨
阅读: 681
## 简介 大家好,本篇文章的内容是基于51单片机的电子琴,还是先看一下电子琴需要实现哪些功能,首先需要通过51单片机检测按下的按键,然后单片机通过定时器产生相应频率的信号,驱动喇叭产生不同的音阶。电子琴的功能还是比较简单的,确定好需要实现的功能后就可以开始具体的设计了,首先还是进行硬件部分的设计。 ## 硬件设计 首先新建Proteus仿真文件,来看一下硬件部分用到的元器件: - AT89C52单片机 - 矩阵键盘 - 电阻 - 喇叭 - 2N3905 电子琴电路比较简单,可以根据下面的电路图进行连接: ![](https://cf04.ickimg.com/bbsimages/202104/8c5238c3be5f22c4b1c98d7c4464a272.png) 电子琴的电路主要是矩阵键盘和喇叭驱动电路两部分,首先是矩阵键盘电路,上图中用到的矩阵键盘可以在Proteus中搜索KEYPAD,这种矩阵键盘与通过单独的按键连接的矩阵键盘相同,只是不需要自己连接,使用比较方便,在这里用的是4*3的矩阵键盘,在电子琴应用中只需要用到1~7这7个按键即可。 ![](https://cf04.ickimg.com/bbsimages/202104/5147456da9c4062012ec6a0ba532bdd6.png) ![](https://cf04.ickimg.com/bbsimages/202104/cfe160758511f868a3b05eb0d49c13e4.png) 上面就是两种矩阵键盘的连接图,在这里矩阵键盘引脚连接到了单片机的P1脚。然后就是喇叭的驱动电路,在这里是通过一个NPN三极管连接的驱动电路,三极管使用的是2N3905,也可已选择其他的方式驱动,但是驱动电路要与程序相匹配, ![](https://cf04.ickimg.com/bbsimages/202104/2ace14fa25e04eb85cba0fb8658e75e2.png) 单片机通过P37引脚驱动喇叭发声,这就是电子琴的硬件部分了。 ## 软件设计 现在就开始进行电子琴的软件设计了,首先要通过单片机驱动矩阵键盘获取按下的键值,下面是矩阵键盘的驱动函数: ```c #include "reg52.h" #define uint unsigned int #define uchar unsigned char sbit SPK = P3^7; int key; uchar k; uint code YINJIE[] = //定义的基本音阶频率表 { 523,587,659,698,784,880,988, }; uchar RunFlag; //音阶播放标志 uchar STH0; //定义的临时存储定时器初值 uchar STL0; void delay(uint x) //延时函数 { uint a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } int keyboard() //键盘扫描 { P1 = 0xf7; k = P1; k = k & 0xf0; if(k == 0xf0) { key = 88; } if(k != 0xf0) { delay(4); k = P1; k = k & 0xf0; if(k != 0xf0) { switch(k) { case 0xe0: key = 88; break; case 0xd0: key = 0; break; case 0xb0: key = 88; break; case 0x70: key = 88; break; } } } P1 = 0xfb; k = P1; k = k & 0xf0; if(k != 0xf0) { delay(4); k = P1; k = k & 0xf0; if(k != 0xf0) { switch(k) { case 0xe0: key = 7; break; case 0xd0: key = 8; break; case 0xb0: key = 9; break; case 0x70: key = 88; break; } } } P1 = 0xfd; k = P1; k = k & 0xf0; if(k != 0xf0) { delay(4); k = P1; k = k & 0xf0; if(k != 0xf0) { switch(k) { case 0xe0: key = 4; break; case 0xd0: key = 5; break; case 0xb0: key = 6; break; case 0x70: key = 88; break; } } } P1 = 0xfe; k = P1; k = k & 0xf0; if(k != 0xf0) { delay(4); k = P1; k = k & 0xf0; if(k != 0xf0) { switch(k) { case 0xe0: key = 1; break; case 0xd0: key = 2; break; case 0xb0: key = 3; break; case 0x70: key = 88; break; } } } return key; } ``` 上面就是矩阵键盘的驱动函数,在电路中矩阵键盘的引脚连接到了单片机的P1口,通过改变P1口的值可以得出当前是否有按键按下并输出当前按下按键的值key,由于我们的电子琴只需要使用7个按键即可,所以在矩阵键盘驱动程序中只需要设定1~7号按键的键值,其他的按键键值可以相同。 写完键盘的驱动程序后可以先下载到仿真电路中测试一下程序是否可以正常运行,可以将键盘驱动程序输出的key作为P2口的输出,这样可以实时查看是否得出正确的按键, ![](https://cf04.ickimg.com/bbsimages/202104/d9bd61f4b5fe0a0660847a0a1c6f9363.png) ![](https://cf04.ickimg.com/bbsimages/202104/bebe3da28c20d3bbcd2d57bbb4bb14ea.png) 上面两张图是分别按下1号和2号按键时,单片机P2口显示的值,这样就可以看出矩阵键盘的驱动程序工作正常,接下来就是驱动喇叭产生正确的音阶了。 产生不同的音阶是通过单片机的定时器产生不同频率的PWM信号实现的,在前面的程序中给出了基本音阶的频率表,当按下不同的按键时给定时器赋不同的初值,在定时器的中断中进行单片机引脚电平的反转,当按键松开时关闭喇叭的驱动引脚,这样就可以实现按下不同的按键时喇叭发出不同的音阶,下面是产生音阶的程序: ```c void main() { TMOD = 0x01; //--- 配置T0为定时模式,工作于方式1 --- ET0 = 1; //--- 使能T0中断 --- TR0 = 1; EA = 1; while(1) { keyboard(); P2 = key; if(key < 8) { //根据音阶表计算定时器T0的初值 STH0 = (65536 - 500000 / YINJIE[key-1]) / 256; STL0 = (65536 - 500000 / YINJIE[key-1]) % 256; TH0 = STH0; TL0 = STL0; RunFlag = 1; //音阶播放标志 } else { RunFlag = 0; SPK = 1; } } } void T0_ISR(void) interrupt 1 { if(1 == RunFlag) { TH0 = STH0; TL0 = STL0; SPK = ~SPK; } } ``` 现在将程序下载进仿真的芯片中再进行测试, ![](https://cf04.ickimg.com/bbsimages/202104/836063c1d1b937c94e212bd743f50022.png) ![](https://cf04.ickimg.com/bbsimages/202104/12c2daa3af26392b3b0575d550221dd8.png) 开启仿真后按下键盘上的按键,可以看到单片机P2口输出了正确按键键值,打开电脑的声音,可以听到喇叭已经发出了不同的音阶,7个按键分别可以发出不同的音阶,以上就是基于51单片机的电子琴的设计过程了,感谢观看,之后会继续讲解其他课程设计的例子。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
入门电子设计
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交