📄 main.c
字号:
/*******************************************************************************
程序名称:控制交流蜂鸣器演奏简单的乐曲
硬件接法:P1.2控制交流蜂鸣器,发声频率等于P1.2的方波振荡频率
运行效果:蜂鸣器演奏出动听的乐曲
*******************************************************************************/
#include <reg51.h>
//定义I/O接口
sbit BUZZER = P1^2;
//定义音符结构
typedef struct
{
unsigned int mFreq; //发声频率(对应的定时器初值)
unsigned int mDelay; //发声时值
}CNote;
//定义定时器T1重装值
unsigned char ReloadH;
unsigned char ReloadL;
/*******************************************************************************
函数:T1_ISR()
功能:定时器T1中断服务函数
*******************************************************************************/
void T1_ISR() interrupt 3
{
TR1 = 0;
TH1 = ReloadH;
TL1 = ReloadL;
TR1 = 1;
BUZZER = !BUZZER;
}
/*******************************************************************************
函数: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;
BUZZER = 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()
{
unsigned char n;
TMOD = 0x11;
ET1 = 1;
EA = 1;
for (;;)
{
n = 3;
do
{
Play(MusicTab); //演奏乐曲
} while ( --n != 0 );
Delay(5000); //等待5秒,再循环播放
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -