单片机音乐盒电赛电子大赛报告书.docx
《单片机音乐盒电赛电子大赛报告书.docx》由会员分享,可在线阅读,更多相关《单片机音乐盒电赛电子大赛报告书.docx(20页珍藏版)》请在冰豆网上搜索。
单片机音乐盒电赛电子大赛报告书
单片机音乐盒
作品类别:
1
1、作品简介
1、1设计内容
设计一个具有特定功能的音乐盒。
该音乐盒上电后能自动显示系统提示符“P”,进入准备工作状态。
该音乐盒可以播放多首音乐,可以由按键来选择不同曲目。
1、2功能要求说明
设有三个按键,其中两个能实现多首音乐的选择,另一个能实现待机准备的功能。
设有一位数码管,每选择一首曲子能在数码管上显示当前的曲目(只是数字)。
设有八位二极管,能随歌曲的频率闪烁。
1、2、1方案介绍及其工作原理
1、2、2方案介绍
作为单片机的重要硬件资源之一,利用定时器可以产生各种固定频率的方波信号,也可以产生包括“Do“、“Re“、“Me“--等音阶在内的各种频率声音。
在此设计中我们采用12MHz的晶振,产生的频率信号即音乐信号由P3.7口输出,信号经过PNP管放大后由蜂鸣器发出声音。
乐曲中,每一音符对应着特定的频率,可以参照给出的各音符频率及其相应的时间常数来编写程序。
根据表中所提供的常数,将其16进制代码送入芯片里,即可以奏出音符。
此外,音符的节拍我们可以用定时器T0来控制,送入不同的初值,就可以产生不同的定时时间。
定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。
要编写的乐谱按要求以音符字节数据表的形式存放在程序中,改变乐曲就是通过改变该数据表的内容来实现的。
主程序的任务是按顺序读取数据表中的字节,根据情况调用音级子程序和音长子程序,启动定时器T0进行工作。
1、3工作原理
(1)要生产音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间.利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
(2)利用89c52的内部定时器使其工作在计数器模式MODE1下,改变计数值THO及TLO以产生不同频率的方法.
(3)例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每次计数956次时将I/O反相,就可得到中音DO(523Hz).
计数脉冲值与频率的关系公式如下:
N=Fi÷2÷Fr……………………………………………1.1
N:
计算值;Fi:
内部计时一次为1us,故其1M频率为Hz;
(4)其计数值的求法如下:
T=65536-N=65536-Fi÷2÷Fr……………………………1.2
例如:
设K=65536,F=1000000=Fi=1MHz,求低音DO(261Hz).中音DO(523Hz).高音的DO(1046Hz)的计算值.T=65536-N=65536-Fi÷2÷Fr=65536-1000000÷2÷Fr=65536-500000/Fr。
低音DO的T=65536-500000/262=63627,中音DO的T=65536-500000/523=64580,高音DO的T=65536-500000/1047=65059
(5)C调各音符频率与计数值T的对照表如下表所示.
表1.1C调各音符频率与计数值T的对照表
音符
频率(HZ)
简谱码(T值)
音符
频率(HZ)
简谱码(T值)
低1 DO
262
63628
#4FA#
740
64860
#1 DO#
277
63731
中5SO
784
64898
低2 RE
294
63835
#5SO#
831
64934
#2RE#
311
63928
中6LA
880
64968
低3M
330
64021
#6
932
64994
低4FA
349
64103
中7SI
988
65030
#4FA#
370
64185
高1DO
1046
65058
低5SO
392
64260
#1DO#
1109
65085
#5SO#
415
64331
高2RE
1175
65110
低6LA
440
64400
#2RE#
1245
65134
#6
466
64463
高3M
1318
65157
低7SI
494
64524
高4FA
1397
65178
中1DO
523
64580
#4FA#
1480
65198
#1DO#
554
64633
高5SO
1568
65217
中2RE
587
64684
#5SO#
1661
65235
#2RE#
622
64732
高6LA
1760
65252
中3M
659
64777
#6
1865
65268
中4FA
698
64820
高7SI
1967
65283
(6)每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍.如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间.假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推.所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数.
2、硬件的设计
2、1硬件系统各模块功能介绍
2、1、1单片机最小系统
图2.1时钟源电路
单片机内部具有一个高增益反相放大器,用于构成振荡器。
通常在引脚XTALl和XTAL2跨接石英晶体和两个补偿电容构成自激振荡器,结构如图2.1。
可以根据情况选择6MHz、12MHz或24MHz等频率的石英晶体,补偿电容通常选择22pF左右的瓷片电容。
2.1.2发光二极管
图2.2发光二极管
当接通电源,单片机运行时,八个二极管随着不同的调子闪烁,增加美感。
2.1.3一位数码管
图2.3一位数码管
当有键按下时,数码管会显示当前播放的曲目。
2.1.4蜂鸣器发声
图2.3蜂鸣器发声
利用单片机的P3.7口产生不同音调所对应的方波来使蜂鸣器发声,用PNP三级管来驱动。
2.1.5按键
图2.4按键
按下AGAIN键可播放重复的曲子,按下FORM键可播放上一曲,按下NEXT键可播放下一曲。
2.2电路原理图
2.2.1电路原理图
图2.5总电路图
2.3元器件清单
BillofMaterialfor音乐盒.Bom
UsedPartTypeDesignatorFootprintDescription
=========================================================
8330R1R2R3AXIAL-0.4Resistor
R4R5R6
R7R8
11KR9AXIAL-0.4Resistor
112MHZX1XTAL-1CrystalOscillator
230pFC1C2RAD-0.1Capacitor
1DIODED9LEDIN4007
8LEDD1D2D3LED
D4D5D6
D7D8
1SPEAKERLS1SIP-2
1PNPQ1S8550
3软件系统的设计
3.1软件系统各模块功能简要介绍
初始化程序:
初始化定时器
唱歌程序:
从表格中取出数据,利用中断程序产生不同频率的方波,同时调延时程序产生不同的节拍
中断程序:
定时时间到,产生方波
判键程序:
判断哪个键按下,转向相应的子程序执行相应的动作
音符表:
用于产生曲调
按键程序:
分别执行选歌,开启,重复的功能
3.2软件系统程序流程框图
Y
N
3.4软件系统程序
ORG0000H
AJMPLOOOOP
ORG000BH
AJMPTIM0
ORG001BH
RETI
ORG0023H
LOOOOP:
MOVA,#01H
LOOOP:
MOVP2,#0CH
MOVP1,A
RLA
MOVR2,#0FFH
DELAY0:
MOVR3,#0FFH
DJNZR3,$
MOVR4,#0FFH
DJNZR4,$
DJNZR2,DELAY0
JNBP3.3,START
LJMPLOOOP
START:
MOVP2,#0CH
MOVR5,#00H;初始化
MOVTMOD,#00010001B
MOVIE,#10101010B
MOVDPTR,#TAB2;装第一首歌
MOV30H,DPL;DPTR低8位送30H暂存
MOV31H,DPH;DPTR高8位送31H暂存
START1:
INCR4;产生8位随机数
MOVA,#01010101B
MOVB,R4
MULAB;8位随机数由P1口输出
MOVP1,A
MOVDPL,30H
MOVDPH,31H
MOVA,#00H
MOVCA,@A+DPTR;查表
MOVR0,A;音符数据送R0崭存
MOVA,#00H
INCDPTR
MOVCA,@A+DPTR;查表
MOVR1,A;节拍数据送R1崭存
INCDPTR
MOV30H,DPL
MOV31H,DPH
CJNEA,#01H,ELECT;一首歌没结束转ELECT
INCR5;结束歌曲计数器加1
ELECT:
JZSTART;所有歌曲结束转START循环
MOVA,R0
JNZSING
CLRTR0
SETBP3.7
LOOP1:
ACALLDELAY;调用延时子程序
DJNZR1,LOOP1
SJMPSTART1
SING:
MOVDPTR,#TAB1;音符表首址送DPTR
DECR0;计算音符
MOVA,R0
MOVB,#02H
MULAB
MOVR0,A
MOVCA,@A+DPTR;查表
MOV21H,A
INCDPTR
MOVA,R0
MOVCA,@A+DPTR
MOV20H,A
MOVTL0,20H
MOVTH0,21H
SETBTR0;开T0定时器
LOOP2:
ACALLDELAY
DJNZR1,LOOP2
AJMPSTART1
TIM0:
MOVTL0,20H
MOVTH0,21H
CPLP3.7
RETI;中断返回
DELAY:
MOVR2,#60
DELAY1:
MOVR3,#252
DJNZR3,$
JNBP3.3,AGAIN;重复正播放的曲子
JNBP3.4,FORM;上一曲开关按下转FORM
JNBP3.5,NEXT;下一曲开关按下转NEXT
DJNZR2,DELAY1
RET
AGAIN:
JNBP3.3,$;等待键释放
LJMPKEYWORK
FORM:
CLREA;关中断
JNBP3.4,$;等待键释放
CJNER5,#00H,ZERO;不是第一首歌曲转ZER0
MOVR5,#04H;是第一首将最后一首歌曲装入歌曲计数器
SJMPKEYWORK
ZERO:
DECR5;歌曲向上进一首
SJMPKEYWORK
NEXT:
CLREA
JNBP3.5,$
CJNER5,#04H,LAST
MOVR5,#00H
LJMPKEYWORK
LAST:
INCR5;歌曲下翻一首
LJMPKEYWORK
KEYWORK:
MOVDPTR,#TAB;将歌曲排列表装入DPTR
MOVA,R5;将R5的内容送A
RLA
SETBEA;开中断
JMP@A+DPTR;根据A的内容转向不同歌曲
TAB:
AJMPMUSIC2
AJMPMUSIC3
AJMPMUSIC4
AJMPMUSIC5
AJMPMUSIC6
MUSIC2:
MOVDPTR,#TAB2;第2首歌曲首址送DPTR
MOVP2,#79H
GONG:
MOV30H,DPL
MOV31H,DPH
AJMPSTART1
MUSIC3:
MOVDPTR,#TAB3
MOVP2,#24H
SJMPGONG
MUSIC4:
MOVDPTR,#TAB4
MOVP2,#30H
SJMPGONG
MUSIC5:
MOVDPTR,#TAB5
MOVP2,#19H
SJMPGONG
MUSIC6:
MOVDPTR,#TAB6
MOVP2,#12H
SJMPGONG
;********************(音符表)**********************;
TAB1:
DW64021,64185,64331,64400,64524,64632,64732
DW64777,64860,64934,64968,65030,65085,65134
DW65157,65198,65235,65252,65283,65310,65335
DW64777,64820,64898,64968,65030,65058,65110
DW65157,65178,65217,63628,63731,63835,63928
DW64103,64260,64463,64580,64633,64684,64934
DW64994,65134,65198,65268
;*********************(兰花草)***********************;
TAB4:
DW0608H,0A08H,0A08H,0A08H,0A10H,0908H,080AH,0906H
DW0808H,0708H,0620H,0D08H,0D08H,0D08H,0D08H,0D04H
DW0C08H,0A08H,0C08H,0C08H,0B08H,0A20H,0A08H,0D08H
DW0D08H,0C08H,0A10H,0908H,0808H,0908H,0808H,0708H
DW060CH,030CH,0308H,0808H,0808H,0708H,0610H,0A08H
DW090AH,0806H,0708H,0508H,0620H,0908H,0808H,0708H
DW0508H,0640H
DW0030H
;**********************(梁祝)*************************;
TAB3:
DW0A10H,0C08H,0D04H,0F08H,1004H,0D04H,0F04H,0C08H
DW1308H,1504H,1404H,1304H,1104H,1304H,1018H,1008H
DW1004H,1104H,0E08H,0D04H,0C08H,0D04H,0F08H,1008H
DW0A08H,0F08H,0D04H,0C04H,0D04H,0F04H,0C18H,1108H
DW1304H,0E08H,1008H,0D04H,0F04H,0C08H,0C10H,0A08H
DW0C02H,0A08H,0C08H,0D02H,0E04H,1004H,0D18H,0C04H
DW0D04H,0F08H,1004H,1308H,1108H,1008H,1104H,1004H
DW0F08H,0D04H,0C04H,0A10H,0F10H,0D08H,0F02H,0D04H
DW0C04H,0A04H,0C04H,0D04H,0F04H,0C38H
DW0030H
;*****************(让我们荡起双桨)*********************;
TAB2:
DW0608H,0808H,0908H,0A18H,0C08H,0A08H,0808H,0910H
DW0620H,0008H,0808H,0908H,0A08H,0C18H,0001H,0C08H
DW0D10H,0910H,0A30H,0001H,0A08H,0C08H,0D20H,0C18H
DW0D08H,0F08H,0E04H,0D04H,0C08H,0D08H,0A10H,0004H
DW0808H,0908H,0A18H,0C08H,0810H,0610H,0808H,0908H
DW0A08H,0D08H,0C30H,0010H,0A20H,0D18H,0001H,0D08H
DW0C08H,0B08H,0A10H,0001H,0920H,0A18H,0C08H,0608H
DW0808H,0910H,0010H,0808H,0908H,0A10H,0C0BH,0001H
DW0C04H,0D10H,0F10H,0E08H,0D08H,0C08H,0A08H,0D40H
DW0030H
;*********************(宁夏)****************************;
TAB5:
DW0A10H,0510H,0608H,0808H,080CH,0A08H,0A08H,0A08H
DW0A08H,0908H,0808H,080CH,0506H,050CH,0308H,0508H
DW0608H,0808H,080CH,0606H,0608H,0806H,0608H,0508H
DW0C10H,0A08H,0A08H,0908H,0808H,0908H,0A08H,0606H
DW0506H,050CH,0506H,0506H,0506H,0506H,0608H,0810H
DW0808H,0608H,0920H,0508H,0608H,0808H,0908H,0A08H
DW0C08H,0C08H,0D08H,0A08H,0910H,090CH,0808H,0608H
DW0908H,0810H,0820H,0910H,0908H,0A10H,0A0CH,0F08H
DW0A0CH,0508H,0508H,090CH,050CH,080CH,0808H,0908H
DW0A08H,0508H,050CH,0408H,0508H,0608H,0708H,0820H
DW0608H,0708H,0808H,0908H,0920H,0A0CH,0508H,0508H
DW090CH,050CH,080CH,0808H,0908H
DW0A08H,0508H,050CH,0408H,0508H,0608H,0708H,0820H
DW060CH,070CH,080CH,0908H,0808H,0730H
DW0030H
;*********************(吉大校歌)*************************;
TAB6:
DW0F10H,1310H,0A06H,0B06H,0C10H,0B06H,0904H,0A04H
DW0B06H,0D06H,0C18H,0F08H,1004H,1106H,0F04H,0F04H
DW0C06H,0C05H,0B03H,0A06H,0C06H,0906H,0904H,0A04H
DW0B06H,0D06H,0D18H,0C06H,0F05H,1003H,1110H,0A06H
DW1004H,0804H,0D10H,0D06H,1206H,1206H,1104H,1004H
DW1118H,0D06H,0D06H,1006H,1005H,1003H,1106H,1206H
DW1306H,0F06H,0F06H,1006H,0F06H,0E04H,0D04H,0C18H
DW1306H,1105H,1203H,1304H,1308H,1206H,1005H,1103H
DW1204H,1208H,1106H,0F05H,1003H,1104H,1104H,1104H
DW0D04H,0D06H,0E04H,0F04H,1106H,1005H,1003H,1004H
DW1104H,1014H,1306H,1105H,1203H,1304H,1308H,1206H
DW1005H,1103H,1204H,1208H,1106H,0F05H,1003H,1104H
DW1104H,1104H,0D04H,0D06H,0E04H,0F04H,1106H,1005H
DW1003H,1006H,1006H,1314H,1304H,1204H,1110H,1306H
DW1004H,1108H,1110H,0F18H
DW0030H
END
4、误差分析、教学建议
4.1误差分析
1.有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后发现是因为程序中有的指令书写得不规范导致的。
2.程序中的跳转指令的运用很重要,为保险起见,都用LJMP,我们就遇到过跳转指令用错程序无法正常运行的现象。
当用JNZ指令时,跳转范围比较少,这时要用一个标号中转。
3.编程时要注意,在程序开始时,要写入各定时器中断的入口地址。
4.编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。
5.程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化。
4.42设计体会
本学期学习单片机的时间只有十几周时间,对单片机的硬件设计,软件设计掌握的深度不够,但通过此次课程设计,却改变了很多,首先对于硬件电路的工作原理有了进一步的学习,同样就有了进一步的认识;其次软件方面,在程序的设计,程序的调试方面都学到了很多东西,这是第一次编写单片机的大程序,很有成就感。
在一个好的氛围里才能踏下心来做东西,在这几天课设的时间里,大家一起努力,这也是我们能完成课设的动力。
另外在编程中出现问题时,一定要戒骄戒躁,脚踏实地,认真看书,仔细分析,仔细调试,就一定会发现错误,克服困难,我们也是这么做的,这在课设中十分重要。
此次课程设计可以说是让我获益匪浅。
通过查阅了很多资料,了解了许多汇编程序的思想,扩展了自己的视野,不再仅仅局限于书本中几条简短的程序,而且更重要的是明白写程序的态度:
仔细谨慎,精益求精。
在系统加电调试中,针对一些问题,熟练掌握了根据原理分步测试,将错误之处缩小的最小范围内。
参考文献
[1]何桥,段清明,邱春玲单片机原理及应用[M]