资源预览内容
第1页 / 共38页
第2页 / 共38页
第3页 / 共38页
第4页 / 共38页
第5页 / 共38页
第6页 / 共38页
第7页 / 共38页
第8页 / 共38页
第9页 / 共38页
第10页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
课程设计说明书题 目: 基于单片机的电子琴设计 院 (系): 电子工程与自动化学院 专 业: 测控技术与仪器(卓越) 2013 年 9 月 21 日word格式. 目 录1 摘要 12 关键字 13 设计任务及要求 14 方案可行性论证 15 程序框图 26 关键单元电路与程序介绍 36.1 复位与震荡电路 36.2 4x4矩阵键盘 36.3数码管与LED灯 46.4 蜂鸣器 66.5 音乐相关知识 77 调试过程 118 总结与体会 119 参考文献 1110 附录 1210.1 设备与仪器 1210.2 软件 1210.3 原件清单 1210.4原理图与PCB图 1310.5 总程序 1410.6 实物图 31【摘要】:打造一个多功能电子琴,核心是一块单片机。单片机读取键值,为置定时器赋初值,定时器每溢出一次,驱动蜂鸣器的引脚电平就取反一次,产生相应频率的方波,即音调;设好键值与数码管段码表的对应关系,键按下时,数码管显示对应音调。一首音乐储存在一个表中,表中的数据是音调与节拍,单片机读取音符的音调与节拍,根据音调赋予定时器初值,根据节拍决定定时器工作的时间,也就是蜂鸣器响的时间,一个接一个地读取音符,即可播放一首歌曲。节拍用led灯的点亮个数表示。单片机读取音乐表中的节拍,控制led灯的点亮个数,达到显示节拍的效果。特别要注意的是:该方案采用了两个定时器,T0、T1。T0作为驱动蜂鸣器的定时器,要给予高优先级,不然会被T1干扰,音质变差。【关键字】:单片机、stc89c52、电子琴、C51、keil。【设计任务及要求】:1.通过按键能够发出相应的音符并播放产生乐音,实现演奏;2.演奏的同时可数字显示当前的音调,利于培养乐感3.可以选定播放固定乐曲自动演奏,演奏时LED进行节拍指示;4.在自动演奏和奏乐的过程中按停止键则中断演奏;5.可以选择调节音或小。【方案可行性论证】:本课题采用stc89c52单片机作为核心器件,实现基本的音乐弹奏、音乐播放、音调显示和音乐节拍指示的功能。1. 音乐弹奏:通过程序识别4x4矩阵键盘中按下的键的坐标(x,y),然后根据(x,y)从计数初值表中读取对应的计数初值,赋值给定时器0,定时器产生对应频率的方波,达到播放对应音调的功能。2. 音乐播放:先建立一个包含一首音乐的音调与节拍的表。其中,音调就是0x01(低音、do)、0x12(中音、re)、0x23(高音、mi)之类的数;节拍就是0x02(半拍),0x04(一拍)之类的数。然后,根据音调读取计数初值,再将计数初值赋给定时器T0 - 开启定时器T0 - 读取节拍并延时 - 关闭定时器T0 。这样就发出了一个音,然后再读下一个音的初值与节拍,重复上一个操作即可。(具体实现方法见附录总程序)3. 数码管显示音调: 按键:读出按键坐标(x,y),用if语句来判断(x,y)该给数码管赋什么值,然后从uchar code num 表中读取这个值赋给数码管(例如P0)。 播放歌曲时:读入音调,根据音调的值来判断numi这个表中的i,再把numi赋给P0口。4.led灯的节拍指示:采用定时器1来控制,作为节拍指示。按键时:根据按下的时长来控制led的点亮个数,并且是按一定的时间间隔逐个点亮;释放按键时,led灯按一定的时间间隔逐个熄灭,从而达到一种比较简单的节拍指示效果。播放音乐时:根据音符的节拍,控制点亮到哪一个灯,在点亮那个灯之前,前面的灯逐个等时距点亮。音符结束后,led灯全部一起熄灭。这样,达到了一个精确显示节拍的效果。开始【程序框图】:扫描键盘根据音调给T0赋初值开启T0 T1是否停止播放读下一个音符关闭T0 T1数码管与led数码管显示音调Led指示节拍否按节拍延迟算出音符的音调、节拍是否结束符关闭定时器P0口置0否否是按键是否释放开启定时器,并赋初值,蜂鸣器发声算出定时器初值数码管显示音调识别按键 有矩阵键按下否否播放键按下读取歌曲是是是 【复位与震荡电路】:原件的参数如图所示。C1,C2 可采用30pF 无极性瓷电容;C3可采用10F记性电解质电容。值得注意的是,晶振不能随便摸!尤其在通电工作的时候,触摸容易损坏。自从摸过一次后,震荡频率变得不稳定,蜂鸣器声音时好时坏。【4x4矩阵键盘】:键盘扫描的基本思路是:先得出触发按键的“行”,即横坐标x,再得出他的“列”,即纵坐标y。以下是获取横坐标x的代码:uchar key_x() /*P1口高位接纵坐标(P1.7 - P1.4) 低位接横坐标(P1.3 - P1.0)*/ uchar i; P1 = 0x0f; /*有按键按下后 对应按键的横坐标电位被拉低( 注意低电位引脚不能被高电位引脚抬高,只能是低电位拉低高电位)*/if(P1_0 = 0)delayms(5); /延时5ms 去抖动if(P1_0 = 0)i = 1;else if(P1_1 = 0)delayms(5);if(P1_1 = 0)i = 2;else if(P1_2 = 0)delayms(5);if(P1_2 = 0)i = 3;else if(P1_3 = 0)delayms(5);if(P1_3 = 0)i = 4;elsei = 0;return (i);/0表示按键未按下 获取y的方法与获取x的方法类似,具体可以参考附件总程序。得到触发按键的坐标(x,y)之后,可以通过x,y的值来确定按键的功能。例如 x=1,y=1时(S1按下),可以让数码管显示1:if(x = 1 & y = 1)P0 = led_table1;或者更方便一点:if(x = 1)P0 = led_tabley;就能显示第一行的所有的数了。【数码管与LED灯】:数码管:在本课题中,数码管要显示A - G , 1 - 7, 1. - 7. ,所以段码比较另类。num0的值是没用到的,起占位作用。uchar code num=0x00,/共阴极数码管段选码0x77,0x7c,0x39,0x5e,0x79,0x71,0x3d, /a - g0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, /1 - 70x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87 /1. - 7.;编写程序时,要根据实际情况来编写:比如16个按键不能够把低中高音都全部表示完全,只能选取合适的部分。我让第一行的按键 触发低音 4 - 7,第二行触发中音1 - 4,第三行触发中音5 - 7和高音1,第四行触发高音2 - 5。这样设置能弹奏大部分曲目。以下是控制数码管的代码片段:if(x = 1)P0 = num3 + y ; /低音4 - 7else if(x = 2)P0 = num7 + y; /中音1 - 4else if(x = 3)P0 = num11 + y; /中音5 - 7 和 高音 1else if(x = 4)P0 = num15 + y; /高音2 - 5LED灯:因为LED灯要按一定的时间逐个点亮或者逐个熄灭,所以我用定时器1来控制它。定时器1每溢出一次并满足一定条件时flash变量就+1或者-1,然后从led_table这个表中读出相应的数赋给P2口。表:uchar code led_table=0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00;/*发光二极管闪烁表*/代码: if(x != 0 & y != 0 & flash 0 ) /最小减到0 -flash; P2 = led_tableflash;播放音乐时又有所不同:播放音乐时,led灯要精确地显示当前音符的节拍,所以if语句里加了一条限制语句:flash jiepai)代码:if(ou
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号