单片机简易电子琴课程设计报告Word文件下载.docx
- 文档编号:22475727
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:16
- 大小:523.84KB
单片机简易电子琴课程设计报告Word文件下载.docx
《单片机简易电子琴课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机简易电子琴课程设计报告Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
3.3键盘设计
键盘在单片机应用系统中是一个关键的部件,它能实现向计算机输入数据,传送命令等功能,是人工干预计算机的主要手段。
键盘可以分为2类:
独立连接式键盘和矩阵式键盘。
(1)矩阵式键盘
单片机系统中,若按键较多时,通常采用矩阵式(也称行列式)键盘。
矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上。
显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。
矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上.当无键按下时,行线处于高电平状态;
当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。
这是识别按键是否按下的关键。
(2)独立连接式键盘
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其它I/O口线的状态。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,然而,在按键较多时,I/O口线浪费较大,不宜采用。
独立式按键软件常采用查询式结构。
先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
由于本程序较为简单,为了使用方便及节省资源,选择独立式键盘。
下图为独立式键盘电路图:
图3-3独立式键盘电路图
键盘编程中主要考虑去抖动的问题。
当测试表明有键被按下之后,紧接着就进行去抖动处理。
因为键是机械开关结构,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。
为保证键识别的准确,在电压信号抖动的情况下不能进行行状态输入。
为此需进行去抖动处理。
去抖动有硬件和软件两种方法。
硬件方法就是加去抖动电路,从根本上避免抖动的产生。
软件消抖,在第一次检测到有键按下时,执行一段延时程序之后,再检测此按键,如果第二次检测结果仍为按下状态,CPU便确认此按键己按下,消除了抖动。
3.4发音模块设计
如下图所示,发音电路是由蜂鸣器、三极管、上拉电阻构成。
由三极管来驱动扬声器发音的,同时加上拉电阻增强驱动电流,提高驱动能力。
图3-4发音电路图
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系正确即可。
4软件功能实现
4.1软件系统流程分析
(1)键盘扫描程序:
检测是否有按键按下,有按键按下则记录按下键的键值,并跳转至功能转移程序;
无按键按下,则返回键盘扫描程序继续检测。
(2)琴键处理程序:
根据检测到的按键值,查询音调表,给计时器赋值,使发出相应频率的声音。
初始化
开启定时器
N
关闭定时器,无声音发出
Y
键盘扫描,确定按下的按键
发出相应音调
图4-1主程序流程图
4.2关键代码的实现
4.2.1键盘扫描
unsignedcharkeys_scan(void)
{unsignedcharTmp,k=16;
P2=0x0F;
delay_1ms(2000);
Tmp=P2^0x0F;
switch(Tmp)//确定扫描的是哪一列
{case1:
k=0;
break;
case2:
k=1;
case3:
k=2;
case4:
k=3;
default:
return16;
//无键按下,返回
}
P2=0xF0;
Tmp=(P2>
>
4)^0x0F;
switch(Tmp)//确定扫描的是那一行
{case1:
k+=0;
break;
case2:
k+=4;
case3:
k+=8;
case4:
k+=12;
default:
//无键按下,返回
}
returnk;
}
4.2.2发声程序
//音符发生的中断
voidplay_tone()interrupt1
{TH0=Sound_Temp_TH0;
TL0=Sound_Temp_TL0;
beep=!
beep;
}
4.3其他关键技术
定时器产生音乐原理
利用单片机的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶。
例如,频率为523Hz,其周期T=1/523=1912μs,因此只要令计数器计时956μs/1μs=956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系式(如式2-1所示)是:
N=fi÷
2÷
fr
2-1
式中,N是计数值;
fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);
fr是想要产生的频率。
其计数初值T的求法如下:
T=65536-N=65536-fi÷
fr
例如:
设K=65536,fi=1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。
fr=65536-1000000÷
fr=65536-500000/fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1046=65059
音符频率表
音符
频率(HZ)
简谱码(T值)
低1 DO
262
63628
#4FA#
740
64860
#1 DO#
277
63731
中5SO
784
64898
低2 RE
294
63835
#5SO#
831
64934
#2RE#
311
63928
中6LA
880
64968
低3M
330
64021
#6
932
64994
低4FA
349
64103
中7SI
988
65030
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
466
64463
高3M
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
1480
65198
554
64633
高5SO
1568
65217
中2RE
587
64684
1661
65235
622
64732
高6LA
1760
65252
中3M
659
64777
1865
65268
中4FA
698
64820
高7SI
1967
65283
采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
低音0-19之间,中音在20-39之间,高音在40-59之间。
用单片机弹奏电子琴,实际上是按照特定的频率,输出一连串的方波。
为了输出合适的方波,首先应该知道音符与频率的关系。
5设计中的难点
本次课程对知识的要求较为综合,我们用到了单片机,数字电路,单片机各引脚,中断系统原理等知识。
在老师的帮助下,以及自己不断查找资料,慢慢进入状态。
我们将编好的源程序输入电脑,编译后出现很多错误,这些错误有许多是平时实验遇到过的,例如:
输入的分号格式不正确,零和字母O弄混淆。
对于中断程序,运行过程中按键控制不稳定,不能按照预想的要求控制中断。
6设计结果
当按下键盘的1,2,3,4,时,可以发出DO,RE,M,FA四个音调;
按5,6,7,8,八个键,能够发出升一调的DO,RE,M,FA,如果在前一个按下的键发声的同时有另一个键被按下,则启用中断系统,前面键的发音停止,转到后按的键的发音程序,发出后按的键的音调。
7总结与心得
在为期一周的单片机课程设计中,我在增长知识、提高能力的同时,产生了很深的感触。
从初步定下方案到编出程序,从不断的运行排错到调试成功,在整个设计过程中,着实受益匪浅,不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的东西。
通过这次的课程设计作品的制作让我对单片机的理论有了更加深入的了解,同时在具体的制作过程中我们发现现在书本上的知识与实际的应用存在着不小的差距,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,我们不得不考虑这方的问题,这让我们无法根据书上的理论就轻易得到预想中的结果,有时结果甚至很差别很大。
通过这次设计,我基本掌握了如何利用keil生成hex文件。
通过开发板的设计和硬件搭建的过程,使我对89c52系单片机的接口有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法。
我熟悉了89c52系列单片机内部的寄存器和编程规则,以及如何控制外围电路。
总之,通过这次课程设计,我们都清楚明白了自己的能力有多深,想提高还得归于多锻炼,多动手,多向别人学习。
8参考文献
[1]陈明荧.8051单片机课程设计实训教材[M].北京:
清华大学出版社,2003年9月
[2]徐新艳.单片机原理、应用与实践[M].北京:
高等教育出版社,2005年3月
[3]张淑清,姜万录等,单片微型计算机接口技术及应用[M].国防工业出版社,2003
[4]冯博琴,微型计算机原理与接口技术[M].清华大学出版社,2004
9附录:
系统程序源码
/***********************************************************
实验名称:
简易电子琴的程序
程序说明:
能够实现单独演奏功能,其中按键-8是用于单独演奏的
***********************************************************/
#include<
reg52.h>
intrins.h>
//本程序是电子琴的程序,能够实现单独演奏功能。
其中,按键1-8是用于单独演奏的
unsignedintcodetone_delay_table[]=
{63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110};
//各音符对应的延时表
sbitbeep=P3^5;
//蜂鸣器的位定义
unsignedcharSound_Temp_TH0,Sound_Temp_TL0;
//音符定时器初值暂存
voiddelay_1ms(unsignedinti)
{
while(i--);
//延时
//键盘矩阵扫描//返回按下的键的值
voidmain()//主程序
{unsignedcharkey_NO=0;
//设置定时器工作方式3,以及相关开启寄存器
TMOD|=0x11;
//使用模式1,16位定时器,使用"
|"
符号可以在使用多个定时器时不受影响
ET0=1;
//定时器中断打开
TR0=1;
//定时器开关打开
EA=1;
//总中断打开
TH0=tone_delay_table[key_NO]/256;
TL0=tone_delay_table[key_NO]%256;
while
(1){
if(P2!
=0xF0)
//当有按键按下时,需要设置定时器的开启
{key_NO=keys_scan();
//调用键盘扫描
if(key_NO<
15)//按下那个键,发出对应的音调
{delay_1ms(2000);
15)
{Sound_Temp_TH0=tone_delay_table[key_NO]/256;
Sound_Temp_TL0=tone_delay_table[key_NO]%256;
}}
TR0=1;
//开启定时器0,音符中断
else//当没有键按下时,无声音发出;
{TR0=0;
//关闭定时器
beep=1;
//稍做延时,可以避免误判断
}}
//音符发生的中断
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 简易 电子琴 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)