|
用8515做的音乐演奏程序
作者:佚名 /********************************************** 硬件电路使用AT90S8515的PC1口通过一个100UF/12V的电容接一个8欧姆的喇叭 单片机的晶振频率为4MHZ
音乐数据中的x:11-17表示低音区;21-27表示中音区;31-37表示高音区 音乐数据中的y:表示每个音阶延时的时间 **********************************************/ #i nclude <io8515.h> #i nclude <macros.h> #i nclude <math.h> #pragma interrupt_handler timer0:8 #pragma interrupt_handler timer1:5 #pragma data:code
flash unsigned char music_data[][2]= { /******************************************* 世上只有妈妈好音乐数据{x,y} x:对应音符音阶,0表示休止符 y:对应音符节拍 *******************************************/
{26,6} ,{25,2} ,{23,4} ,{25,2} ,{26,2} , {31,4} ,{26,2} ,{25,2} ,{26,4} ,{ 0,4} ,
{23,4} ,{25,2} ,{26,2}, {25,4} ,{23,2} , {22,2} ,{21,2} ,{16,2} ,{25,2} ,{23,2} ,{22,6} ,{ 0,4} ,
{22,4} ,{22,2} ,{23,2} ,{25,4}, {25,2} , {26,2} ,{23,4} ,{22,4}, {21,4} ,{ 0,4} ,
{25,6} ,{23,2} ,{22,2}, {21,2} ,{16,2} , {21,2} ,{15,4} ,{ 0,4} ,
{ 0,8}, //{ 0,0} //};
/******************************************* 梁山伯与祝英台音乐数据{x,y} x:对应音符音阶,0表示休止符 y:对应音符节拍 *******************************************/
{13,8} ,{15,6} ,{16,2} ,{21,6}, {22,2} ,{16,2} ,{21,2} ,{15,4}, {25,6} ,{31,2} ,{26,2} ,{25,2}, {23,2} ,{25,2} ,{22,8} ,{ 0,4},
{22,6}, {23,2} ,{17,4} ,{16,4}, {15,6}, {16,2} ,{21,4} ,{22,4}, {13,4}, {21,4} ,{16,2} ,{15,2}, {16,2}, {21,2} ,{15,8} ,{ 0,4},
{23,6} ,{25,2}, {17,4} ,{22,4}, {16,2} ,{21,2}, {15,4} ,{15,4}, {13,3} ,{15,1}, {13,4} ,{15,3}, {16,1} ,{17,2}, {22,2} ,{16,4},{ 0,2} ,
{15,2} ,{16,2} ,{21,6} ,{22,2}, {25,4} ,{23,4} ,{22,4} ,{23,2}, {22,2} ,{21,4} ,{16,2} ,{15,2}, {13,8} ,{21,8} ,{16,3} ,{21,1}, {16,2} ,{15,2} ,{13,2} ,{15,2}, {16,2} ,{21,2} ,{15,8}, { 0,4},
{ 0,8}, //{ 0,0} //};
/******************************************* 卡秋莎音乐数据{x,y} x:对应音符音阶,0表示休止符 y:对应音符节拍 *******************************************/
{16,6} ,{17,2} ,{21,6} ,{16,2}, {21,4} ,{17,2} ,{16,2} ,{17,4}, {13,4} ,{17,6} ,{21,2} ,{22,6}, {17,2} ,{22,4} ,{21,2} ,{17,2}, {16,8} ,{23,4} ,{26,4} ,{25,4}, {26,2} ,{25,2} ,{24,4} ,{23,2}, {22,2} ,{23,4} ,{16,4} ,{ 0,2},//休止符 {24,4} ,{22,2} ,{23,6} ,{21,2}, {17,2} ,{13,2} ,{21,2} ,{17,2}, {16,8} ,{23,4} ,{26,4} ,{25,4}, {26,2} ,{25,2} ,{24,4} ,{23,2}, {22,2} ,{23,4} ,{16,4} ,{ 0,2},//休止符 {24,4} ,{22,2}, {23,6} ,{21,2}, {17,2} ,{13,2}, {21,2} ,{17,2}, {16,8} , { 0,8} , { 0,0} };
#pragma data:data unsigned int delay=0; /******************************* MCU初始化 *******************************/ void music_init(void) { MCUCR=0x00; DDRC=0x01; TCCR1A=0x00; TCCR1B=0x09; TCCR0=0x03; TCNT0=0x19; TIMSK=0x42; } /************************************************** T0中断程序,产生音乐节拍 **************************************************/ void timer0(void) {
delay++; TCNT0=0xb0; } /************************************************** T1中断程序,根据SOUND函数输出一定频率的方波 **************************************************/ void timer1(void) { PORTC^=0x01; } /**************************************************
**************************************************/ sel(unsigned char a) { unsigned int x;
switch (a) { case 11:x=262;break; case 12:x=294;break; case 13:x=330;break; case 14:x=349;break; case 15:x=392;break; case 16:x=440;break; case 17:x=494;break;
case 21:x=523;break; case 22:x=578;break; case 23:x=659;break; case 24:x=698;break; case 25:x=784;break; case 26:x=880;break; case 27:x=988;break; case 31:x=1045;break; case 32:x=1175;break; case 33:x=1318;break; case 34:x=1397;break; case 35:x=1568;break; case 36:x=1760;break; case 37:x=1976;break; default:x=0;break;
} return(x); } /***************************************************** SOUND程序,输出频率为 x HZ的方波,延时 y MS x:100~20000 HZ, 0表示不发声 y:0~65536 MS *****************************************************/ void sound(unsigned int x,unsigned int y) { SEI(); delay=0; if (x!=0) { x=2000000/x; OCR1A=x; TCNT1=0x00; TIMSK|=0x40; while(delay<y) ; TIMSK&=0xbf; } else { TIMSK&=0xbf; while(delay<y) ; } CLI(); }
/******************************* 主程序 *******************************/ void main(void) { unsigned char i=0; music_init(); while(1) { while(music_data[i][1]!=0) { sound(sel(music_data[i][0]),music_data[i][1]*100); i++; } i=0; } }
|