/***************************************************************************
程序名称:program4-1.c
程序功能:单片机控制的音乐盒
****************************************************************************/
#include "reg51.h" //包含头文件reg51.h
#define uchar unsigned char
#include <intrins.h>
#define uint unsigned int
sbit BEEP=P3^7; //蜂鸣器控制接口
uchar note; //音符下标
uchar code music[]={0xFC,0x44,0xFC,0xAC, 0xFD,0x09, 0xFD,0x34, 0xFD,0x82, 0xFD,0xC8};
//T值
uchar code tiger[ ]= //两只老虎音符数组
{
0x14,0x24,0x34,0x14,0x14,0x24,0x34,0x14,0x34,0x44,0x58,0x34,0x44,
0x58,0x53,0x61,0x53,0x41,0x34,0x14,0x53,0x61,0x53,0x41,0x34,0x14,
0x14,0x54,0x18,0x14,0x54,0x18,0x00,0x00
};
/***************************************************************************
函数名称:delay_125ms
函数功能:实现125ms延时函数
形式参数:无
返回值:无
****************************************************************************/
void delay_125ms()
{
uchar counter=0; //计数器初始化
TR0=1; //启动T0
for(;counter!=5;) //判断计数器值是否等于5
{
if(TF0==1) //T0溢出判断
{
TF0 = 0; //定时器0溢出位清零
TH0=0xa6; //恢复计数器初值(可采用stc-isp软件计算)
TL0=0x00;
counter++; //循环次数标志位加1
}
}
counter = 0; //计数5次,计数器清零
}
/***************************************************************************
函数名称:palay_music
函数功能:单片机控制蜂鸣器播放音乐
****************************************************************************/
void paly_music() //音乐播放函数
{
uchar i,j,k;
j=0;
while( tiger[j]!=0x00) //一直播放到休止符0x00为止
{
k= tiger[j]&0x0F; //从音符数组中得到节拍
note=tiger[j]>>4; //从音符数组中得到音符
TH1=music[2*note]; //定时器1赋初值
TL1=music[2*note+1];
TR1=1; // 启动T1
if((music[2*note]==0x00)&&(music[2*note+1]==0x00))//判断是否停止
{
TR1=0; //当播放到停止符时关闭T1
BEEP=1; //关闭蜂鸣器
}
for(i=k;i>0;--i) //延时,产生相应的节拍
{
delay_125ms();
}
TR1=0;
j++; //取数组中的下一个数据
}
}
/***************************************************************************
函数名称:init
函数功能:定时器T0、T1初始化
****************************************************************************/
void init ()
{
TMOD=0x11; //T0工作定时工作方式
TH0=0xa6; //赋T0计数器初值(25ms)
TL0=0x00;
ET1=1; //允许T1中断
EA=1; //中断允许
}
/***************************************************************************
函数名称:main
函数功能:单片机控制蜂鸣器播放音乐
****************************************************************************/
void main( ) //主函数
{
init();
while(1)
{
paly_music( ); // 播放音乐
}
}
/***************************************************************************
函数名称:timer1
函数功能:T1产生音符脉冲
****************************************************************************/
void timer1( ) interrupt 3
{
TH1=music[2*note]; //恢复计数器初始值
TL1=music[2*note+1];
BEEP=~BEEP;
}
|