前面我们用了快一周的时间不断更新制作过程,实物终于打造完成了,到了最后阶段——给单片机编写程序。
这里采用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单片机的简易电子琴应该很简单了。由于头条没有提供下载附件功能,因此无法上传单片机烧写代码文件,当然办法是有的。
今天就聊到这里,如果您感兴趣,可以关注:头条 /春天说,后续文章会提供单片机代码文件,以及下载方法。欢迎在评论区交流,如果喜欢,也可以分享给更多朋友。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!