
#include <reg52h>
#include <intrinsh>
//本例采用89C52, 晶振为110592MHZ
//关于如何编制音乐代码, 其实十分简单,各位可以看以下代码
//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;
//所以拿出谱子, 试探编吧!
sbit out=P2^3;
unsigned char n=0; //n为节拍常数变量
unsigned char code music_tab[] ={
0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,
0x20, 0x40, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x10,
0x1C, 0x10, 0x18 , 0x40,
0x1C, 0x20, 0x20 , 0x20,
0x1C, 0x20, 0x18 , 0x20,
0x20, 0x80, 0xFF , 0x20,
0x30, 0x1C, 0x10 , 0x18,
0x20, 0x15, 0x20 , 0x1C,
0x20, 0x20, 0x20 , 0x26,
0x40, 0x20, 0x20 , 0x2B,
0x20, 0x26, 0x20 , 0x20,
0x20, 0x30, 0x80 , 0xFF,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x20, 0x1C , 0x10,
0x18, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x80,
0x20, 0x30, 0x1C , 0x10,
0x20, 0x10, 0x1C , 0x10,
0x20, 0x20, 0x26 , 0x20,
0x2B, 0x20, 0x30 , 0x20,
0x2B, 0x40, 0x20 , 0x15,
0x1F, 0x05, 0x20 , 0x10,
0x1C, 0x10, 0x20 , 0x20,
0x26, 0x20, 0x2B , 0x20,
0x30, 0x20, 0x2B , 0x40,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,
0x26, 0x40, 0x20 , 0x20,
0x2B, 0x20, 0x26 , 0x20,
0x20, 0x20, 0x30 , 0x30,
0x20, 0x30, 0x1C , 0x10,
0x18, 0x40, 0x1C , 0x20,
0x20, 0x20, 0x26 , 0x40,
0x13, 0x60, 0x18 , 0x20,
0x15, 0x40, 0x13 , 0x40,
0x18, 0x80, 0x00
};
void int0() interrupt 1 //采用中断0 控制节拍
{ TH0=0xd8;
TL0=0xef;
n--;
}
void delay (unsigned char m) //控制频率延时
{
unsigned i=3m;
while(--i);
}
void delayms(unsigned char a) //豪秒延时子程序
{
while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}
void main()
{ unsigned char p,m; //m为频率常数变量
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
a: p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;} //如果碰到结束符,延时1秒,回到开始再来一遍
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延时100ms,继续取下一音符
else {m=music_tab[i++], n=music_tab[i++];} //取频率常数 和 节拍常数
TR0=1; //开定时器1
while(n!=0) out=~out,delay(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
TR0=0; //关定时器1
}
}
1 怎样得到蜂鸣器的歌曲代码
蜂鸣器播放乐曲主要取决于两个参数, 音调和音长 音调为do, re, mi等, 音长是同样的音调持续的时间
蜂鸣器的歌曲播放的驱动方式就变成碰到do就输出多少频率(音调即频率), 然后保证这个音调持续多少时间 每个人写的驱动都有可能不一样(例如有些人do, re, mi只用1,2,3表示, 然后再查频率表, 有些人则直接用相应输出频率的设置值)
所以针对你的歌曲驱动方法(你必须先要了解), 就可以将歌曲转换为代码
举个例子: 8-8-5-5-3-3-1-1-5-4-3-2-1-- (1: do, 8代表高do, -代表一个节拍), 假设我的驱动方法是1的对应的频率设置0x55, 2对应0x65, 以此类推 8为0xC5, 另假设一个节拍"-"对应的时间长度设置为0x30, 则上面的简谱可以转换为 {{0xC5, 0x30}, {0xC5, 0x30}, {0x95, 0x30}, {0x95, 0x30}, {0x75, 0x30}, {0x75, 0x30}, {0x55, 0x30}, {0x55, 0x30}, {0x95, 0x30}, {0x85, 0x30},{0x75, 0x30}, {0x65, 0x30}, {0x55, 0x60}}
知道规律后就可以在电脑上面写一个程序专门将简谱转换成代码
2 怎么让蜂鸣器发出声音
蜂鸣器分为有源蜂鸣器和无源蜂鸣器,发声方法不同。
有源蜂鸣器直接接上额定电源就可以连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能周期性地振动发声。电路应该选用有源蜂鸣器。
蜂鸣器不能够产生变化的声音,如果想判断风速,可以加一个LED灯,通过亮度来判断,不过这个方法也不准确,只能作为参考。 蜂鸣器发声原理。
有源自激型蜂鸣器的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出。
扩展资料:
另外,蜂鸣器有两种。一种是,内部自带振荡器的;一种是,需要外接一个振荡器的,也就是一个普通的微型喇叭。
对于不带振荡器的那种,也是不能用的,因为它的电阻一般为32欧姆左右,也有8欧或16欧的。这些都属于低阻抗的不能用。
如果没有高阻耳机,也可以用一个电源变压器,一般为6V或12V的那种电源变压器,功率选用3到5W左右的那种,因为那种变压器的初级线径很细,圈数也多,阻抗也很大。 是为了使负载获得良好的阻抗匹配,使负载获得最大功率。
蜂鸣器之所以能发出声音,是因为有电流通过它的电磁线圈,从而带动振动膜发声的。单片机的任何一个引脚输出一定频率和占空比的方波,再配合一个三极管就可以驱动蜂鸣器发声了。如果你要唱一首歌曲,你需要知道这首歌曲的音节频率表(我记得这是可以用一个软件来自动获得的)这里给你一个MSP430的蜂鸣器唱歌的例子吧:
/
程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》
/
#include <msp430x14xh>
typedef unsigned char uchar;
#include "musich"
#define Buzzer BIT7
#define Buzzer_Port P6OUT
#define Buzzer_DIR P6DIR
uchar counter;
void Play_Song(void);
/主函数/
void main(void)
{
uchar i;
/下面六行程序关闭所有的IO口/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
/------选择系统主时钟为8MHz-------/
BCSCTL1 &= ~XT2OFF; // 打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); // 等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); // 晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //主时钟和从时钟都选择高频晶振
//设置定时器A每10ms中断一次
CCTL0 = CCIE;
CCR0 = 10000;
TACTL |= TASSEL_2 + ID_3;
//设置控制蜂鸣器的IO方向为输出
Buzzer_DIR |= Buzzer;
//打开全局中断
_EINT();
//循环演奏歌曲
while(1)
{
Play_Song();
}
}
/
函数名称:TimerA_ISR
功 能:定时器A的中断服务函数
参 数:无
返回值 :无
/
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
counter++;
}
/
函数名称:Delay_Nms
功 能:延时N个ms的函数
参 数:n--延时长度
返回值 :无
/
void Delay_Nms(uchar n)
{
uchar i,j;
for( i = 0;i < n; i++ )
{
for( j = 0;j < 3;j++ )
_NOP();
}
}
/
函数名称:Play_Song
功 能:播放《祝你平安》的乐曲
参 数:无
返回值 :无
/
void Play_Song(void)
{
uchar Temp1,Temp2;
uchar addr = 0;
counter = 0; //中断计数器清0
while(1)
{
Temp1 = SONG[addr++];
if ( Temp1 == 0xFF ) //休止符
{
TACTL &=~MC_1; //停止计数
Delay_Nms(100);
}
else if ( Temp1 == 0x00 ) //歌曲结束符
{
return;
}
else
{
Temp2 = SONG[addr++];
TACTL |=MC_1; //开始计数
while(1)
{
Buzzer_Port ^= Buzzer;
Delay_Nms(Temp1);
if ( Temp2 == counter )
{
counter = 0;
break;
}
}
}
}
}
//《祝你平安》对应的编码
const unsigned char SONG[]=
{
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,
0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,
0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x0,0x20,
0x20,0x20,0x20,0x1c,0x20,0x20,0x80,0x2b,0x20,
0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,
0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,
0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,
0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x6,0x10,
0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,0x2b,
0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,
0x2b,0x20,0x2b,0x40,0x40,0x20,0x20,0x10,0x20,
0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,
0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x40,0x26,
0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,
0x20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,
0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,
0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,0x18,0x20,
0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,
0x10,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,
0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,
0x10,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10,
0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,
0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,
0x00
};
电脑蜂鸣器报警声的含义:
1、一声短音:系统正常启动;
2、两声短音:系统出现常规错误,进入系统设置重新设置不正确的选项即可;
3、一声长音一声短音:主板出错,可通过更换内存条或主板解决;
4、一声长音两声短音:显示器或显卡出错,需要去维修点进行详细检查;
5、一声长音三声短音:键盘控制器错误,需要检查主板问题;
6、不断的长音:内存条未插紧或损坏,检查内存条松紧程度即可。
以上就是关于能提供几首单片机的歌曲代码用蜂鸣器唱的全部的内容,包括:能提供几首单片机的歌曲代码用蜂鸣器唱的、怎么把音乐植入蜂鸣器、基于MSP430用蜂鸣器唱歌个思想架构是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)