文档库 最新最全的文档下载
当前位置:文档库 › 单片机课程设计报告(利用蜂鸣器播放音乐)

单片机课程设计报告(利用蜂鸣器播放音乐)

单片机课程设计报告(利用蜂鸣器播放音乐)
单片机课程设计报告(利用蜂鸣器播放音乐)

课程设计:嵌入式系统应用

题目名称:利用蜂鸣器实现音乐播放功能

姓名:

学号:

班级:

完成时间:

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)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序(2)空闲模式:典型功耗2mA

(3)正常工作模式:典型功耗4Ma~7mA

(4)唤醒,适用于水表、气表等电池供电系统及便携设备

2.蜂鸣器及其工作原理:

蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。

接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

本实验采用的是电磁式蜂鸣器。

蜂鸣器按其是否带有信号源又分为有源和无源两种类型。有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。

本实验采用的是有源蜂鸣器。

(蜂鸣器与单片机连接电路图)

2.2 软件设计过程

1.蜂鸣器发声原理

本实验由于采用有源蜂鸣器,只需将引脚端口P3^4清零,蜂鸣器即可发声;P3^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频率(266 Hz)的一倍;同样的,高

音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音

RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。

节拍:

节拍是让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即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

晶振

11.0592

MHz

中音音

频率Hz 晶振

12MHz

晶振

11.0592

MHz

高音音

频率Hz 晶振

12MHz

晶振

11.0592

MHz

Do 262 0xF885 0xF91B Do 523 0xFC43 0xFC8E Do 1046 0xFE21 0xFE47

Re 294 0xF95A 0xF9DF Re 587 0xFCAD 0xFCED Re 1175 0xFE56 0xFE76 Mi 330 0xFA13 0xFA8A Mi 659 0xFD0A 0xFD43 Mi 1318 0xFE85 0xFEA1

Fa 349 0xFA68 0xFAD8 Fa 698 0xFD34 0xFD6A Fa 1397 0xFE9A 0xFEC7 So 392 0xFB04 0xFB68 So 784 0xFD82 0xFDB3 So 1568 0xFEC1 0xFED9 La 440 0xFB90 0xFBE9 La 880 0xFDC8 0xFDF3 La 1760 0xFEE4 0xFEF9

Si 494 0xFC0C 0xFC5B Si 988 0xFE06 0xFE2D Si 1976 0xFF03 0xFF16

2)控制发声节拍

每个音符的节拍可通过延时一定的时间来实现,在具体实现时需要有一个基本的带参延时程序,用于主函数根据不同的音符调用不同的时

延。若以十六分之一音符的时长为基本延时时间,则十六分音符只需调

用一次延时程序,八分音符则需调用两次延时程序,以此类推。

3)简谱及其编码

○1音符

音符用数字1至7表示。这7个数字就等于大调的自然音阶。如果是C大调,加上音名,就会是这样:

○2八度

如果是高一个八度,就会在数字上方加上一点。如果是低一个八度,就会数字下方加上一点。在中间的那一个八度就什么也不用加。如果要

再高一个八度,就在上方垂直加上两点(如:);要再低一个八度,就在

下方垂直加上两点(如:),如此类推。见下表所示:

大调... ...

小调... ...

○3音长

通常只有数字的是四分音符。数字下加一条横线,就可令四分音符的长度减半,即成为八分音符;两条横线可令八分音符的长度减半,即

成为十六分音符,余此类推;简单来説,下加横綫数目与五綫谱的符尾

数目相对应。数字后方的横线延长音符,每加一条横线延长一个四分音

符的长度。正如五綫谱的附点一样,数字后方加一点会将音符长度增加

一半。

○4休止符

休止符用“0”来表示。比四分休止符长,就只需在每一个四分休止符再多加一个“0”,不需在后方加上横线。若整个小节均是休止状态的话,

就在每个四分音符加一个“0”,就像是3拍4就写成“| 0 0 0 |”,而4拍4

就写成“| 0 0 0 0 |”。

○5无音高音符

就像敲击乐的乐器那样是没有音高的,这时,简谱就需要用“X”或“x”

表达。例如啦啦队拍手时,简谱上就需如此表达:

4/4 > >

拍手:| X X X X X | X X X X 0 X X ||

○6小节线

正如五綫谱一样,小节与小节之间以纵綫(称小节线)分隔,乐曲终止以一粗一细的直綫表示(但是一般不分粗细);重复乐段以纵綫后两点表示

开始,纵綫前两点表示终止。

○7拍号

拍号的表达方式为:“2/4”、“3/4”、“4/4”、“6/8”等等。拍号一般都是置于调号的后方。

○8变调与调号

表示调号有两种方法:可以直接写“C调”,“C小调”或“Key: C”,“Key: Cm”。亦可写清楚主音代表哪一个音,例如1=C,就是C大调(大调以1

为主音)。6=C就是C小调(小调以6为主音)。2=D就是D多利安调(多

利安调以2为主音)。五线谱有升降号,简谱同样有升降号。在简谱中,

