1、个人收集整理 勿做商业用途 河北工业大学计算机硬件技术基础(MCS—51单片机原理及应用) 综合性实验任务书 学院 班级 设计人 __ 成绩 ____ 一、题目:简易电子琴的设计 二、目的与要求 1. 目的: (1)能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。 (2)熟悉8051单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。 (3)实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件. (4)对软件编程、排错调试
2、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。 2. 基本要求: (1)要按任务书的要求认真分析问题,并解决问题; (2)要求用MCS—51单片机知识完成程序的设计; (3)在实验室利用现有的设备,完成题目的设计与调试。 3. 创新要求 在基本要求达到后,可以进行创新设计,如更加完善程序功能。 4. 书写设计报告的要求 设计报告中包含以下几个方面: 1、 设计题目 2、 总体设计 1) 所实现的功能描述. 2) 设计方案的描述. 3、 硬件系统设计,包括所需设备,接线方式,以及资源分配。 4、 软件系统的设计,包括划分功能模块,写出各个功能模块实现
3、的功能。画出程序流程图 5、 列出程序清单,并加以必要的注释 6、 写出调试程序的方法 7、 指出所设计问题的不足和改进方案 8、 自评分和收获体会 三、设计方法和基本原理 1. 问题描述: 设计一个简易的电子琴,要求用DP—51PROC的按键K1~K7作为电子琴的按键,控制蜂鸣器能够发出1、2、3、4、5、6、7等七个音符。 电路图如下: 2. 问题的解决方案: 由于一首音乐是由许多不同音阶组成,每个音阶对应不同的频率,这样我们可用不同频率组合,即可构成我们想要的音乐了,当然对单片机产生不同的频率非常方便,我们可用单片机的定时/计数器0来产生这样的方波频率信号,因此,
4、我们只要把一首歌曲的音阶对应频率关系设定正确即可。 对于晶振频率为11。0592MHz的单片机,定时器假如选择工作方式1,那T值便为T=216-5*105/相应的频率,那么根据不同的频率计算出应该赋给定时器的计数值。建立这样一个数据表,然后采用查表程序即可。 连线要求:用导线将A2的P3。3 (INT1)与B5区的BUZZ接口相连,用排线将D1区的 J53 与 A2区的J61相连,如上图所示。 四、课程设计的考核方式及评分方法 1.考核方式 课程设计结束时,在机房当场验收. (1) 学生演示,老师检查运行结果是否正确。 (2) 回答教师提出的问题。 (3) 学生提交课程设计报告
5、A4纸打印),并将电子文档和源程序发至知道教师信箱。 2.评分方法 (1) 出勤率 (2) 课程设计准备工作 (3) 课程设计期间纪律 (4) 课程设计运行结果 (5) 课程设计报告 (6)答辩情况 附件1:音节与频率 第一个问题:八度音的频率关系。 每相邻的两个半音,高音频率是低音频率的“2的1/12次方倍”. 例如国际标准音A的频率是440HZ,那么比它高半音的bB,频率就是: 440*2^(1/12)=466.13HZ. 所以,以此类推,一个八度的12个音,连乘下来,结果正好得2。通俗一点儿也就是说,高音1的频率是比他低一个八度的那个1的频率的两倍
6、 第二个问题:不同乐器的同一个音的振动频率是否相同. 大至相同,但有微小的差别。比如吉他的国际标准音A的频率是440HZ,而小提琴的这个A就用441HZ。 音階與頻率的轉換 標準A = 440 Hz 高8度音的頻率為原來音頻率的2倍 下圖為音階圖,每一格為一個半音。 若f1距f2 n個半音,則運算公式:n個半音 = 1/12 * log2(f1/f2),若f1〈f2則n<0,若f1>f2則n>0。 例:C比A低9個半音,計算C的頻率f, —9 = 1/12 * log2(f/440) 得f =261。6 C調音階do, re, mi, fa, so, la, t
7、i, do, 為261。6, 293。7, 329。6, 349。2, 392。0, 440。0, 493.9, 523.2。其中第一個do為261。6Hz,第二個do為523。2Hz是第一個do的2倍。 一拍 = 四分音符,若建議速度=120(BPM),則表示一秒 = 兩拍 = 兩個四分音符,若建議速度=60(BPM),則表示一秒 = 一拍 = 一個四分音符。 电子琴 1.实验任务 (1).由4X4组成16个按钮矩阵,设计成16个音。 (2).可随意弹奏想要表达的音乐. 2.电路原理图
8、 图4。22。1 3.系统板硬件连线 (1).把“单片机系统”区域中的P1。0端口用导线连接到“音频放大模块”区域中的SPK IN端口上; (2)。把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上; 4.相关程序内容 (1)。4X4行列式键盘识别; (2).音乐产生的方法; 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以
9、利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可.现在以单片机12MHZ晶振为例,例出高中低音符与单片机计数T0相关的计数值如下表所示 音符 频率(HZ) 简谱码(T值) 音符 频率(HZ) 简谱码(T值) 低1 DO 262 63628 # 4 FA# 740 64860 #1 DO# 277 63731 中 5 SO 784 64898 低2 RE 294 63835 # 5 SO# 831 64934 #2 RE# 311 63928 中 6 LA 880 6496
10、8 低 3 M 330 64021 # 6 932 64994 低 4 FA 349 64103 中 7 SI 988 65030 # 4 FA# 370 64185 高 1 DO 1046 65058 低 5 SO 392 64260 # 1 DO# 1109 65085 # 5 SO# 415 64331 高 2 RE 1175 65110 低 6 LA 440 64400 # 2 RE# 1245 65134 # 6 466 64463 高 3 M 1318 65157 低 7 SI 494
11、 64524 高 4 FA 1397 65178 中 1 DO 523 64580 # 4 FA# 1480 65198 # 1 DO# 554 64633 高 5 SO 1568 65217 中 2 RE 587 64684 # 5 SO# 1661 65235 # 2 RE# 622 64732 高 6 LA 1760 65252 中 3 M 659 64777 # 6 1865 65268 中 4 FA 698 64820 高 7 SI 1967 65283 下面我们要为这个音符建立一个表格,有助于单片机通过
12、查表的方式来获得相应的数据 低音0-19之间,中音在20-39之间,高音在40-59之间 TABLE: DW 0,63628,63835,64021,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,649
13、94,0,0,0 DW 0,65058,65110,65157,65178,65217,65252,65283,0,0 DW 0,65085,65134,0,65198,65235,65268,0,0,0 DW 0 2、音乐的音拍,一个节拍为单位(C调) 曲调值 DELAY 曲调值 DELAY 调4/4 125ms 调4/4 62ms 调3/4 187ms 调3/4 94ms 调2/4 250ms 调2/4 1
14、25ms 对于不同的曲调我们也可以用单片机的另外一个定时/计数器来完成。 下面就用AT89S51单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。 在这个程序中用到了两个定时/计数器来完成的。其中T0用来产生音符频率,T1用来产生音拍. 5.程序框图 图4。22.2 6.汇编源程序 KEYBUF EQU 30H STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H ORG 00H
15、LJMP START ORG 0BH LJMP INT_T0 START: MOV TMOD,#01H SETB ET0 SETB EA WAIT: MOV P3,#0FFH CLR P3.4 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1
16、 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1 NK1: CJNE A,#0DH,NK2 MOV KEYBUF,
17、1 LJMP DK1 NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1 1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1 NK4: NOP DK1: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DP
18、TR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,
19、@A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK1A CLR TR0 NOKEY1: MOV P3,#0FFH CLR P3。5 MOV A,P3 ANL A
20、#0FH XRL A,#0FH JZ NOKEY2 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#4
21、 LJMP DK2 NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2 NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2 NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2 NK8: NOP DK2: MOV A
22、KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A
23、 INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK2A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK2A CLR TR0 NOKEY2: MOV P3,#0FFH
24、 CLR P3.6 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P3 ANL A,#0FH
25、 CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3 NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 LJMP DK3 NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3 NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11
26、 LJMP DK3 NK12: NOP DK3: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOV
27、C A,@A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ
28、 DK3A CLR TR0 NOKEY3: MOV P3,#0FFH CLR P3.7 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH
29、 JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4 NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4 NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 L
30、JMP DK4 NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4 NK16: NOP DK4: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB
31、 MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,@A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,@A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK4A: MOV
32、A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4A CLR TR0 NOKEY4: LJMP WAIT DELY10MS: MOV R6,#10 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0: MOV TH0,STH0
33、 MOV TL0,STL0 CPL P1。0 RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H TABLE1: DW 64021,64103,64260,64400 DW 64524,64580,64684,64777 DW 64820,64898,64968,65030
34、 DW 65058,65110,65157,65178 END 7.C语言源程序 #include unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsigned char temp;
35、 unsigned char key; unsigned char i,j; unsigned char STH0; unsigned char STL0; unsigned int code tab[]={64021,64103,64260,64400, 64524,64580,64684,64777, 64820,64898,64968,65030, 65058,65110,65157,65178}; v
36、oid main(void) { TMOD=0x01; ET0=1; EA=1; while(1) { P3=0xff; P3_4=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i〉0;i--) for(j=200;j>0;j——); temp=P3; temp=temp & 0x0f;
37、 if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=0; break; case 0x0d:
38、 key=1; break; case 0x0b: key=2; break; case 0x07: key=3; break; } temp=P3; P1_0=~P1_0;
39、 P0=table[key]; STH0=tab[key]/256; STL0=tab[key]%6; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f;
40、 } TR0=0; } } P3=0xff; P3_5=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i>0;i—-) for(j=200;j>0;j——); temp=P3; temp=temp & 0x0f;
41、 if (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=4; break; case 0x0d:
42、 key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; } temp=P3; P1_0=~P1_0;
43、 P0=table[key]; STH0=tab[key]/256; STL0=tab[key]%6; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f;
44、 } TR0=0; } } P3=0xff; P3_6=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i>0;i——) for(j=200;j>0;j-—); temp=P3; temp=temp & 0x0f; i
45、f (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=8; break; case 0x0d: key=9;
46、 break; case 0x0b: key=10; break; case 0x07: key=11; break; } temp=P3; P1_0=~P1_0; P
47、0=table[key]; STH0=tab[key]/256; STL0=tab[key]%6; TR0=1; temp=temp & 0x0f; while(temp!=0x0f) { temp=P3; temp=temp & 0x0f;
48、 } TR0=0; } } P3=0xff; P3_7=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) { for(i=50;i〉0;i-—) for(j=200;j〉0;j——); temp=P3; temp=temp & 0x0f; if
49、 (temp!=0x0f) { temp=P3; temp=temp & 0x0f; switch(temp) { case 0x0e: key=12; break; case 0x0d: key=13
50、 break; case 0x0b: key=14; break; case 0x07: key=15; break; } temp=P3; P1_0=~P1_0;






