姓名:蔡晓锋 学号学院:计算机与信息工程学院 专业班级:自动化3班
论文题目:基于单片机的音乐盒设计 任课老师:赵伟志
【摘要】本设计是一个基于STC 12c5608ad 系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。使用两个按键控制音乐盒,一个用来切换歌曲,一个个用来切换8路LED 的变化花样,本音乐盒共有两首歌曲播放歌曲时,蜂鸣器发出某个音调,与之对应的LED 亮起。本设计利用KEIL 编程软件对音乐盒源程序进行编程并调试,配合PROTEUS 仿真软件对硬件进行仿真调试,节约了设计时间。
【关键字】音乐盒;STC 12c5608ad单片机; KEIL; PROTEUS;
课程设计目的
应用单片机,利用它的原理组成一个音乐播放器。本课程设计是主干实践课。课程的任务在于提高学生综合运用所学知识理论、分析解决问题的能力。
课程设计任务
∙ 以单片机为核心部件组成一个音乐播放器;
∙ 利用单片机的定时器产生乐谱的各种频率方波,由蜂鸣器发出声音 设计原理
音调的确定:
不同音高的乐音是用C 、D 、E 、F 、G 、A 、B 来表示,这7个字母就是音乐的音名,它们一般依次唱成DO 、RE 、MI 、FA 、SO 、LA 、SI, 即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以
叫“音调”,即Tone 。把C 、D 、E 、F 、G 、A 、B 这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,C –D 、D –E 、F –G 、G –A 、A –B 两音之间隔着一个黑键,他们之间的距离就是全音;E –F 、B –C 两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b 号的叫变化音。﹟叫升记号,表示把音在原来的基础上升高半音,b 叫降记音,表示在原来的基础上降低半音。例如高音DO 的频率(1046Hz )刚好是中音DO 的频率(523Hz )的一倍,中音DO 的频率(523Hz )刚好是低音DO 频率(266 Hz )的一倍;同样的,高音RE 的频率(1175Hz )刚好是中音RE 的频率(587Hz )的一倍,中音RE 的频率(587Hz )刚好是低音RE 频率(294 Hz)的一倍。
1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周
期除以2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2)利用发单片的内部定时器使其工作在计数器模式MODE1下,改变计数
值TH0及TL0以产生不同频率的方法。
此外结束符和休止符可以分别用代码00H 和FFH 来表示,若查表结果为
00H ,则表示曲子终了;若查表结果为FFH ,则产生相应的停顿效果。
3)例如频率为523Hz ,其周期T=1/523=1912us,因此只要令计数器计时
956us/1us=956,在每次技术956次时将I/O反相,就可得到中音DO (523Hz )。
计数脉冲值与频率的关系公式如下: N=Fi2Fr
N :计算值; Fi :内部计时一次为1us ,故其频率为1MHz ;
其计数值的求法如下: T=65536-N=65536-Fi2Fr
例如:设K=65536,F=1000000=Fi=1MHz,球低音DO (261Hz )。中音DO (523Hz )。高音的DO (1046Hz )的计算值
T=65536-N=65536-Fi2Fr=65536-10000002Fr=65536-500000/Fr 低音DO 的T=65536-500000/262=63627
低音DO 的T=65536-500000/523=64580 低音DO 的T=65536-500000/1047=65059
C 调各音符频率与计数值T 的对照表如下表所示。 C调各音符频率与计数值T 的对照表
节拍的确定:
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”, 即Beat ,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s ,则1/4 拍为0.125s 。至于1拍多少s ,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方
波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
表4.2节拍与节拍码对照
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,图5.2为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY ,则1拍应为4DELAY ,以此类推。所以只要求得1/4拍的DELAY 时间,其余的节拍就是它的倍数,如图5.3为1/4和1/8节拍的时间设定。
表4.3 1/4和1/8节拍的时间设定
编码:
do re mi fa so la si分别编码为1~7,重音do 编为8, 重音re 编为9,停顿编为0。播放长度以十六分音符为单位(在本程序中为165ms ),一拍即四分音符等于4个十六分音符,编为4, 其它的播放时间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff 作为曲谱的结
束标志。
举例1:音调do, 发音长度为两拍,即二分音符,将其编码为0x18。 举例2:音调re, 发音长度为半拍,即八分音符,将其编码为0x22 歌曲播放的设计。先将歌曲的简谱进行编码,储存在一个数据类型为unsigned char 的数组中。程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
表4.4 简谱对应的简谱码、T 值、节拍数
为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半因此,输出引脚在每个方波周期内要动作两次:一次升高,一次降低。即输出引脚的频率是原音频率的两倍。
方波的产生由定时器控制。定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz ,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。
这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。 音乐播放器的基本硬件电路有六部分组成:单片机、时钟与复位电路、选择按键输入电路、音频发生器、音频放大器和扬声器。
设计程序
#include
sbit speaker=P2^5;
unsigned char timer0h,timer0l,time; //生日歌
code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4, 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2, 4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4}; // 音阶频率表 高八位 code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, } ; // 音阶频率表 低八位 code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
//1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, }; void delay(unsigned char t) {
unsigned char t1; unsigned long t2; for(t1=0;t1
for(t2=0;t2
TR0=0; }
void t0int() interrupt 1 {
TR0=0;
speaker=!speaker; TH0=timer0h; TL0=timer0l; TR0=1; }
void song() {
TH0=timer0h; TL0=timer0l; TR0=1;
delay(time); }
void main(void) {
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1 EA=1;
ET0=1;//IE=0x82 //CPU开中断,CT0开中断 while(1) {
i=0;
while(i
timer0h=FREQH[k]; timer0l=FREQL[k]; time=sszymmh[i+2]; i=i+3; song(); } } }
课程设计的意义及体会
课程设计是培养学生综合运用所学知识, 发现, 提出, 分析和解决实际问题, 锻炼实践能力的重要环节, 是对学生实际工作能力的具体训练和考察过程. 随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。 回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近四星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不
好……通过这次课程设计之后,一定把以前所学过的知识重新温故。 通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。
姓名:蔡晓锋 学号学院:计算机与信息工程学院 专业班级:自动化3班
论文题目:基于单片机的音乐盒设计 任课老师:赵伟志
【摘要】本设计是一个基于STC 12c5608ad 系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能音乐盒。该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。使用两个按键控制音乐盒,一个用来切换歌曲,一个个用来切换8路LED 的变化花样,本音乐盒共有两首歌曲播放歌曲时,蜂鸣器发出某个音调,与之对应的LED 亮起。本设计利用KEIL 编程软件对音乐盒源程序进行编程并调试,配合PROTEUS 仿真软件对硬件进行仿真调试,节约了设计时间。
【关键字】音乐盒;STC 12c5608ad单片机; KEIL; PROTEUS;
课程设计目的
应用单片机,利用它的原理组成一个音乐播放器。本课程设计是主干实践课。课程的任务在于提高学生综合运用所学知识理论、分析解决问题的能力。
课程设计任务
∙ 以单片机为核心部件组成一个音乐播放器;
∙ 利用单片机的定时器产生乐谱的各种频率方波,由蜂鸣器发出声音 设计原理
音调的确定:
不同音高的乐音是用C 、D 、E 、F 、G 、A 、B 来表示,这7个字母就是音乐的音名,它们一般依次唱成DO 、RE 、MI 、FA 、SO 、LA 、SI, 即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以
叫“音调”,即Tone 。把C 、D 、E 、F 、G 、A 、B 这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,C –D 、D –E 、F –G 、G –A 、A –B 两音之间隔着一个黑键,他们之间的距离就是全音;E –F 、B –C 两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b 号的叫变化音。﹟叫升记号,表示把音在原来的基础上升高半音,b 叫降记音,表示在原来的基础上降低半音。例如高音DO 的频率(1046Hz )刚好是中音DO 的频率(523Hz )的一倍,中音DO 的频率(523Hz )刚好是低音DO 频率(266 Hz )的一倍;同样的,高音RE 的频率(1175Hz )刚好是中音RE 的频率(587Hz )的一倍,中音RE 的频率(587Hz )刚好是低音RE 频率(294 Hz)的一倍。
1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周
期除以2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2)利用发单片的内部定时器使其工作在计数器模式MODE1下,改变计数
值TH0及TL0以产生不同频率的方法。
此外结束符和休止符可以分别用代码00H 和FFH 来表示,若查表结果为
00H ,则表示曲子终了;若查表结果为FFH ,则产生相应的停顿效果。
3)例如频率为523Hz ,其周期T=1/523=1912us,因此只要令计数器计时
956us/1us=956,在每次技术956次时将I/O反相,就可得到中音DO (523Hz )。
计数脉冲值与频率的关系公式如下: N=Fi2Fr
N :计算值; Fi :内部计时一次为1us ,故其频率为1MHz ;
其计数值的求法如下: T=65536-N=65536-Fi2Fr
例如:设K=65536,F=1000000=Fi=1MHz,球低音DO (261Hz )。中音DO (523Hz )。高音的DO (1046Hz )的计算值
T=65536-N=65536-Fi2Fr=65536-10000002Fr=65536-500000/Fr 低音DO 的T=65536-500000/262=63627
低音DO 的T=65536-500000/523=64580 低音DO 的T=65536-500000/1047=65059
C 调各音符频率与计数值T 的对照表如下表所示。 C调各音符频率与计数值T 的对照表
节拍的确定:
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”, 即Beat ,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s ,则1/4 拍为0.125s 。至于1拍多少s ,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方
波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。
表4.2节拍与节拍码对照
每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,图5.2为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY ,则1拍应为4DELAY ,以此类推。所以只要求得1/4拍的DELAY 时间,其余的节拍就是它的倍数,如图5.3为1/4和1/8节拍的时间设定。
表4.3 1/4和1/8节拍的时间设定
编码:
do re mi fa so la si分别编码为1~7,重音do 编为8, 重音re 编为9,停顿编为0。播放长度以十六分音符为单位(在本程序中为165ms ),一拍即四分音符等于4个十六分音符,编为4, 其它的播放时间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff 作为曲谱的结
束标志。
举例1:音调do, 发音长度为两拍,即二分音符,将其编码为0x18。 举例2:音调re, 发音长度为半拍,即八分音符,将其编码为0x22 歌曲播放的设计。先将歌曲的简谱进行编码,储存在一个数据类型为unsigned char 的数组中。程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
表4.4 简谱对应的简谱码、T 值、节拍数
为简便起见,以一定的频率方波产生的音在其每个周期内高低幅值得时间各占一半因此,输出引脚在每个方波周期内要动作两次:一次升高,一次降低。即输出引脚的频率是原音频率的两倍。
方波的产生由定时器控制。定时器T0工作在定时方式1,改变TH0及TL0,产生不同的音频频率。必须考虑到中断响应时间的影响,尤其在高音部分,若忽略中断响应时间,会使音频频率比标准值低几十Hz ,相当于1/4音程,很容易听出来,对低音部分影响不大。一般中断响应时间为3~6个机器周期,经过反复试验取5个机器周期作为校正最为恰当,表1中所给的定时初值就是考虑中断响应后的定时常数。另外,为避免T1中断可能引起杂音,应将定时器T0中断设为高优先级。
这样编写出来的程序播放的音与标准音叉进行差频校音,非常准确和谐。 音乐播放器的基本硬件电路有六部分组成:单片机、时钟与复位电路、选择按键输入电路、音频发生器、音频放大器和扬声器。
设计程序
#include
sbit speaker=P2^5;
unsigned char timer0h,timer0l,time; //生日歌
code unsigned char sszymmh[]={5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4, 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,
5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2, 4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4}; // 音阶频率表 高八位 code unsigned char FREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, } ; // 音阶频率表 低八位 code unsigned char FREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
//1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, }; void delay(unsigned char t) {
unsigned char t1; unsigned long t2; for(t1=0;t1
for(t2=0;t2
TR0=0; }
void t0int() interrupt 1 {
TR0=0;
speaker=!speaker; TH0=timer0h; TL0=timer0l; TR0=1; }
void song() {
TH0=timer0h; TL0=timer0l; TR0=1;
delay(time); }
void main(void) {
unsigned char k,i;
TMOD=1; //置CT0定时工作方式1 EA=1;
ET0=1;//IE=0x82 //CPU开中断,CT0开中断 while(1) {
i=0;
while(i
timer0h=FREQH[k]; timer0l=FREQL[k]; time=sszymmh[i+2]; i=i+3; song(); } } }
课程设计的意义及体会
课程设计是培养学生综合运用所学知识, 发现, 提出, 分析和解决实际问题, 锻炼实践能力的重要环节, 是对学生实际工作能力的具体训练和考察过程. 随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。 回顾起此次单片机课程设计,我仍感慨颇多,的确,从选题到定稿,从理论到实践,在接近四星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不
好……通过这次课程设计之后,一定把以前所学过的知识重新温故。 通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。