产品概述

基于单片机的电子琴设计 初学单片机,基于51单片机的电子琴程序结构

小编 2024-11-24 产品概述 23 0

初学单片机,基于51单片机的电子琴程序结构

前面我们用了快一周的时间不断更新制作过程,实物终于打造完成了,到了最后阶段——给单片机编写程序。

这里采用c语言编写单片机程序。在编程之前先来分析一下程序的组成部分:

单片机电子琴设计——程序结构简化图

程序结构:

用一张图片来介绍程序的详细结构:

单片机电子琴设计——程序结构图

单片机头文件:

由于STC15系列单片机相对于传统51单片机多了很多寄存器和功能,因此最好获取一个头文件,然后在主程序main.c里声明一下,就可以了。在官方软件STC-ISP里面找到“头文件”选项,选择正确的系列,点击“保存文件”,保存到主程序文件所在文件夹里。

从官方工具软件里获取单片机头文件截图

定时器初装值对应频率表格:

开始制作了一个表格,后来针对1T单片机重新制定了一个。这里要说明的是:该系列单片机的定时器时钟既可以设置为1T,也可以设置为12T,前面的担心是多余的。

下面是新制作的“定时器时钟1T模式”表格图片,频率做了删减,保留了12个常用音的频率:

单片机电子琴设计——定时器初装值对应频率表截图

初始化函数:

初始化I/O端口。

信号输出端口P2.6设置为强推挽输出;

按键检测端口设置(开机默认)为准双向(弱上拉)。

初始化定时器0。

初始化不用赋值,不开计数,等到按键按下去再打开计数,定时器中断就会不断取反信号输出端口,产生相应频率的音频信号。

定时器0中断函数:

在中断里面只做一件事情,就是对信号输出端口取反,形成方波信号。

按键检测函数:

需要注意的问题:

不使用“等待按键释放”的函数语句。因为按键按下的时候应该发出声音,如果等待按键释放会产生延时,影响效果。按键松开则关闭定时器计数,音频停止。

同时按下两个或者多个按键的处理方法?这一点应该可以解决,此处暂未修改,当多个按键按下时,应该检测到无效键值,不产生声音。

关于按键检测的详细思路内容较多,本处暂且略过,以后再细聊。

主函数:

需要注意的问题:因“按键检测函数”不使用“等待按键释放”的函数语句,所以按键检测是连续循环的,但是不能不断的给定时器赋值,所以需要定义一个变量来记录按键值,当检测到相同的按键时不需要重复赋值给定时器。

以上是程序设计的结构和需要注意的问题。按照上面结构图中的框架,用kile软件新建一个工程,编写c语言程序,然后编译完生成烧写代码hex文件。

单片机下载hex文件:

用STC-ISP软件,通过串口小板把hex文件下载到单片机里面,单片机就可以工作了。当然一般需要反复修改程序,反复下载代码,直到单片机正常工作为止。

下载单片机代码截图

下载代码时,在新版软件里面,硬件选项里除了频率需要设置为12.000(MHz)以外,其它不用设置,用默认值就可以。

结合本周前面的多篇文章,制作一款基于51单片机的简易电子琴应该很简单了。由于头条没有提供下载附件功能,因此无法上传单片机烧写代码文件,当然办法是有的。

今天就聊到这里,如果您感兴趣,可以关注:头条号/春天说,后续文章会提供单片机代码文件,以及下载方法。欢迎在评论区交流,如果喜欢,也可以分享给更多朋友。

单片机创意小制作,没有琴弦的电子琴

没有琴弦的琴怎么能弹奏呢?对于我们玩电子的人来说,那到未必,今天我就给大家做一个没有琴弦的琴,让大伙儿弹弹!

说是没有琴弦,那只是相对于我们的视觉,弦头与弦尾之间除了空气之外,其实还暗藏玄机——那就是红外线,准确地说我做的是一个红外琴。

无弦琴的组成

图13.1所示是做好的无弦琴的外观,琴弦是由一对红外发射、接收头组成的,一共有8对这样的琴弦,可以弹奏16种声音。有一个按键用来切换,当按下时有8种声音,没有按下时也有8种声音。这个无弦琴还有另外两种功能,就是按键弹奏16种声音并能播放两首曲子。

图13.1 无弦琴的整体外观

电路原理

无弦琴总体可以分为红外发射、红外接收和单片机控制3个部分。首先说说红外发射:其实它是一个555电路,用555产生38kHz频率的信号。当然有的朋友可能说可以用单片机来产生,这个是仁者见仁,智者见智了,只要能产生38kHz,单片机也可以。把该信号用三极管放大供8个红外发射二极管使用。由于红外发射二极管的耐压为3V,而通过三极管后的电压有4.3V左右,考虑到二极管的正常工作,设计中采用两个串联再一起并联的方式,见图13.2。这部分简单吧?只要学过一点电路的都没有问题的。

