×
单片机 > 其他资讯 > 详情

壹拾壹:音乐实验

发布时间:2020-07-10 发布时间:
|

#基础知识
扬声器(Speaker)俗称喇叭,是一种发生器件,可以发出多种音频,在实际生活中应用相当广泛。

发声原理:

声音的产生是一种音频振动的效果,振动的频率高则为高音,频率低则为低音。
音频的范围为20Hz-200kHz,人类的耳朵比较容易辨识的声音大概是200Hz -20kHz。
一般音响电路是以正弦波信号驱动喇叭,产生悦耳的音乐;在数字电路里,则一般是以脉冲信号驱动喇叭以产生声音,其效果相对会差一些。


1)音调
以Do、Re、Mi、Fa、So、La、St分别代表某一个频率的声音,称之为“音调”,即Tone。
2)节拍
节拍能让音乐具有旋律(固定的律动),更可以调节各个音的快慢速度。“节拍”即Beat。
C3/4代表C调、4小节、每小节三拍;两条直线之间为一小节。
若以每小节1.5s的速度,也就是每拍0.5s、3/4拍0.375s、1/2拍0.25s、1/4拍0.125s……以此类推。

3)C调音阶和频率之间的对照关系。

#实验

1)频率表的定义
频率表数据

2)音频播放表

3)程序流程

C代码

******************************************************************/

*   【课程12】 ****音乐实验***********

*   【说  明】 ****

*   【描  述】 ****生日快乐歌的实验。

******************************************************************/

/*---------------------------------------------

51单片机音乐播放实验

-----------------------------------------------*/

#include //51头文件,


//---------常用的两个宏定义-------------- 

#define uint8 unsigned char

#define uint16  unsigned int


sbit Music=P2^0;


uint16 code FreTab_Low[7]={262,294,330,349,392,440,494}; //低音频率表

uint16 code FreTab_Mid[7]={523,578,659,698,784,880,988}; //中音频率表

uint16 code FreTab_Hight[7]={1046,1175,1318,1397,1568,1760,1976}; //高音频率表


/*-----------------------------------------------------

曲谱存贮格式 uchar code MusicName{音高,音长,...., 0,0};

末尾:0,0 表示结束。

音高由频率决定,音长也就是节拍可以自己规定,在本程序中,

定时器T1用作节拍定时,定时时间为50ms,那么在该乐谱中1拍

表示50ms。

-------------------------------------------------------*/

uint8 code  Happy_Birthday[]={0x11,0x05,0x11,0x05,0x12,0x0a,0x11,0x0a,

0x14,0x0a,0x13,0x14,

0x11,0x05,0x11,0x05,0x12,0x0a,0x11,0x0a,

0x15,0x0a,0x14,0x14,

0x11,0x05,0x11,0x05,0x21,0x0a,0x16,0x0a,

0x14,0x0a,0x13,0x0a,0x22,0x0a,

0x17,0x05,0x17,0x05,0x16,0x0a,0x14,0x0a,

0x15,0x0a,0x14,0x14,0x00,0x00

};

uint16 Fre;  //存放获取频率值的变量


/*-----------------------------------------------

函数名:Timer_Init()

函数功能:对两个定时器初始化

入口参数:无

------------------------------------------------*/

void Timer_Init()

{

TMOD=0x11;

EA=1;

ET0=1;

ET1=0;

TR0=0;

TR1=0;

}

/*-----------------------------------------------

函数名:Timer0_Ser()

函数功能:定时器0的中断服务程序,主要是产生需要的频率

          从而驱动喇叭发出相应的音符

入口参数:无

------------------------------------------------*/

void Timer0_i() interrupt 1

{

TH0=Fre/256;

TL0=Fre%256;

if(Music==0)

Music=1;

else Music=0;

}


/*-----------------------------------------------

函数名:Music_Play(uchar *MusicTab)

函数功能:音乐播放函数,

入口参数:*MusicTab  所要播放音乐的首地址

------------------------------------------------*/

void Music_Play(uint8 *MusicTab)

{

uint8 *pMusic;

uint8 temp,i;


pMusic=MusicTab;  //将歌曲首地址给指针变量

while(*pMusic!=0)

{

if((*pMusic&0xf0)==0x00)

Fre=65536-1000000/FreTab_Low[*pMusic&0x0f];

else if((*pMusic&0xf0)==0x10)

Fre=65536-1000000/FreTab_Mid[*pMusic&0x0f];

else if((*pMusic&0xf0)==0x20)

Fre=65536-1000000/FreTab_Hight[*pMusic&0x0f];

TH0=Fre/256; //计算频率初值,赋高八位

TL0=Fre%256; //计算频率初值,赋低八位

TH1=0x3c;     //定时器1赋初值,定时50ms

TL1=0xb0;

pMusic++;     //获得节拍值

temp=*pMusic;

TR0=1; //开启定时器T0

TR1=1; //开启定时器T1

for(i=0;i

{

while(TF1==0); //判断定时器1是否溢出

TH1=0x3c;

TL1=0xb0;

TF1=0;

}

pMusic++;

}

}

/*-----------------------------------------------

函数名:main()

函数功能:主函数

入口参数:无

------------------------------------------------*/

void main()

{

Timer_Init();

while(1)

{

Music_Play(Happy_Birthday);

}

}


 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
关于汽车系统中整车控制器(VCU)的功能