初学单片机,基于51单片机的电子琴程
2025/2/14 来源:不详北京治白癜风的大医院 http://www.zherpaint.com/
前面我们用了快一周的时间不断更新制作过程,实物终于打造完成了,到了最后阶段——给单片机编写程序。
这里采用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.(MHz)以外,其它不用设置,用默认值就可以。
结合本周前面的多篇文章,制作一款基于51单片机的简易电子琴应该很简单了。由于百家没有提供下载附件功能,因此无法上传单片机烧写代码文件,当然办法是有的。今天就聊到这里,如果您感兴趣,可以