/***************************************************************************
程序名稱:program4-1.c
程序功能:單片機控制的音樂盒
****************************************************************************/
#include "reg51.h" //包含頭文件reg51.h
#define ucharunsigned char
#define uintunsigned 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 2tiger[ ]= //兩只老虎音符數(shù)組
{
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,x14,
0x14,0x54,0x18,0x14,0x54,0x18,0x00,0x00
};
/***************************************************************************
函數(shù)名稱:delay_125ms
函數(shù)功能:實現(xiàn)125ms延時函數(shù)
形式參數(shù):無
返回值:無
****************************************************************************/
void delay_125ms()
{
uchar counter=0; //計數(shù)器初始化
TR0=1; //啟動T0
for(;counter!=5;) //判斷計數(shù)器值是否等于5
{
if(TF0==1) //T0溢出判斷
{
TF0 = 0; //定時器0溢出位清零
TH0=0xa6; //恢復(fù)計數(shù)器初值(可采用stc-isp軟件計算)
TL0=0x00;
counter++; //循環(huán)次數(shù)標志位加1
}
}
counter = 0; //計數(shù)5次,計數(shù)器清零
}
/***************************************************************************
函數(shù)名稱:palay_music
函數(shù)功能:單片機控制蜂鳴器播放音樂
****************************************************************************/
void paly_music() //音樂播放函數(shù)
{
uchar i,j,k;
j=0;
while(2tiger[j]!=0x00) //一直播放到休止符0x00為止
{
k=2tiger[j]&0x0F; //從音符數(shù)組中得到節(jié)拍
note=2tiger[j]>>4; //從音符數(shù)組中得到音符
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; //當播放到停止符時關(guān)閉T1
BEEP=1; //關(guān)閉蜂鳴器
}
for(i=k;i>0;--i) //延時,產(chǎn)生相應(yīng)的節(jié)拍
{
delay_125ms();
}
TR1=0;
j++; //取數(shù)組中的下一個數(shù)據(jù)
}
}
/***************************************************************************
函數(shù)名稱:init
函數(shù)功能:定時器T0、T1初始化
****************************************************************************/
void init ()
{
TMOD=0x11; //T0工作定時工作方式
TH0=0xa6; //賦T0計數(shù)器初值(25ms)
TL0=0x00;
ET1=1; //允許T1中斷
EA=1; //中斷允許
}
/***************************************************************************
函數(shù)名稱:main
函數(shù)功能:單片機控制蜂鳴器播放音樂
****************************************************************************/
void main( ) //主函數(shù)
{
init();
while(1)
{
paly_music( ); // 播放音樂
}
}
/***************************************************************************
函數(shù)名稱:timer1
函數(shù)功能:T1產(chǎn)生音符脈沖
****************************************************************************/
void timer1( ) interrupt 3
{
TH1=music[2*note]; //恢復(fù)計數(shù)器初始值
TL1=music[2*note+1];
BEEP=~BEEP;
}
|