《单片机课程设计报告简易电子琴.doc》由会员分享,可在线阅读,更多相关《单片机课程设计报告简易电子琴.doc(16页珍藏版)》请在三一办公上搜索。
1、课程设计报告( 20142015 年度第 二 学期)课 程:单片机及嵌入式系统A 题 目: 简易电子琴 院 系: 自动化系 班 级: 测控1201 学 号: 201202030105 201202030106 学生姓名: 指导教师: 设计周数: 一周 成 绩: 日期:2015年 6 月 11 日一、课程设计内容与要求1针对所选择的设计题目进行硬件设计,合理选用所需元器件,绘制系统结构框图、硬件接线图,并在实验系统上完成电路的连接和调试。2根据所选题目的要求进行程序设计,绘制程序总体流程图并编写源程序上机调试。3写出课程设计报告,对整个设计过程进行归纳和综合,对设计中所存在的问题和不足进行分析和
2、总结,提出解决的方法、措施、建议和对这次设计实践的认识和收获。二、课程设计正文设计题目主要内容是用AT89S51单片机作为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。设计思想使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0
3、来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。设计原理44矩阵键盘识别处每个按键都有它的行值列值,行值列值的组合就是按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0” 和“1”, 开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查出该键的功能。数码管扬声器截图
4、各音节频谱码利用AT89C51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T1/5231912s,因此只要令计数器计时956s/1s956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。计数脉冲值与频率的关系式(如式4-1所示)是: Nfi2fr 4-1式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。其计数初值T的求法如下: T65536N65536fi2fr例如:设K65536,fi1MHz,求低音DO(261Hz)、中音DO(52
5、3Hz)、高音DO(1046Hz)的计数值。T65536N65536fi2fr6553610000002fr65536500000/fr 低音DO的T65536500000/26263627 中音DO的T65536500000/52364580 高音DO的T65536500000/104665059单片机12MHZ晶振,高中低音符与计数T0相关的计数值如表4-2所示 表4-2 音符频率表音乐发生流程图整体电路图源程序#include #define uchar unsigned char#define uint unsigned intsbit beep=P16; /定义蜂鸣器sbit mus
6、ic=P13; /*music为低电平播放世上只有妈妈好(工作模式为音乐播放器),music1为低电平时播放祝你生日快乐,music、music1都为高电平时(工作模式为电子钢琴)*/sbit music1=P11;uchar timer0h,timer0l,time,key,flag; /flag=0时为电子钢琴模式,flag=1时为音乐播放器uchar code yuepu= 6,2,3,5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1, 6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1, 6,1,1, 5,2,
7、1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2, 5,2,1,6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1, 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0 ; /世上只有妈妈好乐谱uchar code yuepu1=5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2, 4,2,1, 4,2,1
8、, 3,2,2, 1,2,2, 2,2,2, 1,2,4; /祝你生日快乐乐谱uchar code TH_0=0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,/ 28个音阶高八位频率表 装进定时器高八位 ;uchar code TL_0=0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9
9、,0x5B,0x8F, 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,/ 28个音阶低八位频率表 装进定时器 低八位;void delay(uchar t) uchar t1; unsigned long t2; for(t1=0;t1t;t1+) /延时半拍函数,控制音乐节奏 for(t2=0;t20;i-) for(j=110;j0;j-); void keyscan() /检测十六个发出音乐按键函数 uchar temp; P3=0xfe; temp=P3; temp=0xf0&temp; if(tem
10、p!=0x0f) delayms(10); /检测第一行 temp=P3 ; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xee: key=0;break; case 0xde: key=1;break; case 0xbe: key=2;break; case 0x7e: key=3;break; TH0=TH_0key;/将按下的键对应发出此频率声音的初值装入 TR0=1; /打开定时器 while(temp!=0xf0)/一直按下就一直发声 temp=P3; temp=temp&0xf0; TR0=0;/松手时关闭
11、定时器0,不能发声 beep=1;/使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开 P3=0xfd; temp=P3; temp=0xf0&temp; if(temp!=0x0f)/检测第二行按键 delayms(10); temp=P3 ; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xed: key=4;break; case 0xdd: key=5;break; case 0xbd: key=6;break; case 0x7d: key=7;break; TH0=TH_0key; /将按下的键对应发出此频率声
12、音的初值装入 TL0=TL_0key; TR0=1; /打开定时器0 while(temp!=0xf0)/一直按下就发声 temp=P3; temp=temp&0xf0; TR0=0; /松手时关闭定时器,不能发声 beep=1;/使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开 P3=0xfb; temp=P3; temp=0xf0&temp; if(temp!=0x0f) delayms(10); temp=P3 ; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xeb: key=8;break; case 0xdb
13、: key=9;break; case 0xbb: key=10;break; case 0x7b: key=11;break; TH0=TH_0key; TL0=TL_0key;/将按下的键对应发出此频率声音的初值装入 TR0=1; /打开定时器 while(temp!=0xf0)/一直按下就发声 temp=P3; temp=temp&0xf0; TR0=0; /松手时关闭定时器0,不能发声 beep=1;/使蜂鸣器置高关闭,预防在进入中断取反时将它置低打开 P3=0xf7; temp=P3; temp=0xf0&temp; if(temp!=0x0f) delayms(10); temp=
14、P3 ; temp=temp&0xf0; if(temp!=0xf0) temp=P3; switch(temp) case 0xe7: key=12;break; case 0xd7: key=13;break; case 0xb7: key=14;break; case 0x77: key=15;break; TH0=TH_0key; TL0=TL_0key;/将按下的键对应发出此频率声音的初值装入 TR0=1; while(temp!=0xf0) temp=P3; temp=temp&0xf0; TR0=0; beep=1; void main() uchar k,i; TMOD=1;
15、EA=1; ET0=1; while(1) if(music&music1) /当为高电平时没有放音乐,扫描键盘 flag=0; keyscan(); if(!music) flag=1; i=0; while(i100) /音乐数组长度,唱完从头再来 if(music) beep=1; break; k=yuepui+7*yuepui+1-1; timer0h=TH_0k; timer0l=TL_0k; time=yuepui+2; i+=3; song(); if(!music1) flag=1; i=0; while(i75) if(music1) beep=1; break; k=yu
16、epu1i+7*yuepu1i+1-1; timer0h=TH_0k; timer0l=TL_0k; /把对应的音乐频率放进定时器0 time=yuepu1i+2;/音乐节拍 i+=3; song(); void time0() interrupt 1 if(flag=0) beep=!beep; TH0=TH_0key; TL0=TL_0key; else beep=!beep; TH0=timer0h; TL0=timer0l; /电子琴模式时进入 /音乐播放器模式调试结果仿真效果良好,硬件调试结果可以接受,不过由于蜂鸣器的问题,效果不是很理想。具体效果看演示三、 课程设计总结1.本次单片
17、机课程设计对简易电子琴进行了一系列的了解和查阅。 1.1首先,要理解电子琴的简单工作原理。简易电子琴通过矩阵键盘可以产生16个不同频率的音频,这些频率需要上网搜集资料获得。 1.2其次,电子琴需要注意以下几个方面。1.2.1按键的时候发声,按键松开的时候停止发声。1.2.2同时按2个或以上的键的时候不会出现错误,发出的声音是结合在一起的声音。 1.3最后,在电子琴的设计中加入了音乐盒的一个特征,按键K1.3会播放音乐,在程序 中写入了两个音乐的频率,但是由于开发板只存在一个按键,所以只能播放一个音乐。2.设计中存在的问题和不足及解决方法 2.1开发板的发声不连续、不清晰。原因是蜂鸣器功能不完善
18、,可以接一个扬声器来改善。 2.2设计中,长按键播放音乐,松开停止播放。不足是应该设计成按一下持续播放音乐, 再按键播放另外一首音乐,可解决由于开发板按键只有一个而只能播放一种音乐的缺 陷。 2.3另外可以添加在数码管上显示按键的音符的功能。3.设计实践的认识和收获 3.1认识到单片机的强大功能,没有实现不了的功能,只有想不到的方面。 因为在没有接触课程设计之前,只简单的了解实验的内容,对单片机的知识没有充分 的了解和应用,在观看了所有的项目以及其他同学的完成的情况,发现自己的设计存 在很多不足。 3.2虽然没有完美的完成自己的课程设计,但是仍然掌握了部分知识。对单片机的编程有 了更加深入的了解,明白细节和概念的重要性。因为编程的时候一定要注意细节,否 则出现问题后很难找出,有时候会因为一个标点符号造成整个程序的错误,stc软件 甚至会崩溃。 3.3课程设计两人一组明确的分工以及相互讨论,不仅增进了沟通的能力,并且取长补短, 对知识了解的更透彻,如果只是一个人去做的话,难免会有问题难以解决,最后对付 的完成课程设计,会导致什么也没有学到。虽然分工难免会存在两个人有做的多有做 的少,但是学的好的会帮助另外一个多少掌握一些基础的知识,互相进步才是这次课 程设计的主要目的。