MC9S12XS128单片机上蜂鸣器的c程序,最好能是一首完整的歌曲,最好有一些必要注释(音乐代码之类的)
1个回答
展开全部
//**************************************************************************************
/*************************************************************
程序功能:51单片机演奏单音乐曲
硬件接法:P37控制交流蜂鸣器,发声频率等于P37的方波振荡频率
**************************************************************/
#include "REG52.H" //包含所选单片机的定义头文件
sbit SPEAKER = P3^7; //定义音乐输出口
typedef struct //定义音符结构
{ unsigned int mFreq; //发声频率(对应的定时器初值)
unsigned int mDelay; //发声时值
}CNote;
unsigned char ReloadH; //定义定时器T1重装值
unsigned char ReloadL;
/************************************************************
函数:T1_ISR()
功能:定时器T1中断服务函数,产生音乐振荡频率
*************************************************************/
void T1_ISR() interrupt 3
{ TR1 = 0;
TH1 = ReloadH;
TL1 = ReloadL;
TR1 = 1;
SPEAKER = !SPEAKER; //音乐声频的半个波
}
/*************************************************************
函数:Delay()
功能:延时0.001~65.536s
参数:t>0时,延时(t*0.001)s
t=0时,延时65.536s
*************************************************************/
void Delay(unsigned int t)
{ do
{ TH0 = 0xFC; //定时器赋初值,定时1ms
TL0 = 0x66+17;
TR0 = 1; //启动定时器
while ( !TF0 ); //等待定时器溢出
TR0 = 0; //关闭定时器
TF0 = 0; //清除溢出标志
} while ( --t != 0 ); //循环t次
}
/***********************************************************
函数:Sound()
功能:演奏一个音符
参数:*note,音符指针,指向要演奏的音符
***********************************************************/
void Sound(CNote *note)
{ //利用定时器T1发出音符的频率
if ( note->mFreq != 0 )
{ ReloadH = (unsigned char)(note->mFreq >> 8);
ReloadL = (unsigned char)(note->mFreq);
TH1 = 0xFF;
TL1 = 0xF0;
TR1 = 1;
}
Delay(note->mDelay); //发声延时
TR1 = 0; //停止发声
TF1 = 0;
SPEAKER = 1;
Delay(5);
}
/************************************************************
函数:Play()
功能:演奏一段乐曲
参数:music[],要演奏的乐曲
*************************************************************/
void Play(CNote music[])
{ unsigned int n = 0;
for (;;)
{ if ( music[n].mDelay == 0 ) break;
Sound(&(music[n]));
n++;
}
}
#include "MusicTab.h" //包含乐曲头文件
void main() //主程序
{
TMOD = 0x11; //设定时器
ET1 = 1;
EA = 1;
for (;;)
{
Play(MusicTab1); //演奏第一首乐曲
Delay(500); //等待数秒
Play(MusicTab); //演奏第二首乐曲
Delay(500); //等待数秒,再循环播放
}
}
/*************************************************************
程序功能:51单片机演奏单音乐曲
硬件接法:P37控制交流蜂鸣器,发声频率等于P37的方波振荡频率
**************************************************************/
#include "REG52.H" //包含所选单片机的定义头文件
sbit SPEAKER = P3^7; //定义音乐输出口
typedef struct //定义音符结构
{ unsigned int mFreq; //发声频率(对应的定时器初值)
unsigned int mDelay; //发声时值
}CNote;
unsigned char ReloadH; //定义定时器T1重装值
unsigned char ReloadL;
/************************************************************
函数:T1_ISR()
功能:定时器T1中断服务函数,产生音乐振荡频率
*************************************************************/
void T1_ISR() interrupt 3
{ TR1 = 0;
TH1 = ReloadH;
TL1 = ReloadL;
TR1 = 1;
SPEAKER = !SPEAKER; //音乐声频的半个波
}
/*************************************************************
函数:Delay()
功能:延时0.001~65.536s
参数:t>0时,延时(t*0.001)s
t=0时,延时65.536s
*************************************************************/
void Delay(unsigned int t)
{ do
{ TH0 = 0xFC; //定时器赋初值,定时1ms
TL0 = 0x66+17;
TR0 = 1; //启动定时器
while ( !TF0 ); //等待定时器溢出
TR0 = 0; //关闭定时器
TF0 = 0; //清除溢出标志
} while ( --t != 0 ); //循环t次
}
/***********************************************************
函数:Sound()
功能:演奏一个音符
参数:*note,音符指针,指向要演奏的音符
***********************************************************/
void Sound(CNote *note)
{ //利用定时器T1发出音符的频率
if ( note->mFreq != 0 )
{ ReloadH = (unsigned char)(note->mFreq >> 8);
ReloadL = (unsigned char)(note->mFreq);
TH1 = 0xFF;
TL1 = 0xF0;
TR1 = 1;
}
Delay(note->mDelay); //发声延时
TR1 = 0; //停止发声
TF1 = 0;
SPEAKER = 1;
Delay(5);
}
/************************************************************
函数:Play()
功能:演奏一段乐曲
参数:music[],要演奏的乐曲
*************************************************************/
void Play(CNote music[])
{ unsigned int n = 0;
for (;;)
{ if ( music[n].mDelay == 0 ) break;
Sound(&(music[n]));
n++;
}
}
#include "MusicTab.h" //包含乐曲头文件
void main() //主程序
{
TMOD = 0x11; //设定时器
ET1 = 1;
EA = 1;
for (;;)
{
Play(MusicTab1); //演奏第一首乐曲
Delay(500); //等待数秒
Play(MusicTab); //演奏第二首乐曲
Delay(500); //等待数秒,再循环播放
}
}
昆山海旭电子
2024-12-02 广告
2024-12-02 广告
有源蜂鸣器是一种内置振荡源的电子器件,只要通电就会发出声音。它利用内部电子震荡电路来产生声音信号,并将其放大并输出。有源蜂鸣器通常比无源蜂鸣器更贵,因为它内部包含了一个振荡电路和放大电路。有源蜂鸣器可以使用直流电源来驱动,但需要满足一定的条...
点击进入详情页
本回答由昆山海旭电子提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询