/***************************************************************************
程序名稱: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;
}
|