《课程设计(论文)基于AT89S51的电子琴设计报告.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于AT89S51的电子琴设计报告.doc(18页珍藏版)》请在三一办公上搜索。
1、一实训目的通过本课程的实训,旨在使学生在掌握先修课程的基础上,一方面能综合应用这些课程的理论知识,更重要的一方面,是让学生亲自动手,参与到工程实践训练中。使学生在之前掌握的电路.模电.数电等知识,以及单片机知识的基础上,进一步掌握电子产品设计以及开发调试的全过程,尤其包括掌握PCB板的设计.印刷,元器件的安装.电路调试.程序调试.程序下载等实践实训部分,真正培养学生理论联系实际.分析解决一般性技术问题以及实际动手的能力。二设计原理电子琴由以下几个部件组成:单片机89S51、电源、4*4的16个按钮矩阵、音频放大模块、复位模块,数码管,LED显示模块、晶振模块。(1)AT89S51单片机及其引脚
2、说明AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S511主要特性:8031 CPU与MCS-51 兼容 4K字节可编程FLASH存储器(寿命:1000写/擦循环) 全静态工作:0Hz-24KH 三级程序存储器保密锁定 128*8位内部RAM 32条可编程I/O线 两
3、个16位定时器/计数器6个中断源 可编程串行通道 低功耗的闲置和掉电模式 片内振荡器和时钟电路(2)主要管脚说明:P0口:P0口为一个8位漏级开路准双向I/O口,每脚可吸收8TTL门电流。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作
4、为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。 P3口也可作为AT89C51的一些特殊功能口,如下表所示:P3口引脚特殊功能P3.0RXD(串行输入口)P3.1TXD
5、(串行输出口)P3.2(外部中断0)P3.3(外部中断1)P3.4T0(定时器0外部输入)P3.5T1(定时器1外部输入)P3.6WR(外部数据存储器写选通)P3.7RD(外部数据存储器读先通)P3口同时为闪烁编程和编程校验接收一些控制信号。 1.音乐产生的方法一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此
6、周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将P0.0反相,然后重复计时再反相。就可在P0.0引脚上得到此频率的脉冲。 利用AT89S51的内部定时器使其工作计数器模式(MODE1)下,改变计数值TH0及TL0以产生不同频率的方法产生不同音阶,例如,频率为523Hz,其周期T1/5231912s,因此只要令计数器计时956s/1s956,每计数956次时将I/O反相,就可得到中音DO(523Hz)。 计数脉冲值与频率的关系式(如式2-1所示)是: Nfi2fr 2-1式中,N是计数值;fi是机器频率(晶体振荡器为12MHz时,其频率为1MHz);fr是想要产生的频率
7、。其计数初值T的求法如下: T65536N65536fi2fr 例如:设K65536,fi1MHz,求低音DO(261Hz)、中音DO(523Hz)、高音DO(1046Hz)的计数值。 T65536N65536fi2fr6553610000002fr65536500000/fr 低音DO的T65536500000/26263627 中音DO的T65536500000/52364580 高音DO的T65536500000/104665059单片机12MHZ晶振,高中低音符与计数T0相关的计数值如表2-2所示表2-2 音符频率表音符频率(HZ)简谱码(T值)音符频率(HZ)简谱码(T值)低1DO2
8、6263628# 4 FA#74064860#1DO#27763731中 5 SO78464898低2RE29463835# 5 SO#83164934#2 RE#31163928中 6 LA88064968低 3 M33064021# 693264994低 4 FA34964103中 7 SI98865030# 4 FA#37064185高 1 DO104665058低 5 SO39264260# 1 DO#110965085# 5 SO#41564331高 2 RE117565110低 6 LA44064400# 2 RE#124565134# 646664463高 3 M13186515
9、7低 7 SI49464524高 4 FA139765178中 1 DO52364580# 4 FA#148065198# 1 DO#55464633高 5 SO156865217中 2 RE58764684# 5 SO#166165235# 2 RE#62264732高 6 LA176065252中 3 M65964777# 6186565268中 4 FA69864820高 7 SI196765283我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据 低音019之间,中音在2039之间,高音在4059之间 TABLE: DW 0, 63628, 63835, 64021,
10、64103, 64260, 64400, 64524, 0, 0 DW 0, 63731, 63928, 0, 64185, 64331, 64463, 0, 0, 0 DW 0, 64580, 64684, 64777, 64820, 64898, 64968, 65030, 0, 0 DW 0, 64633, 64732, 0, 64860, 64934, 64994, 0, 0, 0 DW 0, 65058, 65110,65157, 65178, 65217, 65252, 65283, 0, 0 DW 0, 65085, 65134, 0, 65198, 65235, 65268,
11、0, 0, 0 DW 0音乐的音拍,一个节拍为单位(C调)(如表2-3所示)表2-3 曲调值表曲调值DELAY曲调值DELAY调4/4125ms调4/462ms调3/4187ms调3/494ms调2/4250ms调2/4125ms对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。琴键处理程序,根据检测到得按键值,查询音律表,给计时器赋值,发出相应频率的声音。对音调的控制:根据不同的按键,对定时器T1送入不同的初值,调节T1的溢出时间,这样就可以输出不同音调频率的方波。不同音调下各个音阶的定时器。在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍。
12、2.4X4行列式键盘识别及显示组成键盘的按键有机械式、电容式、导电橡胶式、薄膜式多种,但不管什么形式,其作用都是一个使电路接通与断开的开关。目前微机系统中使用的键盘按其功能不同,通常可分为编码键盘和非编码键盘两种基本类型。 编码键盘:键盘本身带有实现接口主要功能所需的硬件电路。不仅能自动检测被按下的键,并完成去抖动、防串键等功能,而且能提供与被按键功能对应的键码(如ASCII码)送往CPU。所以,编码键盘接口简单、使用方便。但由于硬件电路较复杂,因而价格较贵。 非编码键盘:键盘只简单地提供按键开关的行列矩阵。有关按键的识别、键码的确定与输入、去抖动等功能均由软件完成。目前微机系统中,一般为了降
13、低成本大多数采用非编码键盘。 键盘接口必须具有去抖动、防串键、按键识别和键码产生4个基本功能。 (1)去抖动:每个按键在按下或松开时,都会产生短时间的抖动。抖动的持续时间与键的质量相关,一般为520mm。所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。去抖问题可通过软件延时或硬件电路解决。 (2)防串键:防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。常用的方法有双键锁定和N键轮回两种方法。双键锁定,是当有两个或两个以上的按键按下时,只把最后释放的键当作有效键并产生相应的键码。N键轮回,是当检测到有多个键被按下时,
14、能根据发现它们的顺序依次产生相应键的键码。 (3)被按键识别:如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。常用的方法有行扫描法和线反转法两种。行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。线反转法的基本思想是通过行列颠倒两次扫描来识别闭合键,为此需要提供两个可编程的双向输入/输出端口。 (4)键码产生:为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码。用AT89S51的并行口P0接44矩阵键盘,以P0.0P0.3作输入线,以
15、P0.4P0.7作输出线;在数码管上显示每个按键的“0F”序号。3.LED数码显示原理: (1)七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。 LED数码管的ga七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码表(如表2-1所示) “0”3FH“8”7FH“1”06H“9”6FH“2”5BH“A”77H“3”4FH“b”7CH“4”66H“C”39H“5”6DH“d”5EH“6”7DH“E”79H“7”07H“F”71H表2-1 字形码表
16、(2)由于显示的数字09的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。这样我们按着数字09的顺序,把每个数字的笔段代码按顺序排好!建立的表格如下所示:TABLEDB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。4.电子琴实现原理1. 电源部分:是由220V的市电通过变压、整流稳压利用7805来得到+5V电压,维持系统的正常工作;把7805的3脚输出接到89S51的40引脚上 2 .4*4的16个按钮矩阵: 4*4行列式键盘识别;行线接P0口的P0.0P0.3,列线P0.4P0.7,行值和列值的组合就是识别这个按键的编码。每个按键的状态同样需
17、变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。3. 晶振模块:用12MHZ的晶振,及两个30pf的电容,接到单片机的18,19,20脚,电路如图(a)所示 (a) (b)4. 复位模块:利用开关和一个10uf的极性电容并联接单片机9脚“reset”脚,电路如图(b)所示5. 音频放大模块:利用三极管将信号放大,由扬声器放出,信号由单片机的17脚“P3.7”口读出,电路如图(c)所示 (c) (d)6 数码管:利用AT89S51单片机的P2端口的P2.0P2.7连接到一个七段数码管的ah的笔段上,数码管的公共端接地。在数码管上循环显示07数字
18、,时间间隔0.2秒。三.硬件电路 图3.1 硬件电路原理图Protel图3.2 硬件电路PCB四.系统程序设计流程图 五.Proteus仿真电路图4.1 Proteus仿真电路图六.源程序(1)Soundplay调用程序: /*说明* 曲谱存贮格式 unsigned char code MusicName音高,音长,音高,音长., 0,0;末尾:0,0 表示结束(Important) 音高由三位数字组成: 个位是表示 17 这七个音符 十位是表示音符所在的音区:1-低音,2-中音,3-高音; 百位表示这个音符是否要升半音: 0-不升,1-升半音。 音长最多由三位数字组成: 个位表示音符的时值,
19、其对应关系是: |数值(n): |0 |1 |2 |3 | 4 | 5 | 6 |几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2n 十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音 百位是符点位: 0-无符点,1-有符点 调用演奏子程序的格式 Play(乐曲名,调号,升降八度,演奏速度);|乐曲名 : 要播放的乐曲指针,结尾以(0,0)结束;|调号(0-11) :是指乐曲升多少个半音演奏;|升降八度(1-3) : 1:降八度, 2:不升不降, 3:升八度;|演奏速度(1-12000):值越大速度越快;*/#ifndef _SOUNDPLAY_H_REVIS
20、ION_FIRST_#define _SOUNDPLAY_H_REVISION_FIRST_/*#define SYSTEM_OSC 12000000/定义晶振频率12000000HZ#define SOUND_SPACE 4/5 /定义普通音符演奏的长度分率,/每4分音符间隔sbit BeepIO = P37;/定义输出管脚unsigned int code FreTab12 = 262,277,294,311,330,349,369,392,415,440,466,494 ; /原始频率表unsigned char code SignTab7 = 0,2,4,5,7,9,11 ; /17在
21、频率表中的位置unsigned char code LengthTab7= 1,2,4,8,16,32,64 ;unsigned char Sound_Temp_TH0,Sound_Temp_TL0;/音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1;/音长定时器初值暂存/*void InitialSound(void) BeepIO = 1;Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;/ 计算TL1应装入的初值 (10ms的初装值)Sound_Temp_TL1 = (65535-(
22、1/1200)*SYSTEM_OSC)%256;/ 计算TH1应装入的初值 TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TMOD= 0x11;ET0 = 1;ET1 = 0;TR0 = 0;TR1 = 0;EA = 1;void BeepTimer0(void) interrupt 1/音符发生中断 BeepIO = 0;BeepIO = !BeepIO;TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0;/*void Play(unsigned char *Sound,unsigned char Signature,u
23、nsigned Octachord,unsigned int Speed)BeepIO = 0;unsigned int NewFreTab12;/新的频率表unsigned char i,j;unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i 11)j = j-12;NewFreTabi = FreTabj*2;elseNewFreTabi = FreTabj;if(Octach
24、ord = 1)NewFreTabi=2;else if(Octachord = 3)NewFreTabi=2;SoundLength = 0;while(SoundSoundLength != 0x00)/计算歌曲长度SoundLength+=2;Point = 0;Tone = SoundPoint;Length = SoundPoint+1; / 读出第一个音符和它时时值LDiv0 = 12000/Speed;/ 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; / 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE; / 普通音最长间
25、隔标准 TR0 = 0;TR1 = 1;while(Point = 2; /低音 if (SM=3) CurrentFre = 2; /高音Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);/计算计数器初值Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; /加12是对中断延时的补偿 SLen=LengthTabLength%10; /算出是几分音符XG=Length
26、/10%10; /算出音符类型(0普通1连音2顿音) FD=Length/100;LDiv=LDiv0/SLen; /算出连音音符演奏的长度(多少个10ms)if (FD=1) LDiv=LDiv+LDiv/2;if(XG!=1)if(XG=0) /算出普通音符的演奏长度 if (SLen0;i-) /发规定长度的音 while(TF1=0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;if(LDiv2!=0)TR0=0; BeepIO=0;for(i=LDiv2;i0;i-) /音符间的间隔while(TF1=0);TH1 = Sound_
27、Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;Point+=2; Tone=SoundPoint;Length=SoundPoint+1;BeepIO = 0;/*#endif(2)主程序#include #include SoundPlay.h#include#include#define uchar unsigned char#define uint unsigned intint shang,key;sbit w=P32; sbit k = P30;/定义输出管脚void delay(unsigned int t)unsigned int i, j;for (i
28、 = 0;i t;i+)for (j = 0;j 10;j+);unsigned char code table=0x3f,0x06,0x5b,0x4f, /0,1,2,3/ 0x66,0x6d,0x7d,0x07, /4,5,6,7/ 0x7f,0x6f,0x77,0x7c, /8,9,a,b/ 0x39,0x5e,0x79,0x71 /c,d,e,f/ ;/*Music*/挥着翅膀的女孩unsigned char code Music_Girl= 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x03, 0x16,0x03, 0x17,0
29、x03, 0x17,0x03, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x02, 0x18,0x03, 0x17,0x03, 0x15,0x02, 0x18,0x03, 0x17,0x03, 0x18,0x02, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x15,0x03, 0x16,0x03, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x1A,0x03, 0x1B,0x03, 0x1F,0x03, 0x1F,0x03, 0x17,0x03
30、, 0x18,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x1F,0x03, 0x1F,0x02, 0x16,0x03, 0x17,0x03, 0x18,0x03, 0x17,0x03, 0x18,0x03, 0x20,0x03, 0x20,0x02, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x20,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x1F,0x03, 0x1B,0x03, 0
31、x19,0x03, 0x19,0x03, 0x15,0x03, 0x1A,0x66, 0x1A,0x03, 0x19,0x03, 0x15,0x03, 0x15,0x03, 0x17,0x03, 0x16,0x66, 0x17,0x04, 0x18,0x04, 0x18,0x03, 0x19,0x03, 0x1F,0x03, 0x1B,0x03, 0x1F,0x66, 0x20,0x03, 0x21,0x03, 0x00, 0x00,0x00;/同一首歌unsigned char code Music_Same= 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x
32、66, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02, 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66, 0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00, 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03, 0x19,0x00,
33、 0x00,0x00 ;/两只蝴蝶 unsigned char code Music_Two = 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03
34、, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0x15,0x03, 0x16,0x01, 0x17,0x03, 0x16,0x03, 0x17,0x01, 0x16,0x03, 0x17,0x03, 0x16,0x03, 0x15,0x01, 0x10,0x03, 0x15,0x03, 0x16,0x02, 0x16,0x0D, 0x17,0x03, 0x16,0x03, 0x15,0x03, 0x10,0x03, 0
35、x10,0x0E, 0x15,0x04, 0x0F,0x01, 0x17,0x03, 0x19,0x03, 0x19,0x01, 0x19,0x03, 0x1A,0x03, 0x19,0x03, 0x17,0x01, 0x10,0x03, 0x15,0x00, 0x00,0x00 ;/*unsigned char code Music_Gir2= 0x25,0x02,0x00,0x00;unsigned char code Music_Gir3= 0x57,0x02,0x00,0x00;unsigned char code Music_Gir4= 0x84,0x02,0x00,0x00;unsigned char code Music_Gir5= 0x98,0x02,0x00,0x00;unsigned char code Music_Gir6= 0xc0,0x02,0x00,0x00;unsigned char code Music_Gir7= 0x15,0x02,0x00,0x00;unsigned char code Music_Gir8= 0x17,0x02,0x00,0x00;unsigned char code Music_Gir9