📄 beepnew.h
字号:
/*********************************************
*函数功能:发出特定频率、特定音长的声音
*函数参数:频率(Hz)、长度(ms)
*函数名:beep
***********************************************/
void beep(WORD frequency, int length) reentrant
{
WORD init,downtime, uptime; //
flag=1; //标志
TMOD=1; //设置定时器0
times=(int)(((float)(frequency))*((float)length/1000.0));//设置循环周期,也即设置音长的参数
init=65536-11059200/12/frequency; //计算指定频率的计数初始值,此参数需经过下面调整
downtime=volume ;//下降沿宽度调此参数,越大越宽,音量越大
uptime=init+(WORD)downtime+35; //计算上升沿宽度定时器参数,+35是程序语句耗时补偿值
downtime=65536-downtime; //计算下降沿宽度定时器参数
if(frequency==10000) //考虑到一般乐曲10000Hz以上不会出现,故把10000Hz当休止符
{
rest=1; //休止符标记
}
else{rest=0;}
uptimeth0=(BYTE)(uptime>>8); //给定时器赋初始值做准备
uptimetl0=(BYTE)(uptime&0x00FF);
downtimeth0=(BYTE)(downtime>>8);
downtimetl0=(BYTE)(downtime&0x00FF);
TH0=uptimeth0;//第一此赋初始值
TL0=uptimetl0;
ET0=1;//开中断
EA=1;
TR0=1;//开始计时
while(times);//等待周期循环结束,也就是等待指定音长的时间
}
/*********************************************
*函数功能:播放一首乐曲
*函数参数:乐谱数组、音长数组、数组长度
*函数名:playmusic
***********************************************/
void playmusic(WORD code *note, WORD code *len, int l) reentrant{
int count;
EX1=0;
cancelkeyflag=0;
playing=1;
for(count=0;count<l;count++)
{
beep(note[count],len[count]);
if(cancelkeyflag)
break;
}
cancelkeyflag=0;
playing=0;
EX1=1;
}
/****************************************************************
*函数功能:定时器0中断函数,配合beep函数发出特定频率、特定音长的声音
*函数名:timer0
******************************************************************/
void timer0(void) interrupt 1 using 1
{
flag=!flag; //flag=1,高电平;flag=0,低电平
if(times==0) //周期循环结束返回
{
ET0=0;
TR0=0;
P1|=0x01;
return;
}
if(!flag) //如果当前是高电平,赋低电平时间值,并置输出为低电平
{
TH0=downtimeth0;
TL0=downtimetl0;
if(!rest)
P1&=0xFE;
}
else //如果当前是低电平,赋高电平时间值,并置输出为高电平,周期循环数减一
{
TH0=uptimeth0;
TL0=uptimetl0;
P1|=0x01;
times--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -