详细解读一下这个音乐门铃程序, #include <reg51.h> #include <intrins.h> sbit Beep = P1^5 ;

#include<reg51.h>#include<intrins.h>sbitBeep=P1^5;sbitkey1=P3^2;//按键sbitkey2=P3^3;uns... #include <reg51.h>
#include <intrins.h>
sbit Beep = P1^5 ;
sbit key1=P3^2; //按键
sbit key2=P3^3;
unsigned char flage,n=0;
unsigned char code music_tab[] ={ //音乐代码省略};
void int0() interrupt 1 //采用中断0 控制节拍
{ TH0=0xd8;
TL0=0xef;
n--;
}

void delay (unsigned char m)
{
unsigned i=3*m;
while(--i);
}

void delayms(unsigned char a)
{
while(--a);
}

void main()
{ unsigned char p,m;
unsigned char i=0;
TMOD&=0x0f;
TMOD|=0x01;
TH0=0xd8;TL0=0xef;
IE=0x82;
play:
while(1)
{
if(key1==0) //判断是否有键按下
{
if(key1==0)
flage=1; //标志位置1
}
if(flage==1) //如果flage==1 才唱歌
{
if(key2==0)
{
if(key2==0)
{

while(flage)
{
if(key1==0)
{
if(key1==0)
{
flage=0;
i=0;
}while(!key1);
}
}
}
}
a: p=music_tab[i];
if(p==0x00) { i=0, delayms(1000); goto play;}
else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;}
else {m=music_tab[i++], n=music_tab[i++];}
TR0=1;
while(n!=0) Beep=~Beep,delay(m);
TR0=0;
if(i>96)//唱一遍之后进入
{ flage=0;
i=0;
while(!flage)//判断 是否有键按下
{
if(key1==0)
{
if(key1==0)
{
flage=1;
delay(1);

}
}

}

} }
} }
展开
 我来答
风雨者13
2014-12-24 · 超过21用户采纳过TA的回答
知道答主
回答量:35
采纳率:0%
帮助的人:27.3万
展开全部
初次看到该代码,就一种感觉:很多地方比较冗余,比如像
if(key1==0) //判断是否有键按下
{
if(key1==0)

if(key1==0)
{
if(key1==0)
{
等等,这些语句都是重复,如果想加上一个延时防抖,就应该加上相应的延时,最好封装成函数。这样可读性比较高,另一个不容易出错。

该程序的主要思路是采用定时器0作为频率发生器,读入music_tab[]中的频率代码,用蜂鸣器产生不同的频率,用两个按钮控制播放。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式