若需表达升降号,就把符号加在数字1至7的前方,让该音升高或降低。

若要把升降号加在调号跟和弦CDEFGAB七个字母,就须加在它们的后方。

在五綫谱中,C小调要把B-E-A三个音降低半音。所以表达它的和声小调

时,就会把一个还原号放在B?前面。简谱就一定得写?5,因为5不能

下降。

○9延音线、圆滑线与其他音乐符号

简谱延音线(Tie)跟圆滑綫(slur)都是跟五线谱相同,一定得置在数字上方。表达跳音(staccato)时需要特别小心,因为很容易会跟低八

度的那一点混淆,因此在表达跳音时把那一点写得粗点及低点。

*简谱编码

将简谱中的每个音符进行编码,每个音符用一个unsigned char字符类型表示,简谱可用一个unsigned char字符数组表示。字符的前四位表示音频,可以表示0-f共十六个音符。本实验中采用了中音区和高音区。中音do-si分别编码为1~7,高音do-si分别编码为8~E,停顿编为0。字符的后四位表示节拍,节拍以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。以0xff作为曲谱的结束标志。程序从数组中取出一个数,然后分离出高4位得到音调,将值赋给定时器0,得到音调;接着分离出该数的低4位,得到节拍。

本实验中播放音乐使用简谱如下:

将其编码成:

uchar code zbjbxf[]={

0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,0xA1,0x91,0xA1,0x81,0x64,0x A3,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,0xA1,0xC1,0xA1,0xC1,0xD2,0xD2,0xD2,0xA2,0x C4,0xC2,0x62,0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,0x92,0x81,0x91,0xA2,0xC2,0xD4 ,0xE4,0xA4,0xE4,0xA2,0xE2,0xA2,0xE2,0xA2,0xA2,0x84,0x94,0x94,0x92,0x81,0x91,0x A2,0xC2,0xD8};

2.3 程序流图及说明

(主程序流程图)

程序代码:

#include

#define uchar unsigned char

#define uint unsigned int

sbit fm=P3^4;//蜂鸣器控制端口

uchar timeh,timel;//用于存放定时器的高8位和低8位uchar code zbjbxf[]={//定义猪八戒背媳妇的简谱数组

0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,0xA1, 0x91,0xA1,0x81,0x64,0xA3,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4, 0xA1,0xC1,0xA1,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,0xC2,0x62, 0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,0x92,0x81,0x91,

0xA2,0xC2,0xD4,0xE4,0xA4,0xE4,0xA2,0xE2,0xA2,0xE2,0xA2, 0xA2,0x84,0x94,0x94,0x92,0x81,0x91,0xA2,0xC2,0xD8};

//适合12M的晶振定时器初值表,高低8位分开

uchar code chuzhi[]={

0xff,0xff,//占位

0xFC,0x8E,//中央C调1-7

0xFC,0xED,

0xFD,0x43,

0xFD,0x6A,

0xFD,0xB3,

0xFD,0xF3,

0xFE,0x2D,

0xFE,0x47,//高八度1-7

0xFE,0x76,

0xFE,0xA1,

0xFE,0xC7,

0xFE,0xD9,

0xFE,0xF9,

0xFF,0x16

};

void timer0() interrupt 1 //定时器0中断服务程序

{

TH0=timeh; //将timeh赋给计时器的高8位

TL0=timel; //将timel赋给计时器的低8位

fm=~fm; //定时器每次到时将蜂鸣器反相

}

void delay(uint z) //延时165MS,即十六分音符

{ uint y;

for(z;z>0;z--)

for(y=19000;y>0;y--);//大致时间

}

void delay1(uint z) //延时1MS

{ uint y;

for(z;z>0;z--)

for(y=112;y>0;y--);//大致时间

}

void main()

{

uint temp; //存放简谱数组中的每一个音符的临时变量uchar i=0;

uchar jp; //jp用于取出temp中的高8位和低8位

TMOD=0x01;//设置定时器T0工作于方式1

IE=0x82; //允许T0中断

while(1)

{

temp=zbjbxf[i];

if(temp==0xff)

break;

jp=temp/16; //取数的高4位,音频数值

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);

//TR0=1;

i++;

}

TR0=0; //关定时器

fm=1; //关蜂鸣器

}

3 运行结果或者测试结果

测试结果:利用蜂鸣器实现了播放音乐的功能,达到了预期的目标,测试成功。

4 遇到的问题及解决的方法

在设计的过程中主要遇到以下问题:

1.计算机与单片机的连接不上问题

计算机与单片机的连接需要在电脑端安装相应的USB转串的驱动,由于我组没有使用实验室windows xp系统,而使用的是个人计算机windows 7系统,所以需要针对win 7 的驱动。后来联网搜索下载相应的驱动之后解决了这一问题。

2.如何使蜂鸣器发出声音而非Be-Be声

为了解决这个问题,我们深入研究了蜂鸣器发声原理与乐谱相关的知识。通过学习相关知识发现,不同的音符对应不同的音高,音高取决于发声频率。所以可以通过构造不同频率的方波来使蜂鸣器发出不同频率的声音,具体实现时利用定时器计时,定时器每一次累加消耗一个机器周期,即12个时钟周期。本实验采用晶振频率为12MHz,即定时器每一次累加消耗1us,通过设置定时器初值设定蜂鸣器取法的时间间隔,从而产生相应的音频。

每个音符不但有频率属性,还有节拍属性。对不同节拍的控制可以采用延迟一定的时间来得到。

5 总结

在本次课程设计中,我们进一步加深了对小型嵌入式系统的认识。实验初期单片机需要自己焊接,通过亲手焊接电路板,了解了如何将实验原理图转化为具体的硬件实物连接。通过使用TN单片机开发板和STC89C52RC系统,对单片机应用开发有了初步的熟悉。在实验的过程中,使用到了C51的编译环境Keil C和单片机通讯程序STC_ISP,两者是单片机开发所不可缺少的工具。在具体实施的过程中,通过一一解决遇到的问题,增强了动手实践能力。

蜂鸣器唱两只老虎单片机程序

#include<> //包含52单片机寄存器定义的头文件 sbit sound=P3^7; //将sound位定义为 unsigned int C; //储存定时器的定时常数 //以下是C调中音的音频宏定义 #define dao 523 //将"dao"宏定义为中音"1"的频率523Hz #define re 587 //将"re"宏定义为中音"2"的频率587Hz #define mi 659 //将"mi"宏定义为中音"3"的频率659Hz #define fa 698 //将"fa"宏定义为中音"4"的频率698Hz #define sao 784 //将"sao"宏定义为中音"5"的频率784Hz #define la 880 //将"la"宏定义为中音"6"的频率880Hz #define xi 987 //将"xi"宏定义为中音"7"的频率523Hz /******************************************* 函数功能:1个延时单位,延时200ms ******************************************/ void delay() { unsigned char i,j; for(i=0;i<250;i++) for(j=0;j<250;j++) ; } /******************************************* 函数功能:主函数 ******************************************/ void main(void) { unsigned char i,j; //以下是《两只老虎》歌曲 unsigned int code f[]={dao,re,mi,dao, //每行对应一小节音符 dao,re,mi,dao, mi,fa,sao, mi,fa,sao, sao,la,sao,fa,mi,dao, sao,la,sao,fa,mi,dao, dao,sao,dao, dao,sao,dao, 0xff}; //以0xff作为音符的结束标志 //以下是简谱中每个音符的节拍 //"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位unsigned char code JP[ ]={2,2,2,2, 2,2,2,2, 2,2,3, 2,2,3,

蜂鸣器歌唱原理以及代码

3.3 蜂鸣器播放歌曲原理 一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。 1)音调的确定 音调就是我们常说的音高。它是由频率来确定的!我们可以查出各个音符所对应的相应的频率,那么现在就需要我们来用51来发出相应频率的声音!我们常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。 2)节拍的确定 一般说来,如果乐曲没有特殊说明,一拍的时长大约为400—500ms 。 3.3 蜂鸣器播放歌曲程序 #include sbit speaker = P1^5; //定义蜂鸣器端口 unsigned char timer0h, timer0l, time; //-------------------------------------- //单片机晶振采用11.0592MHz

// 频率-半周期数据表高八位本软件共保存了四个八度的28个频率数据code unsigned char FREQH[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567 // 频率-半周期数据表低八位 code unsigned char FREQL[] = { 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567 //-------------------------------------- //世上只有妈妈好数据表要想演奏不同的乐曲, 只需要修改这个数据表 code unsigned char sszymmh[] = { 6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。 //6, 2, 3 分别代表:啦, 中音, 3个半拍; //5, 2, 1 分别代表:嗦, 中音, 1个半拍; //3, 2, 2 分别代表:咪, 中音, 2个半拍; //5, 2, 2 分别代表:嗦, 中音, 2个半拍; //1, 3, 2 分别代表:哆, 高音, 2个半拍; 6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1, 6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2, 5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1, 2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0}; //-------------------------------------- void t0int() interrupt 1 //T0中断程序,控制发音的音调 { TR0 = 0; //先关闭T0 speaker = !speaker; //输出方波, 发音 TH0 = timer0h; //下次的中断时间, 这个时间, 控制音调高低 TL0 = timer0l; TR0 = 1; //启动T0 } //-------------------------------------- void delay(unsigned char t) //延时程序,控制发音的时间长度 { unsigned char t1; unsigned long t2;

单片机蜂鸣器播放音乐

