单片机课程设计报告利用蜂鸣器播放音乐.docx
- 文档编号:24333529
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:14
- 大小:171.19KB
单片机课程设计报告利用蜂鸣器播放音乐.docx
《单片机课程设计报告利用蜂鸣器播放音乐.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告利用蜂鸣器播放音乐.docx(14页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告利用蜂鸣器播放音乐
成绩
课程设计:
电子设计
题目名称:
音乐流水灯
姓名:
戴锦超
学号:
08123447
班级:
信科12-3班
完成时间:
2014年10月23日
1设计的任务
设计内容:
动手焊接一个51单片机
设计目标:
利用单片机上的蜂鸣器以及二极管实现音乐播放以及根据音乐的节奏而规律性闪亮的二极管。
并且通过程序调节音乐节奏的快慢。
2设计的过程
2.1基本结构
1.STC89C52RC
在本次的试验中采用了STC89C52RC单片机,STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期,工作电压:
5.5V~3.3V〔5V单片机〕/3.8V~2.0V〔3V单片机〕,工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz,用户应用程序空间为8K字节。
〔STC89C52RC引脚图〕
STC89C52RC单片机的工作模式:
(1)μA,可由外部中断唤醒,中断返回后,继续执行原程序
(2)空闲模式:
典型功耗2mA
(3)正常工作模式:
典型功耗4Ma~7mA
〔4〕唤醒,适用于水表、气表等电池供电系统及便携设备
2.蜂鸣器及其工作原理:
蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
本实验采用的是电磁式蜂鸣器。
蜂鸣器按其是否带有信号源又分为有源和无源两种类型。
有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。
无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。
本实验采用的是有源蜂鸣器。
〔蜂鸣器与单片机连接电路图〕
2.2软件设计过程
1.蜂鸣器发声原理
本实验由于采用有源蜂鸣器,只需将引脚端口P1^4清零,蜂鸣器即可发声;P1^4置位,蜂鸣器停止发声。
采用置1置0的方法只能使蜂鸣器发声或停止发声,想要使蜂鸣器发出声音,必须对蜂鸣器发出声音的音频和节拍进行控制。
〔音乐基础
音调:
不同音高的乐音是用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频率〔266Hz〕的一倍;同样的,高音RE的频率〔1175Hz〕刚好是中音RE的频率〔587Hz〕的一倍,中音RE的频率〔587Hz〕刚好是低音RE频率〔294Hz〕的一倍。
节拍:
节拍是让音乐具有旋律〔固定的律动〕,而且可以调节各个音的快满度。
“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。
假设1拍实0.5s,则1/4拍为0.125s。
至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。
音持续时间的长短即时值,一般用拍数表示。
休止符表示暂停发音。
〕
1)控制发声频率
要产生音频脉冲,只要算出某一音频的周期〔1/频率〕,然后将此周期除以2,即为半周期的时间。
利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
利用STC89C52RC的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0从而产生不同频率。
此外结束符和休止符可以分别用代码00H和FFH来表示,假设查表结果为0x00,则表示曲子终了;假设查表结果为0xff,则产生相应的停顿效果。
以标准音高A为例,A的频率是440Hz,周期T=1/440=2272us。
在占空比为50%的情况下,导通时间=断开时间=半周期t=2272us/2=1136us,利用P3^4端口的位操作,经过不断地反相变换即可得到标准音高A的音频脉冲。
端口导通时间与断开时的时间利用定时器实现。
具体的方法是将单片机定时器的中断触发时间设为半周期t,这样每隔半周期端口反相,输出连续的对应音高的频率。
设晶振的频率为f0,中断触发时间〔半周期〕为t,定时器工作在模式1时计数器的初值为THL,高8位为THL,低8位为TL。
时钟周期即为1/f0,定时器每一次累加用去一个机器周期,一个机器周期包含12个时钟周期,即定时器每次加一所用时间是12/f0。
定时器在模式1下计时采用16位数,最大计数为2^16-1〔65535〕,再次加一〔65536〕溢出触发中断。
根据以上分析可得如下关系:
音频对应定时器初值的高8位TH=THL/(2^8)=(65536-t*f/12)/256;
音频对应定时器初值的低8位TL=THL%(2^8)=(65536-t*f/12)%256;
附:
八度12音阶定时器初值表〔只含自然音〕
低音音名
频率Hz
晶振12MHz
中音音名
频率Hz
晶振12MHz
高音音名
频率Hz
晶振12MHz
Do
262
0xF885
Do
523
0xFC43
Do
1046
0xFE21
Re
294
0xF95A
Re
587
0xFCAD
Re
1175
0xFE56
Mi
330
0xFA13
Mi
659
0xFD0A
Mi
1318
0xFE85
Fa
349
0xFA68
Fa
698
0xFD34
Fa
1397
0xFE9A
So
392
0xFB04
So
784
0xFD82
So
1568
0xFEC1
La
440
0xFB90
La
880
0xFDC8
La
1760
0xFEE4
Si
494
0xFC0C
Si
988
0xFE06
Si
1976
0xFF03
2〕控制发声节拍
每个音符的节拍可通过延时一定的时间来实现,在具体实现时需要有一个基本的带参延时程序,用于主函数根据不同的音符调用不同的时延。
假设以十六分之一音符的时长为基本延时时间,则十六分音符只需调用一次延时程序,八分音符则需调用两次延时程序,以此类推。
*简谱编码
将简谱中的每个音符进行编码,每个音符用一个unsignedchar字符类型表示,简谱可用一个unsignedchar字符数组表示。
字符的前四位表示音频,可以表示0-f共十六个音符。
本实验中采用了中音区和高音区。
中音do-si分别编码为1~7,高音do-si分别编码为8~E,停顿编为0。
字符的后四位表示节拍,节拍以十六分音符为单位〔在本程序中为165ms〕,一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。
以0xff作为曲谱的结束标志。
程序从数组中取出一个数,然后别离出高4位得到音调,将值赋给定时器0,得到音调;接着别离出该数的低4位,得到节拍。
本实验中播放音乐使用简谱如下:
将其编码成:
ucharcodesb[]={//定义送别简谱
0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,
0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,
0x18,0x00,0x00,
0x64,0x84,0x88,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x62,0x52,
0x32,0x12,0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,
0x18,0x00,0x00,
0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,
0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,
0x18,0x00,0x00
};
2.3程序流图及说明
〔主程序流程图〕
程序代码:
#include
#defineucharunsignedchar
#defineuintunsignedint
uinta=0;//全局变量控制速度变换
sbitfm=P1^4;//蜂鸣器控制端口
sbitint0=P3^2;
sbitint1=P3^3;
uchartimeh,timel;//用于存放定时器的高8位和低8位
ucharcodesb[]={//定义送别简谱
0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00,
0x64,0x84,0x88,0x74,0x62,0x72,0x88,0x62,0x72,0x82,0x62,0x62,0x52,0x32,0x12,0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00,
0x54,0x32,0x52,0x88,0x64,0x84,0x58,0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x00,0x00,
0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,0x54,0x22,0x32,0x46,0xf2,0x18,0x00,0x00
};
//适合12M的晶振定时器初值表,高低8位分开
ucharcodechuzhi[]={
0xff,0xff,//占位
0xFC,0x43,//中央C调1-7
0xFC,0xad,
0xFd,0x0a,
0xFD,0x34,
0xFD,0x82,
0xFD,0xc8,
0xFE,0x06,
0xFe,0x21,//高音
0xFe,0x56,
0xFe,0x85,
0xFe,0x9a,
0xFe,0xc1,
0xFe,0xe4,
0xFf,0x03,
0xFc,0x0c
//0xF8,0x18,//高八度1-7
};
voidtimer0()interrupt1//定时器0中断服务程序
{
TH0=timeh;//将timeh赋给计时器的高8位
TL0=timel;//将timel赋给计时器的低8位
fm=~fm;//定时器每次到时将蜂鸣器反相
}
voiddelay(uintz)//延时165MS,即十六分音符
{uinty;
for(z;z>0;z--)
for(y=19000-a;y>0;y--);//大致时间
}
voiddelay1(uintz)//延时1MS
{uinty;
for(z;z>0;z--)
for(y=112;y>0;y--);//大致时间
}
voidmain()
{
uinttemp;//存放简谱数组中的每一个音符的临时变量
uintlightTemp;//存放音符
uchari=0;
ucharjp;//jp用于取出temp中的高8位和低8位
IT0=1;//INT0
IT1=1;//INT1
TMOD=0x01;//设置定时器T0工作于方式1
IE=0x87;//允许T0中断
while
(1)
{
temp=sb[i];
if(temp==0xff)
break;
jp=temp/16;//取数的高4位,音频数值
lightTemp=(1< P2=~lightTemp/0x100; P0=~lightTemp%0x100; if(jp! =0) { timeh=chuzhi[jp*2];//构造定时器初值高8位 timel=chuzhi[jp*2+1];//构造定时器初值低8位 TR0=1;//开定时器 } else { TR0=0;//关定时器 fm=1;//关蜂鸣器 } delay(temp%16);//取数的低4位,节拍〔音符总时延〕 TR0=0;//唱完一个音停5MS fm=1; delay1(5); i++; } TR0=0;//关定时器 fm=1;//关蜂鸣器 } voiddelay_ms(uinta){ inti,j; for(i=a;i>=0;i--) for(j=110;j>=0;j--){} } voidINT0_svr(void)interrupt0 { delay_ms(10); if(int0==0){ a+=2000; if(a>18000)a=0; } } voidINT1_svr(void)interrupt2 { delay_ms(10); if(int1==0){ a-=2000; if(a<=0)a=0;} } 3运行结果或者测试结果 测试结果: 利用蜂鸣器实现了播放音乐的功能,并有节奏的闪灭二极管,可以进行速度的变换。 到达了预期的目标,测试成功。 4遇到的问题及解决的方法 在设计的过程中主要遇到以下问题: 电脑与单片机的连接需要在电脑端安装相应的USB转串的驱动,由于我组没有使用实验室windowsxp系统,而使用的是个人电脑windows7系统,所以需要针对win7的驱动。 后来联网搜索下载相应的驱动之后解决了这一问题。 2.如何使蜂鸣器发出声音而非Be-Be声 为了解决这个问题,我们深入研究了蜂鸣器发声原理与乐谱相关的知识。 通过学习相关知识发现,不同的音符对应不同的音高,音高取决于发声频率。 所以可以通过构造不同频率的方波来使蜂鸣器发出不同频率的声音,具体实现时利用定时器计时,定时器每一次累加消耗一个机器周期,即12个时钟周期。 本实验采用晶振频率为12MHz,即定时器每一次累加消耗1us,通过设置定时器初值设定蜂鸣器取法的时间间隔,从而产生相应的音频。 每个音符不但有频率属性,还有节拍属性。 对不同节拍的控制可以采用延迟一定的时间来得到。 设置全局变量a,似的程序每循环一次就让音符的延时减一次a或加一次a,并利用中断让按键来控制。 5总结 在本次课程设计中,我们进一步加深了对小型嵌入式系统的认识。 实验初期单片机需要自己焊接,通过亲手焊接电路板,了解了如何将实验原理图转化为具体的硬件实物连接。 通过使用TN单片机开发板和STC89C52RC系统,对单片机应用开发有了初步的熟悉。 在实验的过程中,使用到了C51的编译环境KeilC和单片机通讯程序STC_ISP,两者是单片机开发所不可缺少的工具。 在具体实施的过程中,通过一一解决遇到的问题,增强了动手实践能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 报告 利用 蜂鸣器 播放 音乐