初学单片机,基于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单片机的简易电子琴应该很简单了。由于头条没有提供下载附件功能,因此无法上传单片机烧写代码文件,当然办法是有的。
今天就聊到这里,如果您感兴趣,可以关注:头条号/春天说,后续文章会提供单片机代码文件,以及下载方法。欢迎在评论区交流,如果喜欢,也可以分享给更多朋友。
初学单片机,基于51单片机的电子琴原理图绘制
有了前期准备工作,今天开始绘制原理图。
在选择器件的时候我放弃了传统的STC89c52单片机,我选择了STC15W408AS。我的原则是:高效,简单。当然,如果你用前者,只要稍微修改下程序和管脚定义,也是完全可行的。
由于后者是1T单片机,在这之前我计算了一下定时器的最大定时时间:
1 / 12000000 * 65536 = 0.00546秒
前面列表的最低频率是196Hz,单个脉冲时间是:
1 / 196 / 2 = 0.00255秒
由于 0.00255秒 < 0.00546秒,所以按照前面的思路利用16位定时器产生脉冲是可行的。当然,即便是用8位定时器我们也可以通过累加等办法实现长定时。
单片机的电路:
核心器件——单片机电路原理图
由于这款单片机内部具有复位、时钟等电路,所以外围非常简洁。只需要供给2.4~5.5V范围内的工作电压就可以。
另外就是串口下载程序的接口。需要准备一块USB转串口的小板即可实现PC下载程序代码。
利用一个管脚P2.6(别的空脚都可以)来输出方波信号。
控制电路:
对于琴键(这里用按键代替),本来我们计划用4*4键盘,考虑到以实验和学习为目的,暂时不需要做的太费时间,就只作12个按键,而且可以不用按键,用一根导线接地的金属笔(硬导线之类),碰触单片机管脚就可以实现音乐的演奏。
按键电路原理图
如上图,如果是试验为目的,可以不接按键,直接用金属笔的导线接到R1电阻即可。单片机管脚比较密,也可以连线出来接到焊盘上。当然,用按键还是用起来方便。没有定式,灵活一些就可以。
输出电路:
下面给出简单的无源蜂鸣器电路:
蜂鸣器控制电路原理图
使用这个电路的目的是为了制作简单,当然也可以用功放加喇叭。
上图中采用的是无源蜂鸣器,供电好的情况下,电阻R3不要也可以正常工作。由于蜂鸣器内阻比较小,例如40欧姆,那么在5V供电下,电流可以达到5 / 40 = 0.125A,125mA对于电路的冲击也是不小的,特别是供电内阻比较大的电源,所以串接一个小阻值的电阻可以减低对电路的影响。但是也会降低效率,使声音变小,所以其阻值不需要太大,可根据实际情况选择调整。
Q1采用NPN三极管,单片机的信号输出脚需要设置成强推挽输出,蜂鸣器的供电可以高于单片机供电;对于89C52单片机,需要换成PNP三极管,而且蜂鸣器供电不能高于单片机供电;如果换成AVR或者430单片机,一般不能用PNP三极管,因为这些单片机的管脚输出高电平可能低于自身供电电压,其电压差足以致使三极管导通。
参考供电电路:
简单的供电电路原理图
上图是电池供电或者USB供电采用的电路,没有稳压电路。对于供电电路,可以灵活运用,手头有什么电源,只要满足要求就可以使用。当然,单片机使用的是稳压电源,不能用简单的整流电源。上面采用的是单片机和蜂鸣器共用电源,因此电源的电流要求不小于200mA。单片机供电电压根据实际采用的型号决定,考虑到蜂鸣器的供电电压一般在5V,所以尽量用5V,实际3.3V也可以正常工作。
我是春天,今天我们简单绘制了“基于51单片机的电子琴”原理图,遵循的原则是“制作要简单”,欢迎您能提出更好的建议和想法,我们一同实践初学单片机的乐趣。。。
相关问答
怎么用labview编写 单片机 烧写程序-ZOL问答在单片机开发过程中,从硬件设计到软件设计几乎是开发者针对本系统特点亲自完成的。这样虽然可以降低系统成本,提高系统的适应性,但是每个系统的调试占去了总开...
计算器怎么设置弹音乐?普通计算器是没办法的,我不知道你说的是哪一种计算器。如果是普通计算器的话,里面有一个单片机,可以理解为性能比较一本的cpu处理器,通过蜂鸣器器,编程控制...