#include #define uchar unsigned char #define uint unsigned int sbit speaker = P1^7; uint j; uchar m=1; uchar flag; uchar line; uchar code * data song; // 休止符低6 低7 中1 中2 中3 中4 中5 中 6 中7 高 1 低 3 低 5 低 4 高3 uchar code yin[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,0x34,0xF D,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85}; uchar code song1[97]={0x34,0x32,0x32,0x34,0x42,0x51, //<<干杯,朋友>> 0x62,0x52,0x42,0x32,0x34,0x04, 0x74,0x74,0x62,0x62,0x64, 0x3c,0x04, 0x64,0x62,0x52,0x42,0x32,0x34, 0x33,0x31,0x32,0x72,0x76,0x72, 0x83,0x81,0x82,0x82,0x82,0x74,0x72, 0x7c,0x04, 0x63,0x61,0x62,0x62,0x64,0x72,0x82, 0x72,0x74,0x72,0x62,0x52,0x42,0x32, 0x42,0x44,0x42,0x42,0x52,0x62,0x52, 0x5c,0x04, 0x64,0x62,0x62,0x64,0x72,0x82, 0x72,0x74,0x72,0x62,0x52,0x42,0x32, 0x42,0x46,0x53,0x41,0x42,0x32, 0x3c,0x04, 0x44,0x48,0x02,0x32, 0x3f, 0x44,0x48,0x02,0x32, 0x3f, 0x34,0x0c, 0xFF}; uchar code song2[46]={0x12,0x52,0x52,0x52,0x56,0x42, //<<兰花草>>

单片机按键控制蜂鸣器发声程序

#include typedef unsigned char uint8; typedef unsigned int uint16; uint8 Count,i; sbit Speak =P1A2; //蜂鸣器器控制脚 sbit keyl =卩3人2;〃按键控制引脚 sbit key2 =P3A3; sbit key3 =P3A4; /* 以下数组是音符编码 */ uint8 code SONG[] ={ 0xff,0x39,0x30,0x33,0x30,0xff,0x30,0x30,0x00,}; void Time0_Init()// 定时器 T0 方式 1 ,定时 10ms { TMOD = 0x01; IE = 0x82; TH0 = 0xDC; TL0 = 0x00; void Time0_Int() interrupt 1 { TH0 = 0xDC; TL0 = 0x00; Count++; } void delay (uint8 k)// 按键防抖延时 { uint8 j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } void Delay_xMs(uint8 x)// 发声延时 { uint8 i,j; for(i=0; i

Count = 0; // 中断计数器清 0 Addr = i *3; while(1) { Temp1 = SONG[Addr++]; if (Temp1 == 0xFF) //休止符 { TR0 = 0; Delay_xMs(100); } else if (Temp1 == 0x00) //歌曲结束符 { return; } else { Temp2 = SONG[Addr++]; TR0 = 1; while(1) { Speak = ~Speak; Delay_xMs(Temp1); if(Temp2 == Count) { Count = 0; break; } } } } }void keyscan (void)// 按键切换声音函数{ if(key1==0) { delay(10); if(key1==0) {

51单片机蜂鸣器播放音乐代码

/*生日快乐歌曲*/ #include <> #define uint unsigned int #define uchar unsigned char sbit beep = P1^5; uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159, 212,212,106,126,159,169,190,119,119,126,159,142,159,0}; uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0}; //延时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } void PlayMusic() { uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG 为拍子长度 for(j=0;j // 这是单片机音乐代码生成器生成的代码 #define uchar unsigned char sbit beepIO=P1^5; // 输出为可以修改成其它 IO 口uchar m,n;

单片机课程设计报告(利用蜂鸣器播放音乐)

课程设计:电子设计 题目名称:音乐流水灯 姓名:戴锦超 学号: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)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序 (2)空闲模式:典型功耗2mA (3)正常工作模式:典型功耗4Ma~7mA (4)唤醒,适用于水表、气表等电池供电系统及便携设备 2.蜂鸣器及其工作原理: 蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。本实验采用的是电磁式 蜂鸣器。

蜂鸣器按其是否带有信号源又分为有源和无源两种类型。 有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。无源 蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。本实验采用的是有源蜂鸣器。 (蜂鸣器与单片机连接电路图) 2.2 软件设计过程 1.蜂鸣器发声原理 本实验由于采用有源蜂鸣器,只需将引脚端口P1^4清

单片机 利用蜂鸣器演奏音乐

