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

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

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

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

  • 程序结构:

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

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

  • 单片机头文件:

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

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

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

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

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

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

  • 初始化函数:

    1. 初始化I/O端口。

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

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

    2. 初始化定时器0。

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

  • 定时器0中断函数:

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

  • 按键检测函数:

  • 需要注意的问题:

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

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

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

  • 主函数:

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

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

  • 单片机下载hex文件:

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

    下载单片机代码截图

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


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

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

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2017年9月7日
    下一篇 2017年9月7日

    相关推荐