《单片机课程设计报告简易电子琴》由会员分享,可在线阅读,更多相关《单片机课程设计报告简易电子琴(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; /将按下的键对应发出此频率声音的初值装入 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 ;