实验三-利用蜂鸣器演奏音乐 一、实验目的 1.了解BlueSkyC51单片机实验板中蜂鸣器的硬件电路 2.学会利用蜂鸣器实现音乐的演奏 3.掌握蜂鸣器实现音乐演奏的编程 二、实验硬件设计及电路 1. BlueSkyC51单片机实验板 ` 2.单片机最小系统

。 3.蜂鸣器电路连接 三极管主要是做驱动用的。因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以

我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。 三、实验原理 1.音调及节拍 用一个口,输出方波,这个方波输入进蜂鸣器就会产生声音,通过控制方波的频率、时间,就能产生简单的音乐。一般说来,单片机演奏音乐基本都是单音频率,因此单片机奏乐只需控制音调和节拍。 (1)音调的确定 音调是由频率来确定的。通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O 口来回取反,从而让蜂鸣器发出不同频率的声音。只需将定时器给以不同的定时值就可实现。通过延时,即可发出所需要的频率。 … (2)节拍的确定 一拍的时长大约为400—500ms,每个音符的时长通过节拍来计算。详细见程序代码。 2.软件设计相关 (1)头文件 #include<> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long sbit beep=P1^4; 译实验相关问题 ; (1)实际发音颤音重 解决方法为修改蜂鸣器的驱动频率. (2)实际节奏过快或者过慢 调整延时 四、C51程序代码(部分来源于网络) #include<> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long ~ sbit beep=P1^4; //蜂鸣器与口连接 uchar th0_f; //中断装载T0高8位 uchar tl0_f; //T0低8位 uchar code freq[36*2]={ //音阶码表 0xf7,0xd8, //440hz , 1 //0 0xf8,0x50, //466hz , 1# //1

单片机按键控制蜂鸣器发声程序

#include typedef unsigned char uint8; typedef unsigned int uint16; uint8 Count,i; sbit Speak =P1^2; //蜂鸣器器控制脚 sbit key1 =P3^2;//按键控制引脚 sbit key2 =P3^3; sbit key3 =P3^4; /*以下数组是音符编码*/ uint8 code SONG[] ={ 0xff,0x39,0x30,0x33,0x30,0xff,0x30,0x30,0x00,}; void Time0_Init()//定时器T0方式1,定时10ms { T MOD = 0x01; I E = 0x82; T H0 = 0xDC; T L0 = 0x00; } void Time0_Int() interrupt 1 { T H0 = 0xDC; T L0 = 0x00; C ount++; } void delay (uint8 k)//按键防抖延时 { u int8 j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } void Delay_xMs(uint8 x)//发声延时 { uint8 i,j; for(i=0; i

} void Play_Song(uint8 i)//蜂鸣器发声函数 { uint8 Temp1,Temp2; u int8 Addr; C ount = 0; //中断计数器清0 A ddr = i *3; w hile(1) { Temp1 = SONG[Addr++]; if (Temp1 == 0xFF) //休止符 { TR0 = 0; Delay_xMs(100); } else if (Temp1 == 0x00) //歌曲结束符 { return; } else { Temp2 = SONG[Addr++]; TR0 = 1; while(1) { Speak = ~Speak; Delay_xMs(Temp1); if(Temp2 == Count) { Count = 0; break; } } } } } void keyscan (void)//按键切换声音函数 { i f(key1==0) { delay(10); if(key1==0) {

单片机控制蜂鸣器概要

单片机控制蜂鸣器20年月日

目录 绪论 (1) 1、硬件设计 (2) 1.1 总体设计图 (2) 1.2 简易结构框图 (2) 1.3各部分硬件设计及功能 (3) 1.3.1 蜂鸣器发声电路:(如图1.3.1) (3) 1.3.2 电源稳压电路: (4) 1.4 元件清单 (4) 2、软件设计 (5) 2.1设计思想 (5) 2.2 程序流程图 (5) 2.3 音调、节拍以及编码的确定方法 (6) 2.3.1音调的确定 (6) 2.3.2 节拍的确定 (8) 2.3.3 编码 (9) 3、电路仿真与分析 (10) 4、电路板焊接、调试 (11) 4.1 焊接 (11) 4.2 调试 (12) 5、讨论及进一步研究建议 (12) 6、心得 (12) 7、单片机音乐播放器程序实例(卡农) (13)

绪论 蜂鸣器播放音乐电路设计对于单片机初学者来说是一个简单易实现的课题。通过编写程序使单片机产生一定频率的方波信号,方波信号进入蜂鸣器便产生我们熟知的音调。 我们用定时/计数器使单片机产生方波,利用定时/计数器使输出管脚在一定周期内反复翻转,达到所需频率,而我们给定时/计数器的初始值就是我们的音符—半周期数据表,通过我们播放的音乐的乐谱,来对数据表进行调用。 我们用延时子程序来表示节拍,不同的节拍代表不同的延时。 完成此次设计之后完全可以进行扩展,例如增加按键以及LED灯光效果,制成一个简易的音乐盒,给人以视觉听觉等全方位的享受。

1、硬件设计1.1 总体设计图 1.2 简易结构框图

1.3各部分硬件设计及功能 1.3.1 蜂鸣器发声电路:(如图1.3.1) 图1.3.1 如图所示,蜂鸣器发声电路是播放音乐电路的主要执行电路,它由一个蜂鸣器,一个三极管和一个电位器组成。蜂鸣器负责发声,三极管将电流放大,而电位器则控制流过蜂鸣器电流的大小,来达到控制音量的目的。

Arduino控制蜂鸣器播放音乐设计说明书

目录 一、新媒体装置艺术 1、作品原理介绍 (1) 2、作品设计的意义 (1) 3、作品的主要内容 (1) 4、制作方法和流程 (1) 5、成果 (9) 6、价值和影响 (9) 7、创新点 (10) 二、结论 8、技术方面 (10) 9、艺术方面 (10) 10、不足及展望 (11) 11、谢辞 (11)

设计说明书 一、作品原理介绍: 能感应到物体靠近并且低于50CM时,蜂鸣器发出音乐,并且小灯泡随着音乐节奏变化。 二、作品设计意义: 将它应用到图书馆或者购物的地方,当人们靠近的时间能只能朗读出这一栏或者这一块区域有什么东西,能够更加让人们更快速的找到自己需要的东西,很大程度上节约的时间!也可以应用到车上,当开车的人快要和前面或者后面的物体撞上的时候,会发出声音来提醒你,从而给生命和财产加上保护套。 三、作品主要内容: 1、Arduino控制蜂鸣器播放音乐、小灯泡。 2、小灯泡跟随蜂鸣器的音乐节奏变化。 3、当物体离超声波低于50CM时发出指令,控制蜂鸣器、 小灯泡。 四、制作方法和流程: adruinouno一块(其他Arduino板子也可,注意引脚就行),面保线若干条,蜂鸣器或小喇叭一个。 原理: 首先讲下简单的乐理知识,知道音乐是怎么演奏出来的自然就可以通过代码来进行编排了。

1.演奏单音符的原理 一首音乐由若干音符组成,每一个音符唯一对应一个频率。如果我们知道了音符相对应的频率,再让 Arduino 按照这个频率输出到蜂鸣器或喇叭,蜂鸣器或喇叭就会发出相应频率下的声音。 Arduino官方网站给出了不同音符对应的不同频率的头文件,具体请见下文介绍。 2.音符演奏的持续时间 每个音符都会播放一定的时间,这样才能构成一首优美的曲子,而不是每个音符都播放一样长的时间。如何确定每个音符演奏的单位时间呢?我们知道,音符节奏分为1拍、1/2拍、1/4拍、1/8拍等等,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,所以我们可以为每个音符赋予这样的拍子播放出来,音乐就成了。 制作过程:所需硬件:Arduino板子一块,小型扬声器/蜂鸣器一个,导线两根。如果扬声器声音太大,也可适当配置220欧姆电阻一个与扬声器串联。 我们将扬声器一端串联电阻后接到数字6接口,另一端接地(GND)。数字接口可以自己选择,只是在代码中要对应修改一下。 函数的参数说明: pin: 你要接扬声器的接口,是整数(int 型) frequency:频率,是一个整数(int 型) duration: 音符持续的时间,是毫秒值,无符号长整型

单片机课程设计报告利用蜂鸣器播放音乐

课程设计:嵌入式系统应用 题目名称:利用蜂鸣器实现音乐播放功能 姓名: 学号: 班级: 完成时间:

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)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序(2)空闲模式:典型功耗2mA (3)正常工作模式:典型功耗4Ma~7mA (4)唤醒,适用于水表、气表等电池供电系统及便携设备 2.蜂鸣器及其工作原理: 蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。 接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产 生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

本实验采用的是电磁式蜂鸣器。 蜂鸣器按其是否带有信号源又分为有源和无源两种类型。有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固 定频率的信号,驱动蜂鸣器发出声音。无源蜂鸣器可以理解成与喇叭一 样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。 本实验采用的是有源蜂鸣器。 (蜂鸣器与单片机连接电路图) 2.2 软件设计过程 1.蜂鸣器发声原理 本实验由于采用有源蜂鸣器,只需将引脚端口P3^4清零,蜂鸣器即可发声;P3^4置位,蜂鸣器停止发声。采用置1置0的方法只 能使蜂鸣器发声或停止发声,想要使蜂鸣器发出声音,必须对蜂鸣 器发出声音的音频和节拍进行控制。 (音乐基础 音调: 不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱

单片机蜂鸣器播放音乐

#include #define uchar unsigned char #define uint unsigned int sbit sp eaker = P1^7; uint j; uchar m=1; uchar flag; uchar line; uchar code * data song; // 中4 高3 中5 休止 符 低6 中7 低7 高1 中1 低3 中2 低5 中3 低4 uchar code yin[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,0xFC,0xAC,0xFD,0x09,0xFD,0x34,0xF D,0x82,0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,0XFB,0x04,0xFA,0x67,0xFE,0x85}; uchar code song1[97]={0x34,0x32,0x32,0x34,0x42,0x51, 0x62,0x52,0x42,0x32,0x34,0x04, //<< 干杯,朋友>> 0x74,0x74,0x62,0x62,0x64, 0x3c,0x04, 0x64,0x62,0x52,0x42,0x32,0x34, 0x33,0x31,0x32,0x72,0x76,0x72, 0x83,0x81,0x82,0x82,0x82,0x74,0x72, 0x7c,0x04, 0x63,0x61,0x62,0x62,0x64,0x72,0x82, 0x72,0x74,0x72,0x62,0x52,0x42,0x32, 0x42,0x44,0x42,0x42,0x52,0x62,0x52, 0x5c,0x04, 0x64,0x62,0x62,0x64,0x72,0x82, 0x72,0x74,0x72,0x62,0x52,0x42,0x32, 0x42,0x46,0x53,0x41,0x42,0x32, 0x3c,0x04, 0x44,0x48,0x02,0x32, 0x3f, 0x44,0x48,0x02,0x32, 0x3f, 0x34,0x0c, 0xFF}; uchar code song2[46]={0x12,0x52,0x52,0x52,0x56,0x42, //<< 兰花草>>

51单片机蜂鸣器播放单音节音乐

51单片机的唱歌实验 晶振:11.0592MHZ 程序: #include #define uchar unsigned char bit flag; //标志音乐输出脚电平的高低 uchar ptr = 0x00; //取音符 uchar high; //计数器高位 uchar low; //计数器低位 // 本曲谱为"新年好",前两个十六进制表示发声频率,后一个表示发声时间,0xFF,0xFF 表示休止符 // 0x00 表示结束 // 1 _ 1_ 1 .5 uchar code music[] = { 0xFC,0x44,0x7F, 0xFC,0x44,0x7F, 0xFC,0x44,0xFF, 0xFA,0x68,0xFF, // 3 _ 3_ 3 1 0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF, // 1_ 3_ 5 5 0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFD,0x82,0xFF, 0xFD,0x82,0xFF, // 4_ 3_ 2 - 0xFD,0x23,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFF,0xFF,0xFF, // 2_ 3_ 4 4 0xFC,0xAC,0x7F, 0xFD,0x23,0x7F, 0xFD,0x34,0xFF, 0xFD,0x34,0xFF, // 3_ 2_ 3 1 0xFD,0x23,0x7F, 0xFC,0xAC,0x7F, 0xFD,0x23,0xFF, 0xFC,0x44,0xFF, // 1_ 3_ 2 .5 0xFC,0x44,0x7F, 0xFD,0x23,0x7F, 0xFC,0xAC,0xFF, 0xFA,0x68,0xFF, // .7_ 2_ 1 - 0xFC,0x0C,0x7F, 0xFC,0xAC,0x7F, 0xFC,0x44,0xFF, 0xFF,0xFF,0xFF, 0x00//结束 }; void Init(void); //初始化函数 void DelayMs(unsigned int time); //毫秒级延时函数 void main() { uchar time; Init(); TH0 = high; TL0 = low; while (1) {

单片机驱动蜂鸣器原理与程序

单片机驱动蜂鸣器原理与设计下面是电磁式蜂鸣器的外形图片及结构图。。。

时,三极管T1截止,没有电流流过线圈,蜂鸣器不发声;当P3.7输出低电平时,三极管导通,这样蜂鸣器的电流形成回路,发出声音。因此,我们可以通过程序控制P3.7脚的电平来使蜂鸣器发出声音和关闭。 程序中改变单片机P3.7引脚输出波形的频率,就可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。另外,改变P3.7输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小,这些我们都可以通过编程实验来验证。 二、蜂鸣器列子 下面我们举几个简单的单片机驱动蜂鸣器的编程和电路设计的列子。 1、简单的蜂鸣器实验程序:本程序通过在P3.7输出一个音频范围的方波,驱动实验板上的蜂鸣器发出蜂鸣声,其中DELAY延时子程序的作用是使输出的方波频率在人耳朵听觉能力之内的20KHZ以下,如果没有这个延时程序的话,输出的频率将大大超出人耳朵的听觉能力,我们将不能听到声音。更改延时常数,可以改变输出频率,也就可以调整蜂鸣器的音调。大家可以在实验中更改#228为其他值,听听蜂鸣器音调的改变。 ORG 0000H AJMP MAIN ;跳转到主程序 ORG 0030H MAIN: CPL P3.7 ;蜂鸣器驱动电平取反 LCALL DELAY ;延时 AJMP MAIN ;反复循环 DELAY:MOV R7,#228 ;延时子程序,更改该延时常数可以改变蜂鸣器发出的音调 DE1: DJNZ R7,DE1 RET

END 2、倒车警示音实验程序:我们知道各种卡车、货柜车在倒车时候,会发出倒车的蜂鸣警示提示音,同时警示黄灯也同步闪烁,提醒后面的人或车辆注意。本实验例程就实现倒车警示功能,通过实验板上的蜂鸣器发出警示音,同时通过实验板上P1.2和P1.5上的两个黄色发光二极管来发出黄色警示灯。 ORG 0000H AJMP START ;跳转到初始化程序 ORG 0033H START: MOV SP,#60H ;SP初始化 MOV P3,#0FFH ;端口初始化 MAIN: ACALL SOUND ;蜂鸣器发声 ACALL YS500M ;延时 AJMP MAIN SOUND: MOV P1,#11011011B ;点亮2个警示黄色发光二极管 MOV R2,#200 ;响200个周期 SND1: CLR P3.7 ;输出低电平T1导通,蜂鸣器响 ACALL YS1ms ;延时 SETB P3.7 ;输出高电平T1截止,蜂鸣器不响 ACALL YS1ms ;延时 DJNZ R2,SND1 MOV P1,#0FFH ;熄灭黄色警示灯 RET

单片机蜂鸣器音乐

关于“世上只有妈妈好”的单片机音乐演奏程序 2009-11-22 21:45 单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。 这就需要单片机,在半个周期内输出低电平、另外半个周期输出高电平,周而复始。 半个周期的时间是多长呢?众所周知,周期为频率的倒数,可以通过音符的频率计算出半周期。 演奏时,要根据音符频率的不同,把对应的、半个周期的定时时间初始值,送入定时器,再由定时器按时输出高低电平。 下面是个网上广泛流传的单片机音乐演奏程序,它可以循环的播放“世上只有妈妈好”这首乐曲。很多人都关心如何修改这个乐曲的内容,但是不知如何入手。做而论道对这个程序,给出说明,希望对大家有所帮助,以后大家自己就能够编写进去新的乐曲。 在这个程序中,有两个数据表,其中存放了事先算好的、各种音符频率所对应的、半周期的定时时间初始值。 有了这些数据,单片机就可以演奏从低音、中音、高音和超高音,四个八度共28个音符。 演奏乐曲时,就根据音符的不同数值,从半周期数据表中找到定时时间初始值,送入定时器即可控制发音的音调。 比如把表中的0xF2和0x42送到定时器,定时器按照这个初始值来产生中断,输出的方波,人们听起来,这就是低音1。 乐曲的数据,也要写个数据表,程序中以 code unsigned char sszymmh[] 命名。这个表中每三个数字,说明了一个音符,它们分别代表: 第一个数字是音符的数值1234567之一,代表多来咪发...; 第二个数字是0123之一,代表低音、中音、高音、超高音; 第三个数字是时间长度,以半拍为单位。 乐曲数据表的结尾是三个0。 程序如下: #include sbit speaker = P1^7; unsigned char timer0h, timer0l, time; //-------------------------------------- //单片机晶振采用11.0592MHz // 频率-半周期数据表高八位本软件共保存了四个八度的28个频率数据code unsigned char FREQH[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567

单片机课程设计报告利用蜂鸣器播放音乐

单片机课程设计报告利用蜂鸣器播放 音乐

课程设计:电子设计 题目名称:音乐流水灯 姓名:戴锦超 学号:08123447 班级:信科12-3班 完成时间: 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)典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序 (2)空闲模式:典型功耗2mA (3)正常工作模式:典型功耗4Ma~7mA (4)唤醒,适用于水表、气表等电池供电系统及便携设备 2.蜂鸣器及其工作原理: 蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流经过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。本实验采用的是电磁式蜂鸣器。 蜂鸣器按其是否带有信号源又分为有源和无源两种类

蜂鸣器响声三种音乐

两只蝴蝶音乐编程程序: #include // 这是单片机音乐代码生成器生成的代码 #define uchar unsigned char sbit beepIO=P3^6; // 输出为P1.5 可以修改成其它IO 口 uchar m,n; uchar code T[49][2]={{0,0}, {0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03 },{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B}, {0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x8 1},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05}, {0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0 },{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02}, {0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{ 0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81} }; uchar code music[][2]={{0,4}, {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19 ,4},{16,4},{19,4},{14,24}, {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,24},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19 ,4},{16,4},{19,4},{21,24}, {23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19 ,4},{16,4},{19,4},{14,24}, {23,4},{26,4},{26,16},{26,4},{28,4},{26,4},{23,24},{21,4},{23,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16 ,4},{16,2},{19,2},{19,24},{0,20}, {26,4},{26,4},{28,4},{31,4},{30,4},{30,4},{28,4},{23,4},{21,4},{21,4},{23,16},{0,4},{23,4},{23,4},{26,4} ,{28,8},{28,12},{16,4},{23,4},{21,4}, {21,24},{23,4},{26,4},{26,4},{23,4},{26,8},{0,4},{31,8},{30,4},{28,4},{30,4},{23,8},{0,4},{28,4},{28,4},{ 30,4},{28,4},{26,4},{23,4},{21,8},{23,4},{21,4},{23,4},{26,16}, {0xFF,0xFF}}; void delay(uchar p) { uchar i,j; for(;p>0;p--) for(i=181;i>0;i--) for(j=181;j>0;j--);

相关文档
相关文档 最新文档