音乐盒单片机课程.docx
《音乐盒单片机课程.docx》由会员分享,可在线阅读,更多相关《音乐盒单片机课程.docx(34页珍藏版)》请在冰豆网上搜索。
音乐盒单片机课程
目录
一、摘要4
二、设计任务4
三、方案论证4
四.音频发声知识5
五、音乐盒单路原理分析8
1、硬件原理8
2、软件程序设计12
3、程序调试13
六、结论与心得13
七、参考文献14
八、附录14
1、程序14
一、摘要
本次设计采用单片机(AT89C51)作为整个系统的控制核心。
驱动喇叭的功率管采用型号为TP122的达林顿管,使喇叭在各种频率的脉冲信号下能准确的发出各个音阶的音调。
系统通过各按键的控制,基于可靠的硬件设计和精确而稳定的软件设计,并同时能在数码管上显示当前所播放歌曲顺序的功能。
[关键字]
单片机方波显示数码管播放歌曲
二、设计任务
设计题目:
单片机音乐播放器
设计要求:
1、完成89S51的外围复位、时钟和电源等外围电路的设计,完成扬声器驱动设计。
2、根据各音阶频率算出定时器定时常数,根据节拍给出该音阶持续的时间。
3、完成音乐播放软件并完成乐谱表的翻译,最好能编写一个播放子程序用于播放。
4、播放音乐片段。
三、方案论证
设计方案:
设计中我们考虑了两种设计方案,两种设计方案中主要去区别在于硬件电路的不同,对于本设计通过模拟电路和单片机设计均可以实现,最后根据设计要求、可行性和设计成本的考虑选择了单片机设计的方案。
现在一一介绍论证如下:
采用单片机来设计电路。
此电路包括时钟电路、复位电路、音乐驱动电路和MCS-51单片机。
各部分功能如下:
(1)时钟电路:
由石英晶体振荡器产生单片机工作时所必须的时钟信号。
振荡器采用12M的晶振,使之机器周期Tcy=1us,方便发音程序的计算和编译。
(2)复位单路:
由复位按键使单片机的CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。
(3)音乐驱动电路:
由于单片机最大灌入电流为3.2mA,所以选用PNP管,并要在PNP的基极和发射极加限流电阻。
(4)显示电路:
使用单片机P0端口做显示电路,要在P0口加上拉电阻(5~10kΩ)。
还要加限流电阻,保护单片机。
(5)按键电路:
有外部中断输入和定时/计数器的外部输入都是低电平有效,可以和复位电路相视,只要将复位电路中的电容去掉即可。
四.音频发声知识
音乐程序的设计原理和程序如下:
设计原理
1总体原理:
乐曲中不同的音符,实质就是不同频率的声音。
通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。
2单片机产生不同频率脉冲信号的原理:
1)要产生音频脉冲,只要算出某一音频的脉冲(1/频率),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期的时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。
2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法如下:
例如,频率为523Hz,其周期为1/523S=1912uS,因此只要令计数器计时956uS/1us=956,在每计数956次时就将I/O反接,就可得到中音DO(532Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi/2/Fr
(N:
计数值,Fi:
内部计时一次为1uS,故其频率为1MHz(12MHz的晶振),Fr:
要产生的频率)
3其计数值的求法如下:
T=65536-N=65536-Fi/2/Fr
计算举例:
设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
4C调个音符频率与计数值T的对照表如下表所示:
表9.1 C调各音符频率与计数值T的对照表
音符频率(Hz)简谱码T值音符频率(Hz)简谱码T值
低1DO26263628#4FA#74064860
#1DO#27763731中5SO78464898
低2RE29463835#5SO#83164923
#2RE#31163928中6LA88064968
低3M33064103#693264994
低4FA34964103中7SI98865030
#4FA#37064260高1DO104665058
低5SO39264260#1DO#110965085
#5SO#41564331高2RE117565110
低6LA44064400#2RE#124565124
#646664463高3M131865157
低7SI49464524高4FA139765178
中1DO52364580#4FA#148065198
#1DO# 554 0903 高5SO 1568 0319
中2RE 578 0842 #5S0# 1661 0292
#2RE# 622 0804 高6LA 1760 0284
中3M 659 0759 #6LA# 1865 0268
中4FA 698 0716 高7SI 1976 0253
⑸每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,下表为节拍码的对照。
但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。
假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。
所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如下表为1/4和1/8节拍的时间设定。
表9.2 节拍码对照表
1/4节拍1/8节拍
节拍码节拍数节拍码节拍数
11/4拍11/8拍
22/4拍21/4拍
33/4拍33/8拍
41拍41/2拍
51又1/4拍55/8拍
61又1/2拍63/4拍
71又3/4拍77/8拍
82拍81拍
92又1/4拍91又1/8拍
A2又1/2拍A1又1/4拍
B2又3/4拍B1又3/8拍
C3拍C1又1/2拍
D3又1/4拍D1又5/8拍
E3又1/2拍E1又3/4拍
F3又3/4拍F1又7/8拍
表9.3 各调节拍的时间设定表
1/4节拍1/8节拍
曲调值DELAY曲调值DELAY
调4/4125毫秒调4/462毫秒
调3/4187毫秒调3/494毫秒
调2/4250毫秒调2/4125毫秒
5建立音乐的步骤:
1)先把吧乐谱的音符找出,然后由上表建立T值表的顺序。
2)把T值表建立在TABLE1,构成发音符的计数值放在“TABLE”。
3)简谱码(音符)为高位,节拍为(节拍数)为低4位,音符节拍码放在程序的“TABLE”处。
表9.4 简谱对应的简谱码、T值、节拍数
简谱发音简谱码T值节拍码节拍数
5低5SO16426011/4拍
6低6LA26440022/4拍
7低7SI36452433/4拍
1中1DO46458041拍
2中2RE56468451又1/4拍
3中3M66477761又2/4拍
4中4FA76482071又3/4拍
5中5SO86489882拍
6中6LA96496892又1/4拍
7中7SIA65030A2又2/4拍
1高1DOB65058B2又3/4拍
2高2REC65110C3拍
3高3MD65157D3又1/4拍
4高4FAE65178E3又2/4拍
5高5SOF65217F3又3/4拍
不发音0
五、音乐盒单路原理分析
1、硬件原理
原理分析:
(1)原理图说明:
当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。
同时启动定时器T1,显示歌曲号。
①.硬件电路中用
、
(外部中断0、1输入端P3.2P3.3)分别接S1、S2作为上、下一曲的功能键。
硬件电路中用T1(外部定时/计数器输入端P3.5)分别接S3作为暂停的功能键。
②.用P0.0-P0.7控制七段码a,b,c,d,e,f,g,Dp。
③.用P2.3口控制喇叭。
④.电路为12MHZ晶振频率工作,起振电路中C1,C2均为30pf。
(2)元件介绍
①.AT89S51元件介绍
AT89S51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
②.AT89S51引脚的排列、名称、功能和用法
AT89S51采用标准双列直插式引脚DIP-40大规模集成电路封装。
它的引引脚排列如下图所示:
AT89S51的引脚排列
引脚介绍:
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3口管脚备选功能:
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2INT0(外部中断0)
P3.3INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6WR(外部数据存储器写选通)
P3.7RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
表5元器件清单:
元器件序号
型号
主要参数
数量
备注
R1~R14
1K
14
1/4w
C1、C2
30pF
2
瓷片电容
C3
25uF
1
电解电容
Y1
12MHz
1
晶振
S1~S3
3
按钮
Q1
8550
1
PNP三极管
LS1
无源蜂鸣器
U1
AT89S51
1
单片机
2、软件程序设计
编程思路如下:
将常用的音符频率所对应的计数器初值放置在数组yin[]中,song1[]——song12[]中所放的每个字节前4位乘2表示为音符频率在数组yin[]中的位置,后4位为多少个1/4拍。
如0x34,表示音符音符频率所对应的计数器初值为yin[6]和yin[7],节拍数为1拍,即4个1/4拍。
1/4拍定时采用汇编精确定时,12首歌的选择依靠指针进行指向。
图3音乐程序流程图
图2程序总框图
3、程序调试
程序调试中出现的问题及解决的办法:
(1)有时会出现程序一点错误也没有,但就是不能正常运行的现象,最后我们发现是因为程序中有的指令书写得不规范导致的,例如有的RET返回指令一定要按正确格式书写或在两行指令间最好不要留空行。
(2)程序中的跳转指令的运用很重要,为保险起见,都用LJMP,我们就遇到过跳转指令用错程序无法正常运行的现象。
当用JNZ指令时,跳转范围比较少,这时要用一个标号中转。
(3)编程时要注意,在程序开始时,要写入各定时器中断的入口地址。
(4)编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改。
(5)编程前要加流程图,这样会使思路清晰,例如数字音乐盒的设计思路完全可以按着MP3的工作方式列写流程图。
六、结论与心得
这次这个单片机的课程设计我们完成的不太理想,我们小组两个人都是交流生,并且不是在物理学院学习,同时选课时没有认真全面的了解这门课程的安排,导致没有选上和课程配套的实验课,一个学期也就没有做过一次实验,在后来的制作过程中遇到了很多困难,所以这次这个课程设计的作品完全是在没有任何单片机制作经验甚至是没有做过任何相关电路的基础上开始的。
选题的时候其实只上了几个星期的课,对单片机能做什么或者说以我们的水平能让单片机做什么根本没有一个清晰的认识,很担心自己的选题最后做不出来,所以当时选题时的原则是尽量的简单可行,因为毕竟我们没有实验课,一学期下来必定会比物理系的同学在具体的实验方面落后不少,同时平时我们都在南新校区,与老师和同学的交流都很困难,在后来的具体制作过程中遇到什么困难几乎不可能跑到实验室去向老师请教,同时现在社会上都在大力提倡节能,于是我们打算从这点出发在我们的身边发现问题,当时我们听周围的同学说起济南的夏天白天相当的炎热,可是晚上退凉很快特别是深夜的时候温度其实已经不高了,但是同学们一般晚上睡觉都比较早,都会叫风扇一直开着最大档,可是到了深夜后已经没有必要这么强的风速了,这样一夜下来将会浪费很多电能,同时还容易把同学们吹感冒。
于是我们想能不能做一个单片机系统来解决这个问题,基于以上原因我们确定了这个方案,在最初的计划中我们还准备加入对风扇转向的控制,使之能实现人体追踪功能,不过在后来的具体设计中发现现在风扇的风扇转向控制基本都是纯机械装置,要用单片机控制比较的困难,而电子控制装置一般都出现在高端的风扇之中且价格比较昂贵,而且机械部分方面我们也无法解决。
所以最后决定放弃对转向的控制,等以后对机械方面的只是有所学习之后再做。
通过这次的课程设计作品的制作让我对单片机的理论有了更加深入的了解,同时在具体的制作过程中我们发现现在书本上的知识与实际的应用存在着不小的差距,书本上的知识很多都是理想化后的结论,忽略了很多实际的因素,或者涉及的不全面,可在实际的应用时这些是不能被忽略的,我们不得不考虑这方的问题,这让我们无法根据书上的理论就轻易得到预想中的结果,有时结果甚至很差别很大。
通过这次实践使我更深刻的体会到了理论联系实际的重要性,我们在今后的学习工作中会更加的注重实际,避免称为只会纸上谈兵的赵括。
课程设计贡献排序:
这次课程设计从最初的规划到后来的理论设计到最后的具体制作都是我们两共同完成的,实在无法区分贡献排序。
各取50%吧。
课程改革建议:
我们强烈建议将这门课程的理论学习和实验部分合并成一门,以避免想我们这种情况的再次发生。
七、参考文献
[1]许珉.单片机原理及应用[M].北京:
中国电力出版社,2007.08
[2]三恒星科技.MCS-51单片机原理与应用实例[M].北京:
电子工业出版社,2008.01
八、附录
1、程序
OUTBITP2.3;定义音频输出端口,p2.3
NEQU9;歌曲总数
OUT_NUMEQUP0;数码管显视当前所放歌曲曲数
ORG0000H
AJMPMAIN
ORG0003H
AJMPLAST_SONG;外部中断0用于接上一曲歌按键
ORG000BH
AJMPF_T0;定时器0用于定时,作音符发生器用
ORG0013H
q4:
AJMPNEXT_SONG;外部中断1接下一曲歌按键
ORG001BH
AJMPSTART_PAUSE;定时器1用计数,这里用作中断,接开始/暂停键,初值为0ffH,方式2
ORG0030H
MAIN:
MOVSP,#60H
MOVDPTR,#TABLE;DPRT指向每首歌曲的入口地址的地址。
MOVR0,#30H;R0中存入数据30H,这里在以30H开始的单元存放每首歌曲的入口地址,其中30H,31H存放
;歌曲的节拍入口地址,32H,33H存放歌曲音符入口地址,每首歌占用四个存储存单元。
MOVR5,#00H;R5中存放表TABLE中正在执行操作的序号
MOVR6,#1;R6存放正在设置入口信息的歌曲数
SET_TAB:
MOVA,R5;设置每首歌曲的入口信息,存放在以30H开始的存储单元中。
MOVCA,@A+DPTR
MOV@R0,A
INCR5
INCR0
MOVA,R5
MOVCA,@A+DPTR
MOV@R0,A
INCR5
INCR0
MOVA,R5
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCR5
MOVA,R5
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCR5
INCR6;设置完一首歌曲后,歌曲数加一
CJNER6,#N+1,SET_TAB;是否设置完,没有便继续,否则进行下面的操作
;***********************************对中断,计数器的相关参数进行设置
MOVTMOD,#61H;计数器0工作方式1,计数器1工作方式2
MOVTH1,#0FFH;给计数器1置初值0FFH,又由于是工作方式2,所以
MOVTL1,#0FFH;计数器计数为1,相当于一外部中断。
SETBET1;允许计数器1中断
SETBET0;允许计数器具0中断
CLRPT0;计数器0为低优先级
SETBPT1;计数器1为高优先级
SETBIT0;外部中断0为跳沿触发
SETBPX0;高优先级
SETBIT1;外部中断1为跳沿触发
SETBPX1;高优先级
SETBEX1;允许外部中断1中断
SETBEX0;允许外部中断定0中断
SETBEA;开中断总开关
SETBTR1;定时器1开始工作,作中断用
SETBOUT;音频输出端口初始化
;***********************************;设置结束
CLRF0;设置F0=0,用来作暂停/播放的标置位用
MOV22H,#01H;22H单元中存放正在播放的歌曲编号
MOVDPTR,#OUT_TAB;将正在播放的歌曲编号送数码管显视
MOVA,22H
MOVCA,@A+DPTR
MOVOUT_NUM,A
MOVR7,#00H;R7中存放歌曲总信息的入口地址
START0:
MOVR4,#00H;R4存放当前正在播放歌曲的第几个节拍数
MOVR0,#30H;30H开始的单元中存放歌曲的入口信息
MOVA,R7;将歌曲的节拍表的入口地址送到DPTR
ADDA,R0
MOVR0,A
MOVDPH,@R0
INCR0
MOVDPL,@R0
INCR0
MOVA,R4
INCR4
MOVCA,@A+DPTR;取出第一节拍数,其实第一个节拍不是歌曲的第一个节拍,而是表示几分音符
;****************************************************
MOV26H,A;将取出的音符数+节拍数保存在职26H单元中
NEXT:
MOVR0,#30H;开始取出歌曲的第一个数据
MOVA,R7
ADDA,R0
MOVR0,A
MOVDPH,@R0
INCR0
MOVDPL,@R0
INCR0
MOVA,R4
INCR4
MOVCA,@A+DPTR;放在A中
;****************************
JZEND0;若为0,则表示为休止符,不唱,本次音符不唱,
MOVR1,A;不为0,取出节拍数
ANLA,#0FH
MOVR2,A
MOVA,R1
SWAPA
ANLA,#0FH
JNZ