图13.2 红外二极管发射电路

本人是按照书上的555电路直接设计的PCB,那些电容、电阻怎么匹配就看大家手上有多少的了,我是用一个滑动电阻来取值的,再进行匹配,实物图见图13.3。

图13.3 红外发射部分

红外接收由两个部分组成,实物图见图13.4,一个就是8个红外接收头,一字排开,他们的间距要和上面的红外发射头的间距完全一样,不然会相互干扰,后面再说。另一个就是矩阵键盘,矩阵键盘怎样排版这个也看大家了,在我制作中有一个致命的问题,就是只注重元器件的排布而忽略了它们其实也是有一定的规律的,一般就是上面4个P口与下面4个P口相互交叉的地方安一个按键。我有的按键两端都是连接在下面的4个P口上,后面花了很大的功夫才改过来,这一点希望大家注意!红外接收头则比较简单了,它只有3个引脚,其中接地和接电源的都是并联的,输出端则用排线引到74LS14上进行数字处理,因为它输出的有时是线性的,为了更好地接收,就用施密特管子处理后输给单片机,这部分电路也很简单,见图13.5。

图13.4 红外接收部分

图13.5 红外接收与琴键电路

图13.6 单片机控制电路

图13.7 单片机控制部分

图13.8 无弦琴原理图

最后介绍单片机控制电路,见图13.6。一共就3块芯片,一片单片机和两片74LS14,74LS14的作用上面已经讲过,单片机外接一个扬声器,其实就是一个废弃的耳塞,按照蜂鸣器的接法来接就可以了,实物图见图13.7。另有8个指示灯连在74LS14的输出端,同时也是单片机的输入端,它们会在弹奏时随着你的指尖滑动而依次点亮,起到美观的作用,也是方便调试时使用。74LS14输出的电流驱动发光二极管绰绰有余。还有就是引出ISP,进行调试使用的。

这个无弦琴系统电路就是这么多,怎么样?是不是很简单啊?

图13.8是整个系统的原理图,感觉满满的,乍一看可能吓一跳,但看仔细了就会发现很多元件只是重复地增加数量而已。

说完了电路再说说我在制作中遇到的一些麻烦吧。

首先就是红外发射和接收要对齐,因为只有对齐了,所有的接收头都接收到对射的红外线,输出的电平都一样。若有一个没有对齐时就相当于你用手挡住了,单片机会默认你在弹。画PCB时大家应该没什么问题,把距离设定一下就可以了。就是在安装时很麻烦,我是用MP4的包装盒做的,虽说纸质是挺硬的,但做骨架就不是很稳定了——会晃,这样会导致这个对齐了那个又没有对齐,你在没有弹时电路也默认你在弹,一直在响,很是郁闷。这个只有大家做出来后慢慢体会了。

软件部分的流程图见图13.9。软件部分是从最初的电子琴的基础上一步步加进去的,由P0.0作为演唱曲子和弹奏曲子的切换键,弹奏是红外弹奏和按键弹奏同时的,他们没有优先级,可以混合弹奏;演唱曲子部分是有两首曲子组成,有一个复位键和两个曲子键,就这三个按键。

以上就是整个无弦琴的硬件和软件部分了,我设计这个无弦琴原本应该是一个可以拿出去炫耀一番的礼物,可惜外观做得实在是太难看了,大家也看到了实在是拿不出手,各位如果有条件的话可以用比较硬的东西作为骨架来做,效果应该好些。在组装的时候一定要注意发射头和接收头是一对一的,千万不要有干扰啊,不然一个接收头接收到了来自多个发射头的红外线,那么当你挡住其中的一个发射头时,其他的红外线照样接收,那就相当于你没有挡住一样。我的做法就是在接收头的上方盖一层硬纸,再在纸上打个小小的洞,使其旁边发射的红外光不被照射到接收头上,见图13.4,效果还可以。如果不行就用黑色介质吧,这样可以吸收多余的红外线。大家要是有兴趣的话也可以去尝试尝试,希望这些能够帮助大家做出一个可以拿出去炫一番的礼物或者留给自己的纪念品。

图13.9 无弦琴流程图

相关问答

基于AT89s52 单片机的 8键 电子琴设计 的c语言程序怎么编啊(蜂鸣器)?

蜂鸣器出不同音调的声音是由于震动的频率不同,你可以先定义八个不同的函数分别是八个音(通过定时或循环达到)然后将按键分别与对应的音调函数对应,按哪个按键...

猜你喜欢