我給你來個(gè)程序試試
- /*-----------------------------------------------
- 名稱:音樂播放
- 修改:無
- 內(nèi)容:
- ------------------------------------------------*/
- #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng)?
- //頭文件包含特殊功能寄存器的定義
- /*------------------------------------------------
- 硬件端口定義
- ------------------------------------------------*/
- sbit SPK=P1^2; //定義音樂輸出端口
- unsigned char Timer0_H,Timer0_L,Time;
- //世上只有媽媽好數(shù)據(jù)表
- code unsigned char MUSIC[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,
- 6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,
- 6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,
- 5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,
- 2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0
- };
- // 音階頻率表 高八位
- code unsigned char FREQH[]={
- 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
- 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
- 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
- 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
- } ;
- // 音階頻率表 低八位
- code unsigned char FREQL[]={
- 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
- 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
- 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
- 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
- };
- /*------------------------------------------------
- uS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請使用匯編,大致延時(shí)
- 長度如下 T=tx2+5 uS
- ------------------------------------------------*/
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- /*------------------------------------------------
- mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
- unsigned char 是定義無符號字符變量,其值的范圍是
- 0~255 這里使用晶振12M,精確延時(shí)請使用匯編
- ------------------------------------------------*/
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時(shí)1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
- /*------------------------------------------------
- 節(jié)拍延時(shí)函數(shù)
- 各調(diào)1/4節(jié)拍時(shí)間:
- 調(diào)4/4 125ms
- 調(diào)2/4 250ms
- 調(diào)3/4 187ms
- ------------------------------------------------*/
- void delay(unsigned char t)
- {
- unsigned char i;
- for(i=0;i<t;i++)
- DelayMs(250);
- TR0=0;
- }
- /*------------------------------------------------
- 定時(shí)器0中斷
- ------------------------------------------------*/
- void TIM0_ISR() interrupt 1
- {
- TR0=0;
- SPK=!SPK;
- TH0=Timer0_H;
- TL0=Timer0_L;
- TR0=1;
- }
- /*------------------------------------------------
- 歌曲處理函數(shù)
- ------------------------------------------------*/
- void Song()
- {
- TH0=Timer0_H;//賦值定時(shí)器時(shí)間,決定頻率
- TL0=Timer0_L;
- TR0=1; //打開定時(shí)器
- delay(Time); //延時(shí)所需要的節(jié)拍
- }
- /*------------------------------------------------
- 主函數(shù)
- ------------------------------------------------*/
- void main(void)
- {
- unsigned char k,i;
- TMOD|=0x01; //置定時(shí)器0工作方式1
- EA=1; //打開全局中斷
- ET0=1; //打開定時(shí)0中斷
- while(1)
- {
- i=0;
- while(i<100)
- { //音樂數(shù)組長度 ,唱完從頭再來
- k=MUSIC[i]+7*MUSIC[i+1]-1;//去音符振蕩頻率所需數(shù)據(jù)
- Timer0_H=FREQH[k];
- Timer0_L=FREQL[k];
- Time=MUSIC[i+2]; //節(jié)拍時(shí)長
- i=i+3;
- Song();
- }
- }
- }
復(fù)制代碼 |