用单片机控制蜂鸣器放音乐

下面的程序怎么理解,数组是怎么得到的#include"reg51.h"unsignedcharCount;sbitFMQ=P3^5;//蜂鸣器控制脚unsignedcha... 下面的程序怎么理解,数组是怎么得到的
#include "reg51.h"

unsigned char Count;

sbit FMQ =P3^5 ; //蜂鸣器控制脚

unsigned char code 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,0x20,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,0x26,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,};

void Time0_Init() //定时器0初始化函数

{

TMOD = 0x01; //工作模式选择

IE = 0x82; //中断设置

TH0 = 0xD8; //装初值

TL0 = 0xEF; //12MZ晶振,10ms

}

void Time0_Int() interrupt 1 //定时器0中断子函数

{

TH0 = 0xD8;

TL0 = 0xEF;

Count++; //长度加1

}

void Play_Song(unsigned char i)

{

unsigned char Temp1,Temp2;

unsigned int Addr;

Count = 0; //中断计数器清0

Addr = i * 217;

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)

{

FMQ = ~FMQ;

Delay_xMs(Temp1);

if ( Temp2 == Count )

{

Count = 0;

break;

}

}

}

}

}
谢谢你,我已经自己编出来了,恩,你说的问题确实是延时定义有问题。
展开
 我来答
宿兴电子 2024-11-28
展开全部

联系我们一、有无震荡源 无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。 二、价格不同 有源蜂鸣器往比无源蜂鸣器贵,就是因为里面多个震荡电路。 三、高度不同 从图a、b外观上看,两种蜂鸣器好像一样,但仔细看,两者的高度略有区别,有源蜂鸣器a,高度为9m,而无源蜂鸣器b的高度为8m。关于我们如将两种蜂鸣器的引脚郡朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。 四、万用表测电阻区别 用万用表电阻档Rxl档测试:用黑表笔接蜂鸣器 "+"引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。 同时有源蜂鸣器直接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。产品展示五、优点不同 (1)无源蜂鸣器的优点是: 1、便宜; 2、声音频率可控,可以做出“多来米发索拉西”的效果; 3、在一些特例中,可以和LED复用一个控制口。 (2)有源蜂鸣器的优点是:程序控制方便。

可以看下深圳市宿兴电子有限公司
本公司专业研发、生产压电陶瓷蜂鸣片、压电插针蜂鸣器、压电引线蜂鸣器。可根据客户需求研发定制各种压电蜂鸣器。是国内较早生产蜂鸣片,蜂鸣器厂家之一,厂内设有五金部、注塑部,焊锡部、组装生产车间,具备从开发设计及大批量规模生产的一系列专业生产及检测设备。如:电声测试仪、信号发生器、分贝仪等。公司可根据客户需要研发、生产。为客户提供压电、电声专业技术解决方案。产品具有重量轻,体积小,低功耗,高可靠等优点,产品广泛应用于报警器、微波炉、计算机/器、数码相机、医疗仪器、传真机、电话机、音响、电子发音玩具及电子钟表等. 月产量500-1000万。
公司本着“团结,协作、创新,高效”经营理念,全员参与,持续改善,为客户提供优质的电声系列产品!公司以品质第一、交期第一的服务原则为客户提供优质的服务。

还是别说话SN
推荐于2018-04-13 · TA获得超过708个赞
知道小有建树答主
回答量:333
采纳率:50%
帮助的人:169万
展开全部
看起来数组应该是音乐数据,其中包括四种数据,就是休止符(每个100毫秒)、歌曲结束符、音阶(给出的是蜂鸣器的震荡周期)、一个音阶持续的时间长度。如果你的晶振是12MHz,按照定时器中断给Count加一来看,音阶持续的时间应该是以10毫秒为单位。
Play_Song函数要求给出参数i,我的看法是这个i是指要播放第几段乐曲,i*217表示每段乐曲都是217个字节。本例中,数组只给出217个字节,所以只有一段乐曲,播放时需要给出参数i=0.

if ( Temp1 == 0xFF ) //休止符
{
TR0 = 0;
Delay_xMs(100);
}
所以休止符每个固定是100毫秒。
如果读到第一个不是休止符或者结束符的字节,那就是音阶,而下一个字节就是这个音阶的长度或者说节拍

while(1)
{
FMQ = ~FMQ;
Delay_xMs(Temp1);
if ( Temp2 == Count )
{
Count = 0;
break;
}
}
这一段是说,如果当前音阶的时间(Temp2次定时器中断,由Count计时)还没完,就每隔Temp1毫秒震动一次蜂鸣器,就形成一个震动频率,这段时间就发出一定音调的乐音。不过我也有疑惑,震荡周期如果以毫秒为单位恐怕只能发出次声波,所以以上对有关Delay_xMs函数时间的估算都可能有问题,还得看Delay_xMs函数的具体定义才行。
宿兴电子
2024-11-28 广告
看起来数组应该是音乐数据,其中包括四种数据,就是休止符(每个100毫秒)、歌曲结束符、音阶(给出的是蜂鸣器的震荡周期)、一个音阶持续的时间长度。如果你的晶振是12mhz,按照定时器中断给count加一来看,音阶持续的时间应该是以10毫秒为单... 点击进入详情页
本回答由宿兴电子提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式