1、电子琴实训报告北方名族大学电气信息工程学院课程设计实训报告设计题目:简易电子琴设计与制作报告人:刘泽华 学院:电器信息工程学院 专业:测控技术与仪器班级:08级测控班 学号:实训地点:4#教学楼指导教师姓名:毛建东,周春燕实训日期:2010.12.19-2010.12.241.实训课题32.设计目的33.设计原理34.硬件电路45.软件流程86.Proteus 仿真147.C 语言源程序188.元件清单259.心得体会26一设计的课题:简易电子琴的设计与制作二课程设计的目的:培养和锻炼在校学生综合应用所学理论知识解决实际问题能力。为了巩固和运用所学课程,理论联系实际,提高分析、解决实际问题以及
2、团队的合作能力,旨培养在培养大学生理论联系实际、敢于动手、善于动手和独立自主解决设计实践中遇到的各种问题能力的一种较好方法。电子琴能够弹奏出美妙的音符,对我们充满了吸引同时也让我们充满了好奇,通过此次的课程设计让我们亲手来揭开电子琴神秘的面纱。让我们知道我们也是有能力来制作出一个简易的电子琴的。三、课程设计原理:电子琴是由4*4个组成16个按钮矩阵,设计成16个音。然后利用三极管放大的原理使声音变大,可通过16个按钮组成16种不同的音节。本文的主要内容是用AT89S51单片机为核心控制元件,设计一个电子琴。以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键
3、和扬声器。声音的产生方法:一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。四、硬件电路(一)、系统板硬件连线 系统板硬件连线如图1-1所示,发生模块,键盘模块,及电源模块连接如下:1.把“单片机系统”区域中的P2.0端口用导线连接到“音频放大模块”区域中的SPK IN端口上;2.把“单片机系统”区域中的P1.0P1.7端口用8芯排线连接到“4X4行列式键盘”区域中的C
4、1C4R1R4端口上;3.把电源电路与扬声器连接,直接对扬声器供电。(二)、主要芯片简介1、AT89S51简介AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89S51具有如下特点:40个引脚(如图1-2所示
5、),4k Bytes Flash片内程序存储器,128 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。 此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。主要功能特性兼容MCS-5
6、1指令系统 32个双向I/O口 2个16位可编程定时/计数 器 全双工UART串行中断口线 2个外部中断源 中断唤醒省电模式图1-2 引脚图 看门狗(WDT)电路 灵活的ISP字节和分页编程 4k可反复擦写ISP Flash ROM 4.5-5.5V工作电压 时钟频率0-33MHz 128*8bit内部RAM 低功耗空闲和省电模式 3级加密位 软件设置空闲和省电功能 双数据寄存器指针2、7805简介: 电子产品中,常见的三端稳压集成电路有正电压输出的78 系列和负电压输出的79系列。顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。它的样子象是普通的三
7、极管,TO- 220 的标准封装,也有9013样子的TO-92封装。 用78/79系列三端稳压IC来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。该系列集成稳压IC型号中的78或79后面的数字代表该三端集成稳压电路的输出电压,如7806表示输出电压为正6V,7909表示输出电压为负9V。 因为三端固定集成稳压电路的使用方便,电子制作中经常采用。五、软件流程(一)、4X4行列式键盘识别及显示组成键盘的按键有机械式、电容式、导电橡胶式、薄膜式多种,但不管什么形式,其作用都是一个使电路接通与断开的开关。目前微机系统中使用的键盘按其功能不同
8、,通常可分为编码键盘和非编码键盘两种基本类型。 编码键盘:键盘本身带有实现接口主要功能所需的硬件电路。不仅能自动检测被按下的键,并完成去抖动、防串键等功能,而且能提供与被按键功能对应的键码(如ASCII码)送往CPU。所以,编码键盘接口简单、使用方便。但由于硬件电路较复杂,因而价格较贵。 非编码键盘:键盘只简单地提供按键开关的行列矩阵。有关按键的识别、键码的确定与输入、去抖动等功能均由软件完成。目前微机系统中,一般为了降低成本大多数采用非编码键盘。 键盘接口必须具有去抖动、防串键、按键识别和键码产生4个基本功能: (1)去抖动:每个按键在按下或松开时,都会产生短时间的抖动。抖动的持续时间与键的
9、质量相关,一般为520mm。所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。去抖问题可通过软件延时或硬件电路解决。 (2)防串键:防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。常用的方法有双键锁定和N键轮回两种方法。双键锁定,是当有两个或两个以上的按键按下时,只把最后释放的键当作有效键并产生相应的键码。N键轮回,是当检测到有多个键被按下时,能根据发现它们的顺序依次产生相应键的键码。 (3)被按键识别:如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。常用的方法有行扫描法和线反转法两种。行扫描法的基
10、本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。 (4)键码产生:为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码。用AT89S51的并行口P1接44矩阵键盘,以P1.0P1.3作输入线,以P1.4P1.7作输出线。(二)、系统板上硬件连线设计1、把“单片机系统”区域中的P1.0P1.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1C4R1R4端口上;2、把
11、扬声器的基极输出接单片机的P2.0端口;3、在单片机31脚和9脚接复位电路;4、在单片机19脚和18脚接12MHZ的晶体振荡电路。(三)、程序设计内容1、44矩阵键盘识别处理,每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。2、键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行
12、扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。电路图如下(四)、音乐产生的方法一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系正确即可。若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。就可在P1.0引脚上得到此频率的脉冲。 利用AT89
13、S51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T1/5231912s,因此只要令计数器计时956s/1s956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。计数脉冲值与频率的关系式(如式2-1所示)是:Nfi2fr 2-1式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率。其计数初值T的求法如下:T65536N65536fi2fr T65536N65536fi2fr655362fr65536/fr低音DO的T65536/262636
14、27中音DO的T65536/52364580高音DO的T65536/104665059单片机12MHZ晶振,高中低音符与计数T0相关的计数值如表2-2所示表2-2 音符频率表Table 2-2 notes the frequency table音符频率(HZ)简谱码(T值)音符频率(HZ)简谱码(T值)低1DO26263628# 4 FA#74064860#1DO#27763731中 5 SO78464898低2RE29463835# 5 SO#83164934#2 RE#31163928中 6 LA88064968低 3 M33064021# 693264994低 4 FA34964103中
15、 7 SI98865030# 4 FA#37064185高 1 DO104665058低 5 SO39264260# 1 DO#110965085# 5 SO#41564331高 2 RE117565110低 6 LA44064400# 2 RE#124565134# 646664463高 3 M131865157低 7 SI49464524高 4 FA139765178中 1 DO52364580# 4 FA#148065198# 1 DO#55464633高 5 SO156865217中 2 RE58764684# 5 SO#166165235# 2 RE#62264732高 6 LA17
16、6065252中 3 M65964777# 6186565268中 4 FA69864820高 7 SI196765283我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据 低音019之间,中音在2039之间,高音在4059之间TABLE: DW 0, 63628, 63835, 64021, 64103, 64260, 64400, 64524, 0, 0DW 0, 63731, 63928, 0, 64185, 64331, 64463, 0, 0, 0DW 0, 64580, 64684, 64777, 64820, 64898, 64968, 65030, 0, 0DW
17、 0, 64633, 64732, 0, 64860, 64934, 64994, 0, 0, 0DW 0, 65058, 65110,65157, 65178, 65217, 65252, 65283, 0, 0DW 0, 65085, 65134, 0, 65198, 65235, 65268, 0, 0, 0DW 0音乐的音拍,一个节拍为单位(C调)(如表2-3所示)表2-3 曲调值表Table 2-3 Tune the value of the table曲调值DELAY曲调值DELAY调4/4125ms调4/462ms调3/4187ms调3/494ms调2/4250ms调2/4125
18、ms对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。琴键处理程序,根据检测到得按键值,查询音律表,给计时器赋值,发出相应频率的声音。对音调的控制:根据不同的按键,对定时器T1送入不同的初值,调节T1的溢出时间,这样就可以输出不同音调频率的方波。不同音调下各个音阶的定时器。在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。六、proteus仿真七、程序#include /包含51单片机寄存器定义的头文件sbit P14=P14; /将P14位定义为P1.4引脚sbit P15=P15; /将P15位定义为P1.5引脚sbit P16=P16;
19、/将P16位定义为P1.6引脚sbit P17=P17; /将P17位定义为P1.7引脚unsigned char keyval; /定义变量储存按键值sbit sound=P20; /将sound位定义为P3.7unsigned int C; /全局变量,储存定时器的定时常数unsigned int f; /全局变量,储存音阶的频率/以下是C调低音的音频宏定义#define l_dao 262 /将“l_dao”宏定义为低音“1”的频率262Hz#define l_re 286 /将“l_re”宏定义为低音“2”的频率286Hz#define l_mi 311 /将“l_mi”宏定义为低音“
20、3”的频率311Hz#define l_fa 349 /将“l_fa”宏定义为低音“4”的频率349Hz#define l_sao 392 /将“l_sao”宏定义为低音“5”的频率392Hz#define l_la 440 /将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 /将“l_xi”宏定义为低音“7”的频率494Hz /以下是C调中音的音频宏定义#define dao 523 /将“dao”宏定义为中音“1”的频率523Hz#define re 587 /将“re”宏定义为中音“2”的频率587Hz#define mi 659 /将“mi”宏定义为中音“
21、3”的频率659Hz#define fa 698 /将“fa”宏定义为中音“4”的频率698Hz#define sao 784 /将“sao”宏定义为中音“5”的频率784Hz#define la 880 /将“la”宏定义为中音“6”的频率880Hz#define xi 987 /将“xi”宏定义为中音“7”的频率53 /以下是C调高音的音频宏定义#define h_dao 1046 /将“h_dao”宏定义为高音“1”的频率1046Hz#define h_re 1174 /将“h_re”宏定义为高音“2”的频率1174Hz#define h_mi 1318 /将“h_mi”宏定义为高音“3
22、”的频率1318Hz#define h_fa 1396 /将“h_fa”宏定义为高音“4”的频率1396Hz#define h_sao 1567 /将“h_sao”宏定义为高音“5”的频率1567Hz#define h_la 1760 /将“h_la”宏定义为高音“6”的频率1760Hz#define h_xi 1975 /将“h_xi”宏定义为高音“7”的频率1975Hz/*函数功能:软件延时子程序*/ void delay20ms(void) unsigned char i,j; for(i=0;i100;i+) for(j=0;j60;j+) ; /*函数功能:节拍的延时的基本单位,延时
23、250ms*/void delay() unsigned char i,j; for(i=0;i250;i+) for(j=0;j250;j+) ; /*函数功能:输出音频入口参数:F*/void Output_Sound(void) C=(46083/f)*10; /计算定时常数 TH0=(8192-C)/32; /可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32; /可证明这是13位计数器TL0低5位的赋初值方法 TR0=1; /开定时T0 delay(); /延时200ms,播放音频 TR0=0; /关闭定时器 sound=1; /关闭蜂鸣器 keyval=
24、0xff; /播放按键音频后,将按键值更改,停止播放/*函数功能:主函数*/ void main(void) EA=1; /开总中断 ET0=1; /定时器T0中断允许 ET1=1; /定时器T1中断允许 TR1=1; /定时器T1启动,开始键盘扫描 TMOD=0x10; /分别使用定时器T1的模式1,T0的模式0 TH1=(65536-500)/256; /定时器T1的高8位赋初值 TL1=(65536-500)%256; /定时器T1的高8位赋初值 while(1) /无限循环 switch(keyval) case 1:f=dao; /如果第1个键按下,将中音1的频率赋给fOutput_
25、Sound(); /转去计算定时常数 break;case 2:f=l_xi;/如果第2个键按下,将低音7的频率赋给f Output_Sound(); /转去计算定时常数 break; case 3:f=l_la; /如果第3个键按下,将低音6的频率赋给Output_Sound(); /转去计算定时常数 break;case 4:f=l_sao; /如果第4个键按下,将低音5的频率赋给fOutput_Sound(); /转去计算定时常数 break;case 5:f=sao; /如果第5个键按下,将中音5的频率赋给fOutput_Sound(); /转去计算定时常数 break;case 6:
26、f=fa; /如果第6个键按下,将中音4的频率赋给fOutput_Sound();/转去计算定时常数 break;case 7:f=mi; /如果第7个键按下,将中音3的频率赋给fOutput_Sound(); /转去计算定时常数 break; case 8:f=re; /如果第8个键按下,将中音2的频率赋给fOutput_Sound(); /转去计算定时常数 break;case 9:f=h_re; /如果第9个键按下,将高音2的频率赋给fOutput_Sound(); /转去计算定时常数 break;case 10:f=h_dao; /如果第10个键按下将高音1的频率赋给fOutput_S
27、ound(); /转去计算定时常数 break;case 11:f=xi; /如果第11个键按下,将中音7的频率赋给fOutput_Sound();/转去计算定时常数 break;case 12:f=la; /如果第12个键按下,将中音6的频率赋给fOutput_Sound(); /转去计算定时常数 break; case 13:f=h_la; /如果第13个键按下,将高音6的频率赋给fOutput_Sound(); /转去计算定时常数 break;case 14:f=h_sao;/如果第14个键按下,将高音5的频率赋给fOutput_Sound();/转去计算定时常数 break;case 15:f=h_fa; /如果第15个键按下,将高音4的频率赋给fOutput_Sound(); /转去计算定时常数 break;case 16:f=h_mi; /如果第16个键按下,将高音3的频率赋给fOutput_Sound(); /转去计算定时常数 break; /*函数功能:定时器T0的中断服务子程序,使P2.0引脚输出音频方